All pastes #244804 Raw Edit

Untitled

public text v1 · immutable
#244804 ·published 2006-11-10 05:27 UTC
rendered paste body
#include <cstdlib>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <string.h>
#include <stdarg.h>

SDL_Surface *screen, *bg;

typedef enum { standing=0,jumping,falling,crouching } action;

struct acdc {
	action state;
	bool isleft;
};

class character
{
	private:
		SDL_Surface **images, *cur;		//The images to use for the character
		int num, up, x, y;			//Number of images, if update, x and y coords
		action state;
		bool left;
		struct acdc *table;
	public:
		character ();				//shouldn't be used
		character (int,int,int, ...);		//pretty freaking important
		SDL_Surface *find_current();
		void moveRight (int);
		void moveLeft (int);
		void crouch ();
		//void jump ();
		void update ();
};

bool okay (int x1, int y1)
{
	if (x1 > 0 && x1 < bg->w && y1 > 0 && y1 < bg->h)
		return true;
	return false;
}

character::character ()
{
	images = 0;
	num = 0;
	up = 0;
	table = 0;
	x = 0;
	y = 0;
	left = false;
	state = standing;
}

character::character (int x1, int y1, int num1, ...)
{
	va_list ags;
	va_start (ags, num1);
	num=num1;
	if (okay (x1,y1))
	{ x=x1; y=y1;}
	else
	{ x =0; y =0;}
	images = (SDL_Surface**) malloc (sizeof (SDL_Surface*)*num);
	table = (struct acdc*) malloc (sizeof (struct acdc)*num);
	for (int a = 0; a < num; ++a)
	{
		images [a] = va_arg (ags, SDL_Surface*);
		SDL_SetColorKey(images[a], SDL_SRCCOLORKEY,SDL_MapRGB(images[a]->format, 255, 0, 255));
		table [a].state = (action) va_arg (ags, int);
		table [a].isleft = va_arg (ags, int);
	}
	va_end (ags);
	up = 1;
	state = standing;
	left = true;
}

SDL_Surface *character::find_current()
{
	for (int a=0; a < num; ++a)
		if (table[a].state == state && table[a].isleft == left)
			return images[a];
	return 0;
}

void character::moveRight (int a)
{
	if (okay (x+a, y))
		if (x+a != x)
		{
			left = false;
			if (find_current())
			{
				SDL_Rect rmt, rmf;
				rmt.x = rmf.y = x;
				rmt.y = rmf.y = y;
				rmf.w = a;
				rmf.h = find_current()->h;
				SDL_BlitSurface (bg, &rmf, screen, &rmt);
				x+=a;
				up=1;
			}
		}
}

void character::moveLeft (int a)
{
	if (okay (x-a, y))
		if (x-a != x)
		{
			left = true;
			if (find_current())
			{
				SDL_Rect rmt, rmf;
				rmt.x = rmf.y = x;
				rmt.y = rmf.y = y;
				rmf.w = a;
				rmf.h = find_current()->h;
				SDL_BlitSurface (bg, &rmf, screen, &rmt);
				x-=a;
				up=1;
			}
		}
}

void character::crouch ()
{
	if (state == standing)
		up=1;
}

void character::update ()
{
	if (up)
	{
		SDL_Rect fm; fm.x = x; fm.y = y;
		SDL_BlitSurface (find_current(), 0, screen, &fm);
		SDL_Flip (screen);			//this really shouldn't be called now
		up = 0;
		if (state==crouching)
			state=standing;
	}
}

main ()
{
	if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_AUDIO)<0)
		return 1;
	atexit (SDL_Quit);
	if (!(screen = SDL_SetVideoMode (800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF)))
		return 1;
	SDL_Surface *cham = IMG_Load ("Stand-right.png");
	bg = IMG_Load ("sky.png");
	SDL_SetColorKey(cham, SDL_SRCCOLORKEY,SDL_MapRGB(cham->format, 255, 0, 255));
	SDL_Rect rft;
	rft.x = rft.y = 0;
	SDL_BlitSurface (bg,0,screen,&rft);
	rft.x = bg->w/2;
	rft.y = bg->h/2;
	SDL_BlitSurface (cham,0,screen,&rft);
	SDL_Flip (screen);
//	character mn (bg->w/2, bg->h/2, 6, "Stand-right.png", standing, false, "Stand-left.png", standing, true,
//		"Jump-left.png", jumping, true, "Jump-right.png", jumping, false, "Crouch-left.png", crouching, true,
//		"Crouch-right.png", crouching, false);
	int done=0;
//	mn.update();
	SDL_Event event;
	while (!done)
	{
		while (SDL_PollEvent (&event))
			if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)) done = 1;
		SDL_Flip (screen);
	}
	return 0;
}