Mi primer juego: Disparar a matar a la cara hasta que llore

Mi primer juego: Disparar a matar a la cara hasta que llore

Notapor migueleitorone » Vie Feb 18, 2011 12:38 am

Buenassss, bueno, por fin y tras mucho esfuerzo he terminado mi primer juego con SDL. Antes de nada dar las gracias a la comunidad de losersJuegos ya que sin vosotros todavia estaria aprendiendo lo que es una variable xddd. Enserio muchas gracias os debo mucho. Bueno, sin mas, ahi va:

Disparar a matar a la cara hasta que llore (el nombre me lo he currado menos que el juego xd):

La mecanica del juego es sencilla, tienes 11 balas y tienes que matar al muñequito que no para de moverse.
Si lo matas, vuelves a tener 11 balas para matar a otro enemigo mas rapido.
Si pierdes las 11 balas pierdes.

Imagenes:
Imagen

Imagen

Imagen

Descarga:
http://www.megaupload.com/?d=M8PFOMF0

Codigo:
Código: Seleccionar todo
#include "SDL.h"
#include "SDL_image.h"
#include "SDL_mixer.h"
#include "SDL_ttf.h"
#include <conio.h>
#include <time.h>
#include <stdlib.h>

void comprovar_surface(SDL_Surface * superficie);
void actualizar_imagen_balas(int balas, SDL_Surface * screen, SDL_Surface * bala);

class enemigo
{
public:
   void mover(int velocidad, int * direccion);
   int hp;
   int caraActual;
   int velocidad;
   SDL_Rect rect;
   SDL_Surface * cara[4];
   SDL_Surface * caraLimpia[4];
};


int main(int arcg, char *argv[])
{
   srand(time(NULL)); //Funcion para hacer que los numeros sean totalmente aleatoriios

///////////////
//   INICIANDO
///////////////
   if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0) ///INICIAR SDL VIDEO Y AUDIO COMPROBANDO ERRORES
   {
      printf("Error SDL_Init: %s", SDL_GetError());
      getch();
      exit(1);
   }
   atexit(SDL_Quit); //Cuando acabe el programa, se cierra SDL
   SDL_Surface * screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE); //Creo la que sera la pantalla del juego
      comprovar_surface(screen);

   enemigo enemigo1; //creo un enemigo

   ///TTF
   TTF_Init();
   TTF_Font * fuenteOtra = TTF_OpenFont("times.ttf", 50);
   SDL_Color colorFuente = {0,0,0};
   SDL_Surface * otraVez;
   otraVez = TTF_RenderText_Blended(fuenteOtra, "Otra Vez?", colorFuente);

   TTF_Font * fuentePuntos = TTF_OpenFont("times.ttf", 20);
   SDL_Surface * puntosLetras = TTF_RenderText_Blended(fuentePuntos, "Puntos: ", colorFuente);
   SDL_Surface * puntosNumeros = TTF_RenderText_Blended(fuentePuntos, "10 ", colorFuente);

///////////////
//   SONIDOS
///////////////
   Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 4096); // Abrir audio
   Mix_Chunk * sonidoBala = Mix_LoadWAV("disparo.wav"); //Cargar sonidos
   Mix_Chunk * sonidoFondo = Mix_LoadWAV("fondo.wav");
   Mix_Chunk * wow = Mix_LoadWAV("wow.wav");
   Mix_Chunk * doh = Mix_LoadWAV("doh.wav");

   
///////////////
//   CARGAR IMAGENES
//////////////
   SDL_Surface * fondo = IMG_Load("fondo.png");
      comprovar_surface(fondo);
   SDL_Surface * mirilla = IMG_Load("mirilla.png");
      comprovar_surface(mirilla);
   SDL_Surface * balazo = IMG_Load("balazo.png");
      comprovar_surface(balazo);
   SDL_Surface * bala = IMG_Load("bala.png");
      comprovar_surface(bala);
   SDL_Surface * gameover = IMG_Load("gameover1.png");
      comprovar_surface(gameover);
   
      //Caras del enemigo
   enemigo1.cara[0] = IMG_Load("feliz.png");
      comprovar_surface(enemigo1.cara[0]);
   enemigo1.cara[1] = IMG_Load("triste.png");
      comprovar_surface(enemigo1.cara[1]);
   enemigo1.cara[2] = IMG_Load("muytriste.png");
      comprovar_surface(enemigo1.cara[2]);
   enemigo1.cara[3] = IMG_Load("llorando.png");
      comprovar_surface(enemigo1.cara[3]);

      //Caras limpias para renovarlas cuando se pase de puntos
   enemigo1.caraLimpia[0] = IMG_Load("feliz.png");
      comprovar_surface(enemigo1.caraLimpia[0]);
   enemigo1.caraLimpia[1] = IMG_Load("triste.png");
      comprovar_surface(enemigo1.caraLimpia[1]);
   enemigo1.caraLimpia[2] = IMG_Load("muytriste.png");
      comprovar_surface(enemigo1.caraLimpia[2]);
   enemigo1.caraLimpia[3] = IMG_Load("llorando.png");
      comprovar_surface(enemigo1.caraLimpia[3]);
      
      //Botones
   SDL_Surface * botonSi = IMG_Load("botonsi.png");
      comprovar_surface(botonSi);
   SDL_Surface * botonNo = IMG_Load("botonno.png");
      comprovar_surface(botonNo);

      //Efectos especiales
   SDL_Surface * enemigoBlanco = IMG_Load("blanco.png");
      comprovar_surface(enemigoBlanco);
   SDL_Surface * chorrito = IMG_Load("chorrito1.png");
      comprovar_surface(chorrito);



///////////////
//   VARIABLES INICIALES
///////////////

   //VARIABLES PREVIAS
   Uint8 * tecla;

   SDL_Event evento; //Variable de la estructura event para eventos del raton
   SDL_Rect rectMirilla; //Rectangulo para la posicion de la mirilla
   SDL_Rect rectBalazoCara; //Rectangulo para la posicion de la sangre en la cara del enemigo
   SDL_Rect rectGameover;
   SDL_Rect rectBotonSi;
   SDL_Rect rectBotonNo;
   SDL_Rect rectOtraVez;
   SDL_Rect rectPuntosLetras;
   SDL_Rect rectPuntosNumeros;

   rectPuntosLetras.x = 10;
   rectPuntosLetras.y = 570;

   rectPuntosNumeros.x = 80;
   rectPuntosNumeros.y = 570;

   rectOtraVez.x = 180;
   rectOtraVez.y = 400;
   
   rectBotonSi.x = 390;
   rectBotonSi.y = 400;

   rectBotonNo.x = 500;
   rectBotonNo.y = 400;
   
   rectGameover.x = 100;
   rectGameover.y = 0;

   int puntos = 0;
   char buffer[10]; //para guardar los puntos en tipo char

   int balas = 11;

   enemigo1.rect.x = 0; //Posicion anemigo
   enemigo1.rect.y = 200;
   enemigo1.hp = 100;
   enemigo1.caraActual = 0;
   enemigo1.velocidad = 4;

   int direccion; //Variable para la direccion hacia donde se mueve el enemigo, se acctualiza en cada llamada a mover();

   int ratonx; //Variables para poder pasarselas a SDL_GetMouseState
   int ratony;

   bool done = false; //Mientras done sea falso, el juego se ejecuta

   Mix_PlayChannel(-1, sonidoFondo, -1); //Musica de fondo, empieza cuando empieza el game loop

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///GAME LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOP
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   while(!done)
   {
      SDL_PumpEvents(); //Eventos teclado
      tecla = SDL_GetKeyState(0);

      SDL_PollEvent(&evento); //comprobar eventos
      SDL_GetMouseState(&ratonx, &ratony); //Pasar posicion raton

      rectMirilla.x = ratonx -50; //Ajustar punto del medio de la mirilla con el raton
      rectMirilla.y = ratony -50;

      if(evento.type == SDL_MOUSEBUTTONDOWN) //SI HAY CLICK / DISPARO
      {
         balas --; //En el momento en que se dispara se pierde una bala
         ///Verifico que el raton este encima de la imagen del enemigo en el momento de la pulsacion del boton
         if( (ratonx >= enemigo1.rect.x && ratony >= enemigo1.rect.y) && (ratonx <= (enemigo1.rect.w + enemigo1.rect.x) && ratony <= (enemigo1.rect.h+enemigo1.rect.y) ))
         {   
            enemigo1.hp -= 50; //Quitar vida al enemigo y comprovar si ha muerto
            if(enemigo1.hp <= 0)
            {
               enemigo1.caraActual++; //Si ha muerto pasa a la siguiente face (a la siguiente cara)
               ///RENOVAR CARA USADA
               switch(enemigo1.caraActual) //En el array caraLimpia se almacena le imagen sin sangre de cada cara
               {
               case 1:
                  SDL_BlitSurface(enemigo1.caraLimpia[0], NULL, enemigo1.cara[0], NULL); //Si pasamos a cara[1], renovamos la cara[0]
                  break;
               case 2:
                  SDL_BlitSurface(enemigo1.caraLimpia[1], NULL, enemigo1.cara[1], NULL); //Si pasamos a cara[2], renovamos la cara[1]
                  break;
               case 3:
                  SDL_BlitSurface(enemigo1.caraLimpia[2], NULL, enemigo1.cara[2], NULL); //Si pasamos a cara[3], renovamos la cara[2]
                  break;
               case 4:
                  SDL_BlitSurface(enemigo1.caraLimpia[3], NULL, enemigo1.cara[3], NULL); //Si volvemos a la cara[0](vease mas abajo) renovamos la cara [3]
                  break;
               }

               if(enemigo1.caraActual == 4) //Si caraActual es 4, pasamos a la siguiente puntos
               {
                  ///ANIMACION MUERTE
                  Mix_PlayChannel(-1, wow, 0);
                  SDL_BlitSurface(fondo, NULL, screen, NULL); ///Actualizar pantalla
                  SDL_BlitSurface(enemigoBlanco, NULL, screen, &enemigo1.rect);
                  SDL_BlitSurface(mirilla, NULL, screen, &rectMirilla);
                  SDL_Flip(screen);
                  SDL_Delay(80);

                  SDL_BlitSurface(fondo, NULL, screen, NULL); ///Actualizar pantalla
                  SDL_BlitSurface(enemigo1.cara[enemigo1.caraActual], NULL, screen, &enemigo1.rect);
                  SDL_BlitSurface(mirilla, NULL, screen, &rectMirilla);
                  SDL_Flip(screen);
                  SDL_Delay(80);

                  SDL_BlitSurface(fondo, NULL, screen, NULL); ///Actualizar pantalla
                  SDL_BlitSurface(enemigoBlanco, NULL, screen, &enemigo1.rect);
                  SDL_BlitSurface(mirilla, NULL, screen, &rectMirilla);
                  SDL_Flip(screen);
                  SDL_Delay(80);
                  
                  /////ACTUALIZAR VARIABLES
                  if(balas >= 1) puntos = puntos + balas;
                  puntos++;
                  enemigo1.velocidad++;
                  enemigo1.hp = 100;
                  enemigo1.caraActual = 0;
                  balas = 11;
                  continue;
               }
               enemigo1.hp = 100; //Despues de pasar a la siguiente fase vuelve a tener toda la vida
            }
            
            rectBalazoCara.x = rectMirilla.x - enemigo1.rect.x; //Coordenadas donde ira el chorrito de sangre en la cara
            rectBalazoCara.y = rectMirilla.y - enemigo1.rect.y;
            SDL_BlitSurface(chorrito, NULL, enemigo1.cara[enemigo1.caraActual], &rectBalazoCara);
                  
         }
         else
         {
            SDL_BlitSurface(balazo, NULL, fondo, &rectMirilla); //Pintar balazo en la pared
         }
         Mix_PlayChannel(-1, sonidoBala, 0); //Sonido balazo

         evento.type = SDL_NOEVENT; //Limpiar Buffer eventos

      }
      if(tecla[SDLK_ESCAPE])
      {
         done = true; //Si se pulsa scape, se sale del loop
      }

      enemigo1.mover(enemigo1.velocidad, &direccion); //Cambiar posicion del enemigo

///////////////////////////////////////////////////////////////////////////////////////////////
//////ACTUALIZAR PANTALLA
/////////////////////////////////////////////////////////////////////////////////////////////
      printf("puntos %d", puntos);
      SDL_BlitSurface(fondo, NULL, screen, NULL);
      actualizar_imagen_balas(balas, screen, bala);
      SDL_BlitSurface(puntosLetras, NULL, screen, &rectPuntosLetras);
      sprintf(buffer, "%d", puntos);
      puntosNumeros = TTF_RenderText_Blended(fuentePuntos, buffer, colorFuente);
      SDL_BlitSurface(puntosNumeros, NULL, screen, &rectPuntosNumeros);
      SDL_BlitSurface(enemigo1.cara[enemigo1.caraActual], NULL, screen, &enemigo1.rect);
      SDL_BlitSurface(mirilla, NULL, screen, &rectMirilla);
      SDL_Flip(screen);

      ////////////////////////////////////////////////////////////////
      ///GAME OVER
      ///////////////////////////////////////////////////////////////

      if(balas == 0) //SI NO HAY BALAS, FIN DEL JUEGO
      {
         Mix_PlayChannel(-1, doh, 0);
         while(true)
         {
         SDL_PollEvent(&evento); //comprobar eventos
         SDL_GetMouseState(&ratonx, &ratony); //Pasar posicion raton

         //SALIR?
         //Si se pulsa el boton si, se sale del juego
         if(evento.type == SDL_MOUSEBUTTONDOWN && ratonx >= rectBotonNo.x && ratony >= rectBotonNo.y && ratonx <= (rectBotonNo.x + rectBotonNo.w) && ratony <= (rectBotonNo.y + rectBotonNo.h) )
         {
            done = true;
            break;
         }
         //Si se pulsa el boton no, vuelve a empezar, por tanto hay que reiniciar las variables
         if(evento.type == SDL_MOUSEBUTTONDOWN && ratonx >= rectBotonSi.x && ratony >= rectBotonSi.y && ratonx <= (rectBotonSi.x + rectBotonSi.w) && ratony <= (rectBotonSi.y + rectBotonSi.h) )
         {
            puntos = 0;
            balas = 11;

            enemigo1.rect.x = 0; //Posicion anemigo
            enemigo1.rect.y = 200;
            enemigo1.hp = 100;
            
            enemigo1.velocidad = 4;
            //LIMPIAR LA ULTIMA CARA
            switch(enemigo1.caraActual) //En el array caraLimpia se almacena le imagen sin sangre de cada cara
               {
               case 0:
                  SDL_BlitSurface(enemigo1.caraLimpia[0], NULL, enemigo1.cara[0], NULL); //Si pasamos a cara[1], renovamos la cara[0]
                  break;
               case 1:
                  SDL_BlitSurface(enemigo1.caraLimpia[1], NULL, enemigo1.cara[1], NULL); //Si pasamos a cara[2], renovamos la cara[1]
                  break;
               case 2:
                  SDL_BlitSurface(enemigo1.caraLimpia[2], NULL, enemigo1.cara[2], NULL); //Si pasamos a cara[3], renovamos la cara[2]
                  break;
               case 3:
                  SDL_BlitSurface(enemigo1.caraLimpia[3], NULL, enemigo1.cara[3], NULL); //Si volvemos a la cara[0](vease mas abajo) renovamos la cara [3]
                  break;
            }
            enemigo1.caraActual = 0;

            fondo = IMG_Load("fondo.png");
            comprovar_surface(fondo);
            
            done = false;
            evento.type = SDL_NOEVENT; //Limpiar Buffer eventos
            break;
         }

         enemigo1.mover(enemigo1.velocidad, &direccion); //Cambiar posicion del enemigo
         SDL_BlitSurface(fondo, NULL, screen, NULL);
         actualizar_imagen_balas(balas, screen, bala);
         SDL_BlitSurface(puntosLetras, NULL, screen, &rectPuntosLetras);
         SDL_BlitSurface(puntosNumeros, NULL, screen, &rectPuntosNumeros);
         SDL_BlitSurface(enemigo1.cara[enemigo1.caraActual], NULL, screen, &enemigo1.rect);
         SDL_BlitSurface(gameover, NULL, screen, &rectGameover);
         SDL_BlitSurface(otraVez, NULL, screen, &rectOtraVez);
         SDL_BlitSurface(botonSi, NULL, screen, &rectBotonSi);
         SDL_BlitSurface(botonNo, NULL, screen, &rectBotonNo);
         SDL_Flip(screen);
         }
      }

   }
   return 0;
}

void comprovar_surface(SDL_Surface * superficie)
{
   if(!superficie) //Si despues de intentar cargar una imagen, la superficie esta vacia, algo va mal
   {
      SDL_Surface * screen = SDL_SetVideoMode(100, 100, 32, SDL_HWSURFACE); //Reinicio la ventana principal para quitar el fullscreen
      printf("Error: %s", SDL_GetError());
      getch();
      exit(1);
   }
}

void actualizar_imagen_balas(int balas, SDL_Surface * screen, SDL_Surface * bala)
{
   SDL_Rect rect; //Rectangulo para la posicion de cada bala
   rect.x = 770;
   rect.y = 530;
   
   switch(balas) //SE dibujan en la pantalla (screen) las balas restantes
   {
   case 1:
      SDL_BlitSurface(bala, NULL, screen, &rect);
      break;
   case 2:
      for(int i = 2; i > 0; i--)
      {
         SDL_BlitSurface(bala, NULL, screen, &rect);
         rect.x -= 21;
      }
      break;
   case 3:
      for(int i = 3; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 4:
      for(int i = 4; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 5:
      for(int i = 5; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 6:
      for(int i = 6; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 7:
      for(int i = 7; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 8:
      for(int i = 8; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 9:
      for(int i = 9; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 10:
      for(int i = 10; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   case 11:
      for(int i = 11; i > 0; i--)
         {
            SDL_BlitSurface(bala, NULL, screen, &rect);
            rect.x -= 21;
         }
         break;
   }
}

void enemigo::mover(int velocidad, int *direccion)
{   
//////////////////////////////////////////////////////////////////////////////////////////
////VERIFICAR SI EL ENEMIGO HA TOCADO UNA PARED PARA CAMBIAR LA POSICION A LA QUE MOVERSE
//////////////////////////////////////////////////////////////////////////////////////////

   if(rect.x <= 0 && (rect.y != 0 && rect.y != 600) ) //Si el enemigo toca la pared de la IZQUIERDA
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 4 || *direccion == 7 || *direccion == 8)
      {
         *direccion = (rand() % 8)+1;
      }
   }
   else if(rect.x >= 800 && (rect.y != 0 && rect.y != 600) ) //Si el enemigo toca la pared de la DERECHA
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 3 || *direccion == 5 || *direccion == 6 || *direccion == 2 || *direccion == 1)
      {
         *direccion = (rand() % 8)+1;
      }
   }
   else if(rect.y <= 0 && (rect.x != 0 && rect.x != 800) ) //Si el enemigo toca la pared de ARRIBA
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 1 || *direccion == 5 || *direccion == 8)
      {
         *direccion = (rand() % 8)+1;
      } 
   }
   else if(rect.y >= 600 && (rect.x != 0 && rect.x != 800) ) //Si el enemigo toca la pared de ABAJO
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 2 || *direccion == 6 || *direccion == 7 || *direccion == 4 || *direccion == 3)
      {
         *direccion = (rand() % 8)+1;
      }
   }
   else if(rect.x == 0 && rect.y == 0) //Si el enemigo esta en la esquina de ARRIBA IZQUIERDA
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 1 || *direccion == 4 || *direccion == 8)
      {
         *direccion = (rand() % 8)+1;
      }
   }
   else if(rect.x == 0 && rect.y == 600) //Si el enemigo esta en la esquina de ABAJO IZQUIERDA
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 2 || *direccion == 4 || *direccion == 7)
      {
         *direccion = (rand() % 8)+1;
      }
   }
   else if(rect.x == 800 && rect.y == 600) //Si el enemigo esta en la esquina de ABAJO DERECHA
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 2 || *direccion == 6 || *direccion == 3)
      {
         *direccion = (rand() % 8)+1;
      }
   }
   else if(rect.x == 800 && rect.y == 0) //Si el enemigo esta en la esquina de ARRIBA DERECHA
   {
      *direccion = (rand() % 8)+1;
      //Verificamos que no salga una direccion que saque al enemigo de la pantalla
      while(*direccion == 1 || *direccion == 5 || *direccion == 3)
      {
         *direccion = (rand() % 8)+1;
      }
   }   
   
///////////////////////////////////////////////////////////////////////////////////////////////
///ACTUALIZAR COORDENADAS DEL ENEMIGO SEGUN LA DIRECCION A LA QUE HALLA DE MOVERSE
//////////////////////////////////////////////////////////////////////////////////////////////

   switch(*direccion)
   {
   case 1:
      rect.y -= velocidad; //Arriba
      break;
   case 2:
      rect.y += velocidad; //Abajo
      break;
   case 3:
      rect.x -= velocidad; //Derecha
      break;
   case 4:
      rect.x += velocidad; //Izquierda
      break;
   case 5:
      rect.y -= velocidad; //Arriba/Derecha
      rect.x += velocidad;
      break;
   case 6:
      rect.y += velocidad; //Derecha/abajo
      rect.x += velocidad;
      break;
   case 7:
      rect.y += velocidad; //Abajo/izquierda
      rect.x -= velocidad;
      break;
   case 8:
      rect.y -= velocidad; //Izquieda/arriba
      rect.x -= velocidad;
   default:
      break;

   }

}


Musica:
http://www.playonloop.com

Eso es todo, espero que os guste :D


Edit: Aprovecho para preguntar como puedo hacer para quitar la pantallita de msdos, que sigue por ahi detras incordiando.
Última edición por migueleitorone el Vie Feb 18, 2011 2:19 pm, editado 3 veces en total
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Mi primer juego: Disparar a matar a la cara hasta llore

Notapor carlostex » Vie Feb 18, 2011 4:15 am

Bueno para el comienzo, tiene musica y efectos tanto de sonido como de imágenes, lo que si tiene es que sus movimientos son predictivos, aunque sea rápido eso no aumenta el nivel, por que siempre es predictivo, podrías hacer que cada cierto tiempo cambie de dirección y esto me llevó a pensar que podrías hacer que las caras aparezcan detrás de alguna imagen como si se tratara de un campo de entrenamiento de tiros e ir cambiando esas imágenes.
lo de la terminal se supone que win separa las aplicaciones de terminal y gráficas a si que habría que cambiar a que tu aplicación solo sea gráfica, y otra cosa que esperaba ver y no estaba es el código, verlo funcionar esta bien, pero somos programadores y el código es lo más importante para otros que aprenden como tu.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Mi primer juego: Disparar a matar a la cara hasta llore

Notapor .teri » Vie Feb 18, 2011 12:11 pm

Sería de agradecer que el código estuviese disponible. Se supone que un juego que es portable debe tener su código disponible para los usuarios de GNU/Linux (como yo), está bien que tengas listo un ejecutable para Windows porque sinceramente compilar para ese SO es complicado.
Como primera impresión tengo que decir que es un juego cruel :D.
.teri
 
Mensajes: 38
Registrado: Dom Oct 01, 2006 4:41 pm

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor migueleitorone » Vie Feb 18, 2011 2:03 pm

Ya esta el codigo (aunque es bastante caotico :P).
El ejecutable que he subido no sirve para GNU/Linux?
Carlos, la verdad es que si que es muy predecible el movimiento del muñeco, la forma en que lo he planteado es la siguiente:
cuando las coordenadas del muñeco cooinciden con las de alguna "pared"(cuando toca una pared), aleatoriamente elige una direccion para rebotar, y asi hasta la siguiente pared.
No creo que lo cambie por que ya estoy maquinando otro proyecto, pero gracias de todas maneras por las ideas.

gracias por el apoyo :D
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor carlostex » Sab Feb 19, 2011 1:09 am

migueleitorone escribió:Carlos, la verdad es que si que es muy predecible el movimiento del muñeco, la forma en que lo he planteado es la siguiente:
cuando las coordenadas del muñeco cooinciden con las de alguna "pared"(cuando toca una pared), aleatoriamente elige una direccion para rebotar, y asi hasta la siguiente pared.
No creo que lo cambie por que ya estoy maquinando otro proyecto, pero gracias de todas maneras por las ideas.


Pues ha sido un buen comienzo, con un poco mas de trabajo el juego habría quedado entretenido si aun así me llamo la atención, esperamos mas en tu siguiente proyecto, animo y éxito.

sobre lo del ejecutable: Cada sistema operativo tiene un contexto sobre el que ejecuta una aplicación y no es posible ejecutar una aplicación de win en Gnu/Linux aunque yo lo ejecuté con el wine. La ventaja de distribuir el código y no el ejecutable es que tu programa se vuelve multiplataforma por que además usas SDL el cual es multiplataforma, en sistemas linux se puede ejecutar el juego sin abrir la terminal.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Mi primer juego: Disparar a matar a la cara hasta llore

Notapor Geo » Dom Feb 20, 2011 5:52 am

Bonito juego, me habría gustado que contara con una pantalla de presentación, con el nombre y autor :), vamos, es sencillo pero que luzca como juego terminado :). En cuanto a la dificultad, me parece bien salvo en los casos donde el desplazamiento se hace en vertical, donde es mucho más fácil atinarle.

migueleitorone escribió:Edit: Aprovecho para preguntar como puedo hacer para quitar la pantallita de msdos, que sigue por ahi detras incordiando.

Mmm, o sea que no está terminado ;). Lo que debes hacer es indicar en tu entorno que debe generar una aplicación de Windows y no una de consola. ¿Con qué entorno trabajas? En VC++ vas a propiedades de proyecto -> propiedades del enlazador -> sección Sistema y cambiás la opción Subsistema de CONSOLE a WINDOWS. Si usas otro entorno y no consigues realizar la modificación, coméntalo por aquí :).

.teri escribió:está bien que tengas listo un ejecutable para Windows porque sinceramente compilar para ese SO es complicado.

Yo creo todo lo contrario ¿Por qué te parece que es difícil compilar en Windows?

migueleitorone escribió:El ejecutable que he subido no sirve para GNU/Linux?

La respuesta "clásica" sería no, ya que deberías generar un ejecutable diferente para cada plataforma en la que pretendas que se ejecute, claro, siempre que sea posible (en este caso si, ya que utilizas funciones estándar y bibliotecas que están disponibles tanto para Windows como para Linux). Pero también se puede correr en Linux el ejecutable para Windows en caso de que se cuente con alguna forma de emulación (p. ej. una máquina virtual) o algún sistema que implemente lo necesario para que el ejecutable de Windows se ejecute en otro sistema (p. ej. Wine, aunque no está garantizado que se pueda ejecutar cualquier ejecutable de Windows). Por cierto, no es necesario que incluyas los archivos .lib en la descarga, con los .dll basta para ejecutar el archivo. Los .lib son útiles al momento de crear el ejecutable.

carlostex escribió:no es posible ejecutar una aplicación de win en Gnu/Linux aunque yo lo ejecuté con el wine

Entonces si es posible ;).
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor carlostex » Dom Feb 20, 2011 6:58 am

carlostex escribió: carlostex escribió:no es posible ejecutar una aplicación de win en Gnu/Linux aunque yo lo ejecuté con el wine


Entonces si es posible ;).


jeje equivocación en la forma en la que lo dije, quise decir que no es posible ejecutar aplicaciones para win en sistemas linux normalmente, a menos que se haga uso de un programa como wine( que técnicamente no es un emulador pues pone el contexto de bibliotecas y recursos para ejecutar la aplicación un emulador seria como los que ejecutan aplicaciones para sega o nintendo pues emulan el microprocesador, en este caso las instrucciones en ensamblador son las mismas, solo cambia la interfase con la que se comunica con el hardware de hecho por eso no es raro escuchar que algunas aplicaciones se ejecutan mejor que en win, irónico)
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Mi primer juego: Disparar a matar a la cara hasta llore

Notapor .teri » Dom Feb 20, 2011 5:14 pm

Yo creo todo lo contrario ¿Por qué te parece que es difícil compilar en Windows?


Porque tienes que instalar un IDE, y después configurarlo. Aparte que puedes hacer pequeños ajustes con cada proyecto que hagas cuando desarrollas en Windows.
.teri
 
Mensajes: 38
Registrado: Dom Oct 01, 2006 4:41 pm

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor Geo » Dom Feb 20, 2011 10:16 pm

carlostex escribió:a menos que se haga uso de un programa como wine( que técnicamente no es un emulador pues pone el contexto de bibliotecas y recursos para ejecutar la aplicación un emulador seria como los que ejecutan aplicaciones para sega o nintendo pues emulan el microprocesador

Geo escribió:o algún sistema que implemente lo necesario para que el ejecutable de Windows se ejecute en otro sistema

En efecto, WINE no es un emulador, en el mismo nombre tratan de dejarlo claro :p (Wine Is Not an Emulator), por eso mencioné lo de "implementar lo necesario", se trata más bien de una implementación de bibliotecas y subsistemas de Windows para permitir la ejecución de aplicaciones compiladas para Windows.

carlostex escribió:de hecho por eso no es raro escuchar que algunas aplicaciones se ejecutan mejor que en win, irónico)

No me he topado con alguna pero si he leído algunos comentarios así, y cierto, qué ironía :p.

.teri escribió:Porque tienes que instalar un IDE, y después configurarlo.

No necesariamente, puedes compilar aplicaciones con VC desde línea de comandos, incluso puedes instalarte MinGW y trabajar como si de GCC se tratara, con archivos make y todo.
.teri escribió:Aparte que puedes hacer pequeños ajustes con cada proyecto que hagas cuando desarrollas en Windows.

La utilización de un IDE generalmente se acompaña de la intención de contar con una forma más cómoda de administrar un proyecto de mediano tamaño en adelante, y esos pequeños ajustes a mi parecer son virtudes y no problemas ;).

Pero bueno, sigamos platicando sobre el juego, espero que sirvan los comentarios ya sea para este o para el próximo proyecto Miguel :).
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor .teri » Dom Feb 20, 2011 10:31 pm

No necesariamente, puedes compilar aplicaciones con VC desde línea de comandos, incluso puedes instalarte MinGW y trabajar como si de GCC se tratara, con archivos make y todo.


Precisamente por esto no queda, ¿cómo decirlo?, "natural". La propia consola de comandos de Windows no le llega ni a la suela de los zapatos de un *nix teniendo que buscar e instalar powershell o algo parecido si no lo tienes ya instalado por defecto. Y bueno, para ayudarte con independencia de que si usas VC o Mingw ya tienes cmake.

La utilización de un IDE generalmente se acompaña de la intención de contar con una forma más cómoda de administrar un proyecto de mediano tamaño en adelante, y esos pequeños ajustes a mi parecer son virtudes y no problemas ;).


A modo de IDE, uso un editor de textos para programar y la consola. De un IDE veo que es un problema porque es que te abruma la cantidad de opciones que hay cuando puedes usar justamente lo necesario simplificando mucho las cosas. Al menos en lo personal. Para administrar proyectos a partir de mediano tamaño ya tengo mi propio combo de cmake+mercurial+geany+bash.
.teri
 
Mensajes: 38
Registrado: Dom Oct 01, 2006 4:41 pm

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor shackra » Jue Feb 24, 2011 5:09 pm

pondré una copia del juego disponible en el grupo de Losersjuegos en gNewBook.org :)
sigue así muchacho!

http://www.gnewbook.org/pg/groups/47342/losersjuegos/
http://www.gnewbook.org/pg/file/shackra ... -que-llore

Edito: por favor, evita comprimir con RAR porque no todos podemos acceder al contenido comprimido con ese software, convertiré el fichero a 7zip; te invito a usar 7zip: http://www.7-zip.org es un formato de compresión libre y gratuito muy bueno.
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor Geo » Vie Feb 25, 2011 5:08 am

shackra escribió:Edito: por favor, evita comprimir con RAR porque no todos podemos acceder al contenido comprimido con ese software, convertiré el fichero a 7zip; te invito a usar 7zip: http://www.7-zip.org es un formato de compresión libre y gratuito muy bueno.

Yo uso 7zip y pude abrir este archivo .rar sin problemas, tanto en Win como en Linux :).
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor Juanxo » Vie Feb 25, 2011 3:33 pm

de hecho el formato más compatible que yo conozca es .zip, ya que lo más seguro es que la mayoría de usuarios de Windows no tengan/tengamos 7zip
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor shackra » Vie Feb 25, 2011 5:07 pm

Geo escribió:
shackra escribió:Edito: por favor, evita comprimir con RAR porque no todos podemos acceder al contenido comprimido con ese software, convertiré el fichero a 7zip; te invito a usar 7zip: http://www.7-zip.org es un formato de compresión libre y gratuito muy bueno.

Yo uso 7zip y pude abrir este archivo .rar sin problemas, tanto en Win como en Linux :).

eso es porque usas la librería unrar que no es libre, yo no tengo instalado ese paquete (a excepción del unrar para rar 2.9 que si es libre).

en todo caso, es bueno usar, al menos, .zip como indica juanxo, pero si deseas mayor compresión invito a todo el mundo a comprimir sus datos con 7zip que no es difícil de conseguir, que no hay que pagar por usar (seria bueno donar, no es un mal proyecto) y es multiplataforma (GNU/Linux, MacOs, Windows y otros sistemas si compilas el código fuente :D), www.7-zip.org

así los datos estarán disponibles para cualquier persona, incluido, monstruos, alienígenas y fantasmas :) (o sea, para no excluir a nadie).

saludos!
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor carlostex » Vie Feb 25, 2011 9:48 pm

Aunque se salga un poco del tema, pero estoy de acuerdo con shackra, ay que apoyar el software libre y no solo por que sea gratis, si no, por que muchas veces es mejor que el privativo en este caso 7zip es mejor como dice shackra, lo mismo sucede con el pdf, existe un formato(no lo recuerdo) que tiene un mejor ratio de compresión.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor shackra » Dom Feb 27, 2011 10:20 pm

carlostex escribió:Aunque se salga un poco del tema, pero estoy de acuerdo con shackra, ay que apoyar el software libre y no solo por que sea gratis, si no, por que muchas veces es mejor que el privativo en este caso 7zip es mejor como dice shackra, lo mismo sucede con el pdf, existe un formato(no lo recuerdo) que tiene un mejor ratio de compresión.


no sera el formato .7z.bz2.zip.gz.lzma.xz? :D

no, en serio, apoyar al software libre no cuesta nada ^_^
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor migueleitorone » Mié Mar 02, 2011 8:14 pm

shackra escribió:pondré una copia del juego disponible en el grupo de Losersjuegos en gNewBook.org :)
sigue así muchacho!

http://www.gnewbook.org/pg/groups/47342/losersjuegos/
http://www.gnewbook.org/pg/file/shackra ... -que-llore

Edito: por favor, evita comprimir con RAR porque no todos podemos acceder al contenido comprimido con ese software, convertiré el fichero a 7zip; te invito a usar 7zip: http://www.7-zip.org es un formato de compresión libre y gratuito muy bueno.


Perfecto, tendre que pasarme por alli aver que se cuece, muchas gracias a todos. Tendre en cuenta lo del rar para la proxima vez ;)
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Mi primer juego: Disparar a matar a la cara hasta que ll

Notapor shackra » Sab Mar 05, 2011 12:15 am

migueleitorone escribió:Perfecto, tendre que pasarme por alli aver que se cuece, muchas gracias a todos. Tendre en cuenta lo del rar para la proxima vez ;)


esa es la actitud, chaval! ^_^
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Videojuegos

¿Quién está conectado?

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