SDL

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

SDL

Notapor Franjabube » Jue Nov 14, 2013 6:30 am

Hola a todos!

Mi nombre es Francisco, actualmente estoy comenzando a practicar en SDL, tengo un pequeño proyecto para practicar, "soki", no es nada especial jajaja, solo mi primer programatia en SDL

Quisiera saber como podría mejorar mi codigo? Especialmente, en como utilizar Clases para el manejo de Frames, Sprites, Personaje..no se exactamente como es el pseudo codigo, digamos, para realizar cada uno, como debería organizarse cada uno

Ajunto mi pequeño proyecto para que lo vean, y su codigo.

Código: Seleccionar todo
#include <SDL/SDL.h>
#include <stdlib.h>
#include <iostream>

int main()
{
   SDL_Init( SDL_INIT_EVERYTHING );

SDL_Surface *ventana, *soki, *suelo, *fondo;
SDL_Event tecla;
SDL_Rect posicion_soki = {0, 152};
SDL_Rect posicion_recorte = {0, 0, 40, 40};
//SDL_Rect posicion_suelo = {0, 240};
SDL_Rect posicion_fondo = {0, 0};


int done = 0;

            ventana = SDL_SetVideoMode( 800, 400, 32, SDL_SWSURFACE | SDL_ASYNCBLIT | SDL_DOUBLEBUF);
               if( ventana == NULL)
                  {   fprintf (stderr, "No se pudo mostrar el modo de video 800x600: %s\n", SDL_GetError());
                        exit(1);
                  }
               
               //Titulo de la ventana                  
               SDL_WM_SetCaption("Soki", NULL);

            soki = SDL_LoadBMP("soki.bmp");
               if( soki == NULL)
                  {   fprintf (stderr, "No se pudo mostrar el grafico: %s\n", SDL_GetError());
                        exit(1);
                  }

               //suelo = SDL_LoadBMP("suelo.bmp");

               fondo = SDL_LoadBMP("fondo.bmp");

               //De la imagen soki, no pintar el color violeta (255,0,150)
               SDL_SetColorKey(soki,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(soki->format,255,0,150));
//Repeticion de tecla
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);

            while(true)
            {
               while ( SDL_PollEvent(&tecla))
                        {
                           if(tecla.type==SDL_QUIT){
                              exit(0);}
                           if(tecla.type==SDL_KEYDOWN)
                             switch(tecla.key.keysym.sym)
                              {

                           case SDLK_LEFT: posicion_soki.x-=5.5;
                                       posicion_recorte.x-=40;

                              if(posicion_recorte.x<0)
                                    {
                                       posicion_recorte.x=360;
                                    }
                              if(posicion_soki.x<0)
                                    {
                                       posicion_soki.x=0;
                              }   
                                                   
                                             break; //Break, para detener loop en la instruccion
                           

                           
                           case SDLK_RIGHT: posicion_soki.x+=5.5;
                                        posicion_recorte.x+=40;
                              
                              if(posicion_recorte.x>360)
                                    {
                                       posicion_recorte.x=0;
                                    }
                              if(posicion_soki.x>760)  //No se puede usar 800 como limite, porque la distancia entre soki y el borde del cuadrado es de 40 pixeles
                                    {
                                       posicion_soki.x=760;
                                    }
                                             break;


                           case SDLK_UP: posicion_soki.y-=10;
                                    posicion_recorte.x-=40;
                              
                              if(posicion_recorte.x<0)
                                    {
                                       posicion_recorte.x=360;
                                    }
                              if(posicion_soki.y<0)
                                    {
                                       posicion_soki.y=0;
                                    }
                                             break;//Break, para detener loop en la instruccion
                           case SDLK_ESCAPE: return 0;

                           case SDLK_DOWN: posicion_soki.y+=10;
                              if(posicion_soki.y>148)
                                    {
                                       posicion_soki.y = 148;  //Limita el movimiento de soki hasta 400 en y
                                    }


                           posicion_recorte.x+=40;
                              if(posicion_recorte.x>360)
                                    {
                                       posicion_recorte.x=0;
                                    }
                                             break;
                           }
            }

            //Pintar sobre pantalla, el siguiente color
            SDL_FillRect(ventana, 0, SDL_MapRGB(ventana->format, 80, 80, 80));
            //Dibujar nave en pantalla, en la posicion &posicion_nave
            //SDL_BlitSurface(suelo, NULL, ventana, &posicion_suelo);
            SDL_BlitSurface(fondo, NULL, ventana, &posicion_fondo);
            SDL_BlitSurface(soki, &posicion_recorte, ventana, &posicion_soki);         
            //Mostrar ventana
            SDL_Flip( ventana );
            }

//Liberar superficie
SDL_FreeSurface ( ventana );
return 0;
}


Básicamente quiero aprendear el manejo de Sprites y Frames corréctamente, eh leído sobre esto en varios libros y tutoriales, pero cada uno, lamentablemente estan adjudican sus descripciones únicamente a sus ejemplos, por lo tanto me cuesta lograr entenderlos de manera efectiva.


LINK de descarga de mi proyecto (450kb) : https://mega.co.nz/#!9whwxaTT!Sz5YE3gIu ... moRphH7t5k

Saludos a todos!
Franjabube
 
Mensajes: 1
Registrado: Vie Nov 08, 2013 4:10 pm

Re: SDL

Notapor shackra » Mié Dic 18, 2013 2:49 am

Saludos!

Bueno, primero que nada, SDL no esta muy orientado a objetos (Clases, como dices) que digamos. Se puede hacer si tu haces tus propias clases y por dentro escribes el código SDL respectivo. Yo en lo personal te recomiendo que te pases a SFML que esta pensado para usarse en C++ (y esta orientado a objetos). El procedimiento seria similar, escribes tus propias clases y usas composición (composición antes que usar herencia, como dicen) para juntar SFML con el código de tu juego.

Me encantaría ayudarte con algo concreto, pero mi C++ es aun algo verde (aunque estoy trabajando para madurarlo). Pero como dices, te gustaría saber sobre clases menejadores de Sprites, frames (ni idea como pretendes manejar un frame...) y personaje. Bueno, la programación orientada a objetos te permite abstraer tu problema a conceptos. Por ejemplo, una clase que se encargue en el manejo de los sprites podría llamarse Escena, ella se encargaría de la creación y eliminación de sprites en el mapa/escenario de tu juego. Una forma de ir poniendo los sprites dentro de una instancia de Escena seria usando un vector, el objeto vector te permitiría guardar las instancias del objetos Sprite tan fácil como hacer mivector.push_back(enemigo1), por supuesto que tendrás que estudiar la biblioteca STL de C++ para que te familiarices con la mayoría de los objetos que se ofrecen y así resuelvas el problema que te planteas de la mejor forma según tus requerimientos.

También no estaría mal familiarizarse con la colección de bibliotecas Boost, su biblioteca signals2 se ve muy interesante y te permitirá implementar el patrón de diseño Observer, ideal para enviar eventos a diferentes objetos sin mucho trajín (y es usado actualmente en el motor Pilas)
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados