All pastes #244802 Raw Edit

Unnamed

public c v1 · immutable
#244802 ·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;}