como utilizar la clase csprite.h de SDL

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

como utilizar la clase csprite.h de SDL

Notapor barkuz » Vie May 11, 2007 1:18 pm

amigos:

busco ayuda estoy utilizando un tutorial para aprender a utilizar SDL.
pero tengo un problema con este ejemplo:
y me bota un error.
el tutorial que sigo es este:
http://www.losersjuegos.com.ar/referenc ... %20SDL.pdf
pagina 84

me podrian ayudar.
gracias

la clase csprite.h que utilizo es esta:

#ifndef CSPRITE_H_
#define CSPRITE_H_
#define TRUE 1
#define FALSE 0
// CFrame representa un frame independiente de un sprite.
class CFrame {
public:
SDL_Surface *img;
void load(char *path);
void unload();
};
// La clase CSprite está formada por un array de frames;
class CSprite {
private:
int posx,posy;
int estado;
int nframes;
int cont;
public:
CFrame *sprite;
CSprite(int nf);
CSprite();
void finalize();
void addframe(CFrame frame);
void selframe(int nf);
int frames() {return cont;}
void setx(int x) {posx=x;}
void sety(int y) {posy=y;}
void addx(int c) {posx+=c;}
void addy(int c) {posy+=c;}
int getx() {return posx;}
int gety() {return posy;}
int getw() {return sprite[estado].img->w;}
int geth() {return sprite[estado].img->h;}
void draw(SDL_Surface *superficie);
int colision(CSprite sp);
};
#endif /* CSPRITE_H_ */

el primer cpp es este el otro esta abajo que es el que me interesa:

#include <SDL.h>
#include <csprite.h>
// Sprite Class implementation
void CFrame::load(char *path) {
img=SDL_LoadBMP(path);
// Asignamos el color transparente al color rojo.
SDL_SetColorKey(img,SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(img->format,255,0,0));
img=SDL_DisplayFormat(img);
}
void CFrame::unload(){
SDL_FreeSurface(img);
}
CSprite::CSprite(int nf) {
sprite=new CFrame[nf];
nframes=nf;
cont=0;
}
CSprite::CSprite() {
int nf=1;
sprite=new CFrame[nf];
nframes=nf;
cont=0;
}
void CSprite::finalize() {
int i;
for (i=0 ; i<=nframes-1 ; i++)
sprite[i].unload();
}
void CSprite::addframe(CFrame frame) {
if (cont<nframes) {
sprite[cont]=frame;
cont++;
}
}
void CSprite::selframe(int nf) {
if (nf<=nframes) {
estado=nf;
}
}
void CSprite::draw(SDL_Surface *superficie) {
SDL_Rect dest;
dest.x=posx;
dest.y=posy;
SDL_BlitSurface(sprite[estado].img,NULL,superficie,&dest);
}
int CSprite::colision(CSprite sp) {
int w1,h1,w2,h2,x1,y1,x2,y2;
w1=getw(); // ancho del sprite1
h1=geth(); // altura del sprite1
w2=sp.getw(); // ancho del sprite2
h2=sp.geth(); // alto del sprite2
x1=getx(); // pos. X del sprite1
y1=gety(); // pos. Y del sprite1
x2=sp.getx(); // pos. X del sprite2
y2=sp.gety(); // pos. Y del sprite2
if (((x1+w1)>x2)&&((y1+h1)>y2)&&((x2+w2)>x1)&&((y2+h2)>y1)) {
return TRUE;
} else {
return FALSE;
}
}

el segundo cpp es este:
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <csprite.h>

SDL_Surface *screen;
CFrame fnave;
CFrame fmalo;
CSprite nave(1);
CSprite malo(1);
SDL_Rect rectangulo;
SDL_Joystick *joystick;
int joyx, joyy;
int done=0;
// estructura que contiene la información
// de nuestro avión
struct minave {
int x,y;
} jugador;
// Estructura que contiene información
// del avión enemigo
struct naveenemiga {
int x,y;
} enemigo;
// Dibuja los esprites en la pantalla
void DrawScene(SDL_Surface *screen) {
// borramos el avión dibujado
// en el frame anterior
rectangulo.x=nave.getx();
rectangulo.y=nave.gety();
rectangulo.w=nave.getw();
rectangulo.h=nave.geth();
SDL_FillRect(screen,&rectangulo,SDL_MapRGB(screen->format,0,0,0));
// dibuja avión
nave.setx(jugador.x);
nave.sety(jugador.y);
nave.draw(screen);
// Dibuja enemigo
malo.setx(enemigo.x);
malo.sety(enemigo.y);
malo.draw(screen);
// ¿ha colisionado con la nave?
if (malo.colision(nave) == TRUE) {
done=1;
}
// Mostramos todo el frame
SDL_Flip(screen);
}
// Inicializamos estados
void inicializa() {
jugador.x=300;
jugador.y=300;
enemigo.x=100;
enemigo.y=100;
}
void finaliza() {
// finalizamos los sprites
nave.finalize();
malo.finalize();
// cerramos el joystick
if (SDL_JoystickOpened(0)) {
SDL_JoystickClose(joystick);
}
}
// Preparamos los esprites
int InitSprites() {
fnave.load("minave.bmp");
nave.addframe(fnave);
fmalo.load("nave.bmp");
malo.addframe(fmalo);
return 0;
}
int main(int argc, char *argv[]) {
SDL_Event event;
Uint8 *keys;
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0) {
printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
return 1;
}
screen = SDL_SetVideoMode(640,480,24,SDL_HWSURFACE);
if (screen == NULL) {
printf("No se puede inicializar el modo gráfico: \n",SDL_GetError());
return 1;
}
atexit(SDL_Quit);
inicializa();
InitSprites();
while (done == 0) {
// dibujamos el frame
DrawScene(screen);
// consultamos el estado del teclado
keys=SDL_GetKeyState(NULL);
// consultamos el estado del joystick
SDL_JoystickUpdate();
joyx = SDL_JoystickGetAxis(joystick, 0);
joyy = SDL_JoystickGetAxis(joystick, 1);
if ((keys[SDLK_UP] || joyy < -10) && (jugador.y > 0)) {jugador.y=jugador.y-(5);}
if ((keys[SDLK_DOWN] || joyy > 10) && (jugador.y < 460)) {jugador.y=jugador.y+(5);}
if ((keys[SDLK_LEFT] || joyx < -10) && (jugador.x > 0)) {jugador.x=jugador.x-(5);}
if ((keys[SDLK_RIGHT] || joyx > 10) && (jugador.x < 620)) {jugador.x=jugador.x+(5);}
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {done=1;}
if (event.type == SDL_KEYDOWN || event.type == SDL_JOYBUTTONDOWN) {
if (event.key.keysym.sym == SDLK_ESCAPE) {
done=1;
}
}
}
}
finaliza();
return 0;
}
Marcos Gonzalez
barkuz
 
Mensajes: 1
Registrado: Dom May 06, 2007 12:37 am
Ubicación: colombia cartagena

Notapor rcaf » Vie May 11, 2007 8:03 pm

Hola:

Podrías colocar el código dentro del tag code, para que se vea más claro y entendible el código fuente (ojala identado).

[ code ]
// mi codigo
[ /code ]

(sin espacios entre [ ])

Pero ¿cuál es el error que arroja exactamente el compilador y en que línea, o que sección del código?

S2.
Roberto Albornoz Figueroa
Mi Blog
Wiki
Avatar de Usuario
rcaf
 
Mensajes: 71
Registrado: Jue Ago 10, 2006 4:35 am
Ubicación: Concepción, Octava Región. Chile


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron