
y lo que estoy intentando hacer es moverla, yo se que lo que deberia hacer es intentar dividir a la imagen en funcion de la cantidad de filas y columnas que tiene, pero eso a donde me conviene cargarlo, en una matriz o array como estube viendo que algunos hacen, o simplemente ir controlandolo mediante una funcion, pero eso me trae otro problema que es que, no todas las imagenes tienen el mismo tamaño, por lo que estoy bastante confundido,
- Código: Seleccionar todo
#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif
#include<SDL_image.h>
#define anchoSprite 82;
#define alturaSprite 76;
#include <stdio.h>
class Frame
{
public:
SDL_Surface* img;
void cargaImagen(char* archivo)
{
SDL_Surface* temporal = NULL;
img = NULL;
if(temporal == NULL)
{
temporal = IMG_Load(archivo);
img = SDL_DisplayFormat(temporal);
SDL_FreeSurface(temporal);
}
}
void eliminarImagen()
{
SDL_FreeSurface(img);
}
};
class Personaje
{
private:
int x;
int y;
int altura;
int ancho;
Frame miFrame;
public:
Personaje(int x,int y,char* archivo)
{
miFrame.cargaImagen(archivo);
setX(x);
setY(y);
}
int getAltura()
{
return miFrame.img->h;
}
int getAncho()
{
return miFrame.img->w;
}
int getY()
{
return y;
}
void setY(int y)
{
this->y = y;
}
int getX()
{
return x;
}
void setX(int x)
{
this->x = x;
}
void borrarFrame(){miFrame.eliminarImagen();}
void dibujarImagen(SDL_Surface* superficieDestino,int x,int y)//con sy y sx, como variables del sprite de origen
{
SDL_Rect rectanguloRecortado;
SDL_Rect rectanguloDestino;
rectanguloRecortado.x = x;
rectanguloRecortado.y = y;
rectanguloRecortado.h = y+alturaSprite;
rectanguloRecortado.w = anchoSprite;
rectanguloDestino.x = getX();
rectanguloDestino.y = getY();
SDL_BlitSurface(miFrame.img, &rectanguloRecortado, superficieDestino, &rectanguloDestino);
}
};
void limpieza(SDL_Surface* superficieLimpiar)
{
SDL_FreeSurface(superficieLimpiar);
SDL_Quit();
}
SDL_Surface* inicializaSdl(SDL_Surface* Surf_Display)
{
//INICIO TODO, SI ESTA MAL DEVUELVE ERROR
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
return NULL;
}
//ACA ES DONDE CREO LA PANTALLA Y SE LA ASIGNO A SDL_DISPLAY
if((Surf_Display = SDL_SetVideoMode(1000,480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF)) == NULL)
{
return NULL;
}
return Surf_Display;
}
SDL_Surface* borrarPantalla(SDL_Surface* pantallaModificada, Personaje miPersonaje)
{
SDL_Rect rectangulo;
rectangulo.x = miPersonaje.getX();
rectangulo.y = miPersonaje.getY();
rectangulo.h = miPersonaje.getAltura();
rectangulo.w = miPersonaje.getAncho();
SDL_FillRect(pantallaModificada,&rectangulo,SDL_MapRGB(pantallaModificada->format,0,0,0));
return pantallaModificada;
}
int gameLoop()
{
bool ejecuta = true;
SDL_Surface* pantalla;
SDL_Event evento;
pantalla = NULL;
SDL_Surface* imagen;
SDL_Rect rectangulo;
Uint8 *key;
if((pantalla=inicializaSdl(pantalla)) == NULL)
{
return -1;
}
Personaje miPersonaje(50,50,"nave.png");
while(ejecuta)
{
miPersonaje.dibujarImagen(pantalla,82,0);
SDL_PumpEvents();
key = SDL_GetKeyState(NULL);
if(key[SDLK_UP])
{
int aRecortar = alturaSprite;
pantalla = borrarPantalla(pantalla,miPersonaje);
miPersonaje.setY(miPersonaje.getY()-1);
miPersonaje.dibujarImagen(pantalla,82,aRecortar);
}
if(key[SDLK_DOWN])
{
pantalla = borrarPantalla(pantalla,miPersonaje);
miPersonaje.setY(miPersonaje.getY()+1);
miPersonaje.dibujarImagen(pantalla,82,0);
}
if(key[SDLK_RIGHT])
{
int aRecortar = 82 + anchoSprite;
pantalla = borrarPantalla(pantalla,miPersonaje);
miPersonaje.setX(miPersonaje.getX()+1);
miPersonaje.dibujarImagen(pantalla,aRecortar,0);
}
if(key[SDLK_LEFT])
{
int aRecortar = 82 - anchoSprite;
pantalla = borrarPantalla(pantalla,miPersonaje);
miPersonaje.setX(miPersonaje.getX()-1);
miPersonaje.dibujarImagen(pantalla,aRecortar,0);
}
SDL_Flip(pantalla);
}
miPersonaje.borrarFrame();
limpieza(pantalla);
return 0;
}
int main ( int argc, char** argv )
{
return gameLoop();
}
este es el codigo de mi programa, y que minimamente me permite poder moverme entre los sprites de la primer fila, asi que si alguno desea aplicarle algun cambio, sientase libre de hacerlo, realmente esta es la parte que mas me complica de todo esto junto con todo lo que es el tiempo de ejecucion y demas cosas