Wenas, al fin, termine mi juego, pero aun no puedo dedicarselo a nadie, ya que no funcion :cry: :cry:
Bueno estaba terminando el programa arreglando los fallitos (en un principio me dio 37 y 2 warning) y buen los arregle.....y ejecute. nada ser abria y se iba en un segundo sin mostrar nada. El caso es que me acorde que tenia que ponerle la carpeta de las imagenes en el fichero "debug" que es donde esta el ejecutable. pero lo he puesto y sigue igual.
Voy a poner el codigo entero, porque nose lo que pasa ni tengo idea alguna de que parte del programa puede ser. Y bueno asi los novatos como yo aprevechan :shock:
MUCHAS GRACIAS
Bueno estaba terminando el programa arreglando los fallitos (en un principio me dio 37 y 2 warning) y buen los arregle.....y ejecute. nada ser abria y se iba en un segundo sin mostrar nada. El caso es que me acorde que tenia que ponerle la carpeta de las imagenes en el fichero "debug" que es donde esta el ejecutable. pero lo he puesto y sigue igual.
Voy a poner el codigo entero, porque nose lo que pasa ni tengo idea alguna de que parte del programa puede ser. Y bueno asi los novatos como yo aprevechan :shock:
MUCHAS GRACIAS
Código [Seleccionar]
/***************
_AntiPlanes 1.0
_Make by Juan Manuel Amador Olivares &
***************/
// Librerias necesarias para poder llamar las funciones del juego
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <time.h>
/****
Constantes
****/
#define WIDTH 400 // Anchura del mapa
#define HEIGHT 535 // Altura del mapa
#define MOVCANON 2 // Movimiento del cañon antiereo
#define CANONCICLO 3 // Numero de ciclos que tiene que pasar para que el cañon pueda moverse
#define MAXPLANES 150 // Numero maximo de aviones enemigos
#define MAXEXP 50 // Numero maximo de explosiones
#define MAXSHOT 250 // Numero maximo de disparos del cañon antiaereo
#define UPPOS 10 // Numero de ciclos que tiene que pasar para que se actualice la posicion de los aviones
#define MOVPLANE 5 // Movimiento de los aviones
#define PLANEBYCICLO 6 // Numero de aviones que son creados por ciclo
#define NEWPLANE 5 // Numero de ciclos que tiene que pasar para que se creen mas aviones enemigos
#define UPEXP 5 // Numero de ciclos que tiene que pasar para que se actualice el frame de las explosiones
#define CICLOSHOT 15 // Numero de ciclos que tiene que pasar para que se puedan crear nuevos disparos
#define UPPOSSHOT 10 // Numero de ciclos que tiene que pasar para que se actualice la posicion de los aviones
#define MOVSHOT 5 // Movimiento de los aviones
/****
Estructuras de los diferentes elementos del juego
****/
// Estructura del cañon antiaereo
struct canonstruct
{
SDL_Rect atrib;
} canon;
// Estrcutura de los aviones enemigos
struct enemyplanes
{
SDL_Rect atrib;
int estado;
} planes[MAXPLANES];
// Estructura de las explosiones
struct explosions
{
SDL_Rect atrib;
int frame;
int LastUpCiclo;
int estado;
} exp[MAXEXP];
// Estructura de los disparos
struct antishot
{
SDL_Rect atrib;
int estado;
} shot[MAXSHOT];
/****
Declaracion de superficies y variables
****/
SDL_Rect coordscreen;
SDL_Surface *screen; // Superficie de la pantalla. Con esta superficie se nicializara el modo de video y es la que se renderizara
SDL_Surface *background; // Superficie de el mapa del fondo
SDL_Surface *canonsurp; // Superficie de el cañon antiaereo
SDL_Surface *plane; // Superficie de el avion enemigo
SDL_Surface *shotsurp; // Superficie de el disparo del cañon
SDL_Surface *expsurp[5]; // Superficie de las explosiones de los enemigos
int quit = 0; // Variable usada para el controlar el bucle del juego (Game Loop)
int i = 0; // Variable usada para los bucles del juego
int v = 0; // Variable usada para los bucles del juego
int n = 0; // Variable usada para los bucles del juego
int b = 0; // Variable usada para los bucles del juego
int ciclo = 0; // Variable que contiene el numero de ciclos que ha dado el juego
int ciclouppos = 0; // Variable que guarda el numero de ciclos que llevaba el juego la ultima vez que actualizo la posicion de los aviones
int ciclocreate = 0; // Variable que guarda el numero de ciclos que lleva el juego desde la ultima vez que creo nuevos aviones
int canonppos = 0; // Variable que guarda el numero de ciclos que lleva el juego desde la ultima vez que se movio el cañon
int shotuppos = 0; // Variable que guarda el numero de ciclos que lleva el juego desde la ultima vez que se creo un disparo
int shotpos = 0; // Variable que guarda el numero de ciclos que lleva el juego desde la ultima vez que se actualizo el movimiento de los disparos
Uint8 *keyboard; // Variable utilizada para guardar el estado del teclado
int ini_milisegundos; // Variable utilizada para el control de tiempo de renderizado
int fin_milisegundos; // Variable utilizada para el control de tiempo de renderizado
int frametime; // Variable utilizada para el control de tiempo de renderizado
/***
Funciones de control de tiempo por frame
***/
void resetTimeBase()
{
ini_milisegundos=SDL_GetTicks();
}
int CurrentTime()
{
fin_milisegundos=SDL_GetTicks();
return fin_milisegundos-ini_milisegundos;
}
/****************
Funcion principal
****************/
int main (int argc, char *argv[])
{
atexit (SDL_Quit);
//Iniciar SDL
if (SDL_Init (SDL_INIT_VIDEO) < 0)
{
printf ("No se pudo iniciar SDL: %s\n", SDL_GetError());
exit(1);
}
//Activamos el modo de video
screen = SDL_SetVideoMode (WIDTH,HEIGHT,24, SDL_HWSURFACE);
if (screen = NULL)
{
printf ("No se puede inicializar el modo gráfico: %s\n", SDL_GetError ());
exit (1);
}
/****
Cargamos los graficos del juego en las superficies declaradas
****/
// Imagen de fondo
background = SDL_LoadBMP("background\\background.bmp");
if (background == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
// Cañon antiaereo
canonsurp = SDL_LoadBMP("canon\\canon.bmp");
if (canonsurp == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(canonsurp,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(canonsurp->format,0,0,0)); // Determinamos la transparencia de la superficie shotsurp como 0,0,0
// Aviones enemigos
plane = SDL_LoadBMP("enemyplanes\\plane.bmp");
if (plane == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(plane,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(plane->format,0,0,0)); // Determinamos la transparencia de la superficie shotsurp como 0,0,0
// Disparo del cañon antiaereo
shotsurp = SDL_LoadBMP("canon\\shot\\shot.bmp");
if (shotsurp == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(shotsurp,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(shotsurp->format,255,255,255)); // Determinamos la transparencia de la superficie shotsurp como 255,255,255
// 1º imagen de la explosion
expsurp[1] = SDL_LoadBMP("explosion\\exp1.bmp");
if (expsurp[1] == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(expsurp[1],SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(expsurp[1]->format,0,0,0)); // Determinamos la transparencia de la superficie shotsurp como 0,0,0
// 2º imagen de la explosion
expsurp[2] = SDL_LoadBMP("explosion\\exp2.bmp");
if (expsurp[2] == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(expsurp[2],SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(expsurp[2]->format,0,0,0)); // Determinamos la transparencia de la superficie shotsurp como 0,0,0
// 3º imagen de la explosion
expsurp[3] = SDL_LoadBMP("explosion\\exp3.bmp");
if (expsurp[3] == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(expsurp[3],SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(expsurp[3]->format,0,0,0)); // Determinamos la transparencia de la superficie shotsurp como 0,0,0
// 4º imagen de la explosion
expsurp[4] = SDL_LoadBMP("explosion\\exp4.bmp");
if (expsurp[4] == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(expsurp[4],SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(expsurp[4]->format,0,0,0)); // Determinamos la transparencia de la superficie shotsurp como 0,0,0
// 5º imagen de la explosion
expsurp[5] = SDL_LoadBMP("explosion\\exp5.bmp");
if (expsurp[5] == NULL)
{
printf ("No se pudo cargar el grafico: %s\n", SDL_GetError());
exit(1);
}
SDL_SetColorKey(expsurp[5],SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(expsurp[5]->format,0,0,0)); // Determinamos la transparencia de la superficie shotsurp como 0,0,0
srand (time(NULL)); // Para la semilla de rand()
/****
Inicializacion de variables del juego
****/
// Iniciamos las variables de la pantalla
coordscreen.w = screen->w;
coordscreen.h = screen->h;
coordscreen.x = 0;
coordscreen.y = 0;
// Iniciamos las varibles del cañon
canon.atrib.w = canonsurp->w;
canon.atrib.h = canonsurp->h;
canon.atrib.x = WIDTH/2-canon.atrib.w/2;
canon.atrib.y = HEIGHT-canon.atrib.h;
// Iniciamos las variables de los aviones enemigos
for (i=1; i<=MAXPLANES; i++)
{
planes[i].atrib.w = plane->w;
planes[i].atrib.h = plane->h;
planes[i].atrib.x = 0-planes[i].atrib.w;
planes[i].atrib.y = 0;
planes[i].estado = 0;
}
// Iniciamos las variables de las explosiones
for (i=1; i<=MAXEXP; i++)
{
exp[i].atrib.w = expsurp[1]->w;
exp[i].atrib.h = expsurp[1]->h;
exp[i].atrib.x = 0;
exp[i].atrib.y = 0;
exp[i].frame = 0;
exp[i].LastUpCiclo = 0;
exp[i].estado = 0;
}
// Iniciamos las variables de los disparos del cañon antiaereo
for (i=1; i<=MAXSHOT; i++)
{
shot[i].atrib.w = shotsurp->w;
shot[i].atrib.h = shotsurp->h;
shot[i].atrib.x = 0;
shot[i].atrib.y = canon.atrib.y-shot[i].atrib.h;
shot[i].estado = 0;
}
/********
Game Loop
********/
while (!quit)
{
/***************
Entrada de datos
***************/
SDL_PumpEvents(); // Obtiene mapa del estado actual del teclado
keyboard=SDL_GetKeyState(0);
if(keyboard[SDLK_LEFT]) // Flecha izquierda
{
if (ciclo == canonppos + CANONCICLO)
{
canonppos = ciclo;
canon.atrib.x -= MOVCANON;
}
}
if(keyboard[SDLK_RIGHT]) // Flecha derecha
{
if (ciclo == canonppos + CANONCICLO)
{
canonppos = ciclo;
canon.atrib.x += MOVCANON;
}
}
if(keyboard[SDLK_RCTRL]) // Tecla CTRL
{
if (ciclo == canonppos + CICLOSHOT)
{
shotuppos = ciclo;
while (v == 0)
{
v++;
if (shot[v].estado == 0)
{
shot[v].estado = 1;
shot[v].atrib.x = canon.atrib.x;
v = 1;
}
}
v = 0;
}
}
if(keyboard[SDLK_ESCAPE]) {quit=1;} // Tecla ESC
// Se actualiza la posicion de los disparos
if (ciclo == shotpos + UPPOSSHOT)
{
shotpos = ciclo;
for (i=1; i<=MAXSHOT; i++)
{
if (shot[i].estado == 1)
{
shot[i].atrib.y -= MOVSHOT;
}
}
}
// Se comprueba y elimina los disparos que han salido de la pantalla
for (i=1; i<=MAXSHOT; i++)
{
if (shot[i].estado == 1)
{
if (shot[i].atrib.y + shot[i].atrib.h == 0)
{
shot[i].estado = 0;
}
}
}
// Se actualiza la posicion de los aviones enemigos
if (ciclo == ciclouppos + UPPOS) // Si han pasado los ciclos dados por UPPOS
{
ciclouppos = ciclo;
for (i=1; i<=MAXPLANES; i++)
{
if (planes[i].estado == 1)
{
planes[i].atrib.y += MOVPLANE;
}
}
}
// Se comprueba y elimina los aviones que han salido de la pantalla
for (i=1; i<=MAXPLANES; i++)
{
if (planes[i].estado == 1)
{
if (planes[i].atrib.y + planes[i].atrib.h == HEIGHT)
{
planes[i].estado = 0;
}
}
}
// Se crean mas aviones enemigos
if (ciclo == ciclocreate + NEWPLANE)
{
ciclocreate = ciclo;
for (i=1; i<=PLANEBYCICLO; i++)
{
while (v == 0)
{
n++;
if (planes[n].estado == 0)
{
planes[n].atrib.x = 1 + rand() % WIDTH; /*numero aleatorio*/
planes[n].estado = 1;
v = 1;
}
}
v = 0; // Para que en cada ciclo se repita el bucle
}
}
// Aqui va la creacion de explosiones, el cual va dentro de deteccion de colisiones
for (i=1; 1<=MAXPLANES; i++)
{
if (planes[i].estado == 1)
{
for (n=1; n<=MAXSHOT; n++)
{
if (shot[n].estado == 1)
{
if ( ((planes[i].atrib.x + planes[i].atrib.w) > shot[n].atrib.x) && ((planes[i].atrib.y + planes[i].atrib.h) > shot[n].atrib.y) && ((shot[n].atrib.x + shot[n].atrib.w) > planes[i].atrib.x) && ((shot[n].atrib.y + shot[n].atrib.w) > planes[i].atrib.y) )
{
// Crea explosion
while (v == 0)
{
b++;
if (exp[b].estado == 0)
{
exp[b].atrib.x = shot[n].atrib.x + shot[n].atrib.w/2;
exp[b].atrib.y = shot[n].atrib.y;
exp[b].estado = 1;
v = 1;
}
v = 0;
}
}
}
}
}
}
// Se actualizan las explosiones
for (i=1; i<=MAXEXP; i++)
{
if (exp[i].estado == 1)
{
if (exp[i].LastUpCiclo == UPEXP)
{
exp[i].frame++;
exp[i].LastUpCiclo = 0;
}
else
{
exp[i].LastUpCiclo++;
}
if (exp[i].frame == 6)
{
exp[i].frame = 0;
exp[i].estado = 0;
}
}
}
/***
Pegado de superficies
***/
// Se pega la superficie de la imagen de fondo
SDL_BlitSurface(background, NULL, screen, &coordscreen);
// Se pegan los aviones
for (i = 1; i<=MAXPLANES; i++)
{
if (planes[i].estado == 1)
{
SDL_BlitSurface(plane, NULL, screen, &planes[i].atrib);
}
}
// Se pegan los disparos
for (i=1; i<=MAXSHOT; i++)
{
if (shot[i].estado == 1)
{
SDL_BlitSurface(shotsurp, NULL, screen, &shot[i].atrib);
}
}
// Se pega la imagen del cañon antiaereo
SDL_BlitSurface(canonsurp, NULL, screen, &canon.atrib);
// Se pegan las explosiones
for (i=1; i<=MAXEXP; i++)
{
if (exp[i].estado == 1)
{
switch (exp[i].frame) // Segun el frame se renderizan imagenes diferentes
{
case 1:
SDL_BlitSurface(expsurp[1], NULL, screen, &exp[i].atrib);
break;
case 2:
SDL_BlitSurface(expsurp[2], NULL, screen, &exp[i].atrib);
break;
case 3:
SDL_BlitSurface(expsurp[3], NULL, screen, &exp[i].atrib);
break;
case 4:
SDL_BlitSurface(expsurp[4], NULL, screen, &exp[i].atrib);
break;
case 5:
SDL_BlitSurface(expsurp[5], NULL, screen, &exp[i].atrib);
break;
}
}
}
SDL_Flip(screen);
ciclo++; // Se suma un ciclo
// Si NO han pasado 30 milisegundos desde la renderizacion del ultimo frame, no se sigue renderizando
do
{
frametime=CurrentTime();
} while (frametime<30);
} // Aqui termina el bucle del juego
// Se liberan las superficies
SDL_FreeSurface(background);
SDL_FreeSurface(canonsurp);
SDL_FreeSurface(plane);
SDL_FreeSurface(shotsurp);
SDL_FreeSurface(expsurp[1]);
SDL_FreeSurface(expsurp[2]);
SDL_FreeSurface(expsurp[3]);
SDL_FreeSurface(expsurp[4]);
SDL_FreeSurface(expsurp[5]);
return 0;
}