Fecha y hora actual: Lunes 16 Jul 2018 12:05
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Como crear un motor para juegos usando C++ y SDL

Responder al Tema

Índice del Foro > Programación de juegos o videojuegos > Como crear un motor para juegos usando C++ y SDL

Autor Mensaje
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Martes 14 Feb 2012 00:05

Título del mensaje: Como crear un motor para juegos usando C++ y SDL

Responder citando

(Próximamente)

Algunas vez se han preguntando que pasaría si convirtieramos un puñado de funciones de C en un paquete de objetos práctico? Seguro que cuando piensa en POO se le nubla la vista, jajajaj, suele ocurrir en el desarrollo, pero una vez que tienes tus propias clases luego ves las cosas así:

Código:
  1. #include "GameEngine2D.cpp" // Incluimos nuestro paquete
  2.  
  3. /*************Funcion Principal***********************/
  4. int main(int argc, char *argv[])
  5. {
  6. GE2D->InitEngine(); // Inicializamos el motor
  7.  
  8. Sprite * pj=new Sprite((GameEngine2Dbase*)GE2D), // Creamos dos Sprites
  9. * pnj=new Sprite((GameEngine2Dbase*)GE2D);
  10.  
  11.  
  12. pj->LoadBitmap("pj_1.bmp"); // ASignamos bitmaps a los Sprites
  13. pj->SetPosition(100,100);
  14. //pj.SetSpriteControlledOn(); // Posibilitamos el control del Sprite por medio de teclas definidas previamente (en proceso)
  15.  
  16. pnj->LoadBitmap("MURO_1.bmp");
  17. pnj->SetPosition(0,0); // Fijamos la posicion del Sprite
  18.  
  19. while(true)
  20. {
  21. GE2D->Update(); // Actualizamos en la pantalla todos los componentes gráficos añadidos al motor
  22. };
  23.  
  24. return 0;
  25. }
  26.  


Pues cuando tenga más tiempillo y si hay gente entusiasmada lo miramos, yo por lo menos estoy trabajando con el "paquete" en mis ratos libres, en vista de que un usuario levantó el tema SDL y por desgracia de momento no hemos tenido ocasión de abordar la librería SDL en nuestro apartado dedicado a la programación de videojuegos, recordemos que con luego podemos trasladar fácilmente nuestra aplicación , bueno con unos pequeños cambios, a otras plataformas debido a que SDL se encuentra disponible para los sistemas más usados como son Mac, Win y basados en Linux...



Ultima edición por WhiteSkull el Jueves 16 Ago 2012 20:20; editado 1 vez
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Manuel González
Usuario Activo


Registrado: 05 Jun 2011
Mensajes: 433
Ubicación: Venezuela-Miranda

Mensaje Publicado: Martes 14 Feb 2012 04:10

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Interesante la idea. Ok Yo lo que tengo son funciones que como son de uso comun las tengo todas en un file. aun no me eh puesto a crear un motor pero tenia pensado hacerlo cuando terminara con varios remakes que llevo a cuestas. ¿teneis pensado implementarlo para los diversos requerimientos de los tipos de juego?, como por ejemplo para un RPG y un platafoma. Ordenador

Yo aun no me considero alguien que domina la programacion de Video pero si alguien que medio domina SDL, por lo tanto si vos necesitas alguna ayudita, avisame por MP.
Ok Ok


“pero si estudias computación deberías saber usar todos los programas”
conclusion:Usuario no es gente.

mi blog Ordenador
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo Visitar sitio web del autor
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Lunes 05 Mar 2012 01:10

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Hombre, para mi es fácil usar la librería tal cual es, y el motor que iré desarrollando aquí, realmente es un envolvente que trabaja con la SDL, pero el motor estará orientado a objetos. Ahora como mis últimos proyectos han sido realizados en esa plataforma me he aficionado un poco a la POO, pero realmente Java no me gusta Triste , que no digo que tenga un motón de ventajas. Pero trabajar con código nativo, es mucho más eficiente y tortuoso si cabe. Entonces esto va encaminado a la gente que se le hace difícil la programación, por lo que Manu, esto de la POO y el motor te parecerá aburrido, si quieres te muestro parte del avance que incluye lo siguiente:

- Permite crear objetos Bitmap y Sprite. El Sprite de momento no cuenta con casi nada de propiedades, ya que hereda las mismas del Bitmap.

Bitmap.cpp
Código:
  1. #include <GL/gl.h>
  2. #include <SDL/SDL.h>
  3. //#include <SDL.h>
  4. #include <iostream>
  5. #include <String>
  6. #include <list>
  7.  
  8. using namespace std;
  9.  
  10. class Sprite;
  11.  
  12. template <typename T>
  13. class spriteList : public list<T>
  14. {
  15. public:
  16. typedef T sprite;
  17. typedef const T const_sprite;
  18. typedef sprite& spriteReference;
  19. typedef const_sprite& const_spriteReference;
  20. typedef sprite* spritePointer;
  21. typedef const_sprite* const_spritePointer;
  22.  
  23. typedef list<T> base_container;
  24. typedef typename base_container::iterator iterator;
  25. typedef typename base_container::const_iterator const_iterator;
  26.  
  27. void foo ()
  28. {
  29. iterator it; // easy peasy
  30. };
  31. };
  32.  
  33. // definimos una clase base
  34. class GameEngine2Dbase
  35. {
  36. public:
  37. // lista global que controla algunos comportaminetos comunes en los Sprites
  38. // como por ejemplo la colision
  39. spriteList<Sprite*> sprites;
  40.  
  41. SDL_Surface * bufferScreen;
  42.  
  43. SDL_Surface * GetBufferScreen()
  44. {
  45. return bufferScreen;
  46. }
  47.  
  48. void InsertSprite(Sprite * sprite)
  49. {
  50. sprites.push_back(sprite);
  51. }
  52. };
  53.  
  54. class Bitmap
  55. {
  56. protected:
  57. int x,y;
  58. SDL_Surface * bitmap, * canvas;
  59. int colorKey;
  60. string bitmapFileName;
  61. //char cadenaNumerica[50];
  62.  
  63. public:
  64. Bitmap(GameEngine2Dbase * engine)
  65. {
  66. canvas=engine->GetBufferScreen();
  67. //sprintf(cadenaNumerica,"%d",engine);
  68.  
  69. //cout << "(b)La referencia del GE2D es <" << cadenaNumerica << ">\n";// y el puntero <" << *bitmap << ">\n";
  70.  
  71. //char cadenaNumerica[50];
  72.  
  73. //sprintf(cadenaNumerica,"RectA(%d,%d,%d,%d) vs RectB(%d,%d,%d,%d)",leftA,rightA,topA,bottomA,leftB,rightB,topB,bottomB);
  74.  
  75. //SDL_WM_SetCaption ( "Cargando bitmap..." ,(const char*) 0);
  76.  
  77. };
  78.  
  79. ~Bitmap()
  80. {
  81. };
  82.  
  83. void SetColorKey(int red, int green, int blue)
  84. {
  85. colorKey=SDL_MapRGB(bitmap->format,red,green,blue);
  86. };
  87.  
  88. int GetColorKey()
  89. {
  90. return colorKey;
  91. };
  92.  
  93. void LoadBitmap(string BitmapFileName)
  94. {
  95. bitmapFileName=BitmapFileName;
  96. bitmap=SDL_LoadBMP(bitmapFileName.c_str());
  97. };
  98.  
  99. // Funcion que dibuja un bitmap sobre otro bitmapvoid
  100. void DrawBitmap(int x ,int y )
  101. {
  102. //sprintf(cadenaNumerica,"%d",bitmap);
  103.  
  104. //SDL_WM_SetCaption ( "Dibujando..." ,(const char*) 0);
  105. //cout << "(b)La referencia de bitmap es <" << cadenaNumerica << ">\n";// y el puntero <" << *bitmap << ">\n";
  106. //sprintf(cadenaNumerica,"%d",canvas);
  107. //cout << "(b)La referencia del bufferScreen es <" << cadenaNumerica << ">\n";// y el puntero <" << *canvas << ">\n";
  108.  
  109. SDL_Rect bitmapRect;
  110. bitmapRect.x=x;
  111. bitmapRect.y=y;
  112. bitmapRect.w=bitmap->w;
  113. bitmapRect.h=bitmap->h;
  114.  
  115. SDL_SetColorKey(bitmap,SDL_SRCCOLORKEY|SDL_RLEACCEL,colorKey);
  116.  
  117. SDL_BlitSurface(bitmap,NULL,canvas,&bitmapRect);
  118. };
  119. };


Sprite.cpp
Código:
  1. #include <SDL/SDL.h>
  2. #include <iostream>
  3. #include <String>
  4. #include <math.h>
  5. #include "Bitmap.cpp"
  6.  
  7. using namespace std;
  8. #ifndef SPRITE
  9. struct ConstGameEngine2D { // Tipo que define todas las constantes del motor
  10. struct DirectionAt // Tipo DirectionAt (indica hacia donde se mueve o apunta el objeto gráfico)
  11. {
  12. enum cardinalPoint{ South=0,East,North,West };
  13. };
  14. };
  15.  
  16. // Clase Sprite
  17. class Sprite: public Bitmap{
  18. bool isSpriteControlledOn;
  19.  
  20. public:
  21. bool IsSpriteControlledOn(){
  22. return isSpriteControlledOn;
  23. }
  24.  
  25. void SetSpriteControlledOn(){
  26. isSpriteControlledOn=true;
  27. }
  28.  
  29. void SetSpriteControlledOff(){
  30. isSpriteControlledOn=false;
  31. }
  32.  
  33.  
  34. Sprite(GameEngine2Dbase * engine) : Bitmap(engine) {
  35. isSpriteControlledOn=false;
  36. //sprintf(cadenaNumerica,"%d",engine);
  37.  
  38. (*engine).InsertSprite((Sprite*)this);
  39. x=0; y=0;
  40. };
  41.  
  42. ~Sprite(){
  43. };
  44.  
  45. void SetMove(ConstGameEngine2D::DirectionAt CardinalPoint, int value){
  46. };
  47.  
  48. ConstGameEngine2D::DirectionAt GetDirectionAt(){
  49. };
  50.  
  51.  
  52. // Restaura la ultima posicion almacenada
  53. void SetOldCoordinates(){
  54. };
  55.  
  56. // Restaura la ultima posicion X almacenada
  57. void SetOldX(){
  58. };
  59.  
  60. // Restaura la ultima posicion Y almacenada
  61. void SetOldY(){
  62. };
  63.  
  64. void SetBitmap(Bitmap & bitmap){
  65. };
  66.  
  67. // Fija la posicion de comienzo
  68. void SetPosition(int X, int Y){
  69. x=X; y=Y;
  70. };
  71.  
  72. void PutSprite(){
  73. DrawBitmap(x,y);
  74. }
  75.  
  76. // void SetColisionOn()
  77. // {
  78. // };
  79.  
  80. // bool isColision()
  81. // {
  82. // return true;
  83. // };
  84.  
  85. // Sprite & GetCollision()
  86. // {
  87. // Sprite & spriteHit;
  88. // return spriteHit;
  89. // };
  90.  
  91. void SetControlledSpriteOn(){
  92. };
  93. };
  94.  
  95. //#define Sprite() Sprite((GameEngine2Dbase*)GE2D)
  96.  
  97. #endif


Forma de crear un Sprite, Sprite * misprite=new Sprite((GameEngine2Dbase*)GE2D);
El constructor toma como argumento el motor, que es la clase principal. De esa forma el motor sabe que hay un sprite nuevo, y este se añade a su lista de sprites, con la que controlará las colisiones (todavía sin acabar) y el render, como por ejemplo tener en cuenta el orden de pintado.
De momento cuenta con dos métodos funcionales, LoadBitmap() y SetPosition(). No tiene más porque este proyecto lo toco de tiempo en tiempo y si lo tengo Risa .

- El motor principal, se encarga de la gestión de todos los objetos que participan en un juego, entre ellos los Sprites, pero si el tiempo me deja, podría gestionar sonido y más cosas. De momento solamente arranca en un único modo de 640x480, me encantan los modos pixelados, dispone de un método para cambiar el modo que no está aún definida, es porque no se si implementar eventos como ResizeWindow y cosas así. El motor es una clase singletona Risa , toda una soltera que no se deja casar, dicho de otra forma, no es posible ni recomendado instanciarla.
Funciona de la siguiente forma; iniciar motor GE2D->InitEngine();
Permite definir acciones en base a unas teclas, pensaba incluirlo a los Sprites, pero eso complicaría el funcionamiento y personalmente pienso que el trabajo es mejor dejárselo al motor, por eso comenté que el motor gestiona los eventos. Para definir un evento en base a la tecla usamos el método SetControlKey(int,void(*)(void)) El primer argumento toma el código de la tecla, si se lo suministramos desde las constantes del SDL queda más legible, el segundo argumento es la función que cumplirá la acción que queramos que haga, por ejemplo ahí trabajaríamos el proceso de mover, disparos, etc... La función previamente deberá ser declarada, y luego al final del main() puede ser definida. Luego la última y más importante operación del motor es actualizar, de esa forma el motor está constantemente comprobando y controlando los objetos que intervienen con el. Para ello debemos llamar el método Update() y a la vez usar un bucle infinito, por ejemplo con while(true).

GameEngine2D.cpp
Código:
  1. #include <SDL/SDL.h>
  2. #include <iostream>
  3. #include <String>
  4. #include <list>
  5. #include <map>
  6. #include <math.h>
  7. #include "Sprite.cpp"
  8.  
  9. using namespace std;
  10.  
  11. #ifndef GE2D
  12.  
  13. // Clase principal, clase 2DGameEngine
  14. class GameEngine2D : protected GameEngine2Dbase{
  15. private:
  16. //Sprite * testSprite;
  17. //defineKeyMap defineKeys;
  18.  
  19. map<int, void (*)(void) > defineKeyMap;
  20.  
  21. static GameEngine2D * pInstance;
  22.  
  23. Uint8* keyState ;
  24.  
  25. SDL_Event event; // Captura eventos, como la pulsacion de teclas
  26.  
  27. // Color de fondo
  28. int backGroundColor;
  29.  
  30. char cadenaNumerica[50];
  31. public:
  32. static GameEngine2D * Instance(void);
  33.  
  34. // Constructor
  35. GameEngine2D(void){
  36. };
  37.  
  38. // Destructor
  39. ~GameEngine2D(void){
  40. };
  41.  
  42. // Inicializar el motor
  43. void InitEngine(void){
  44. keyState = SDL_GetKeyState(NULL);
  45. // Asignamos a PANTALLA lo que se denomina como un buffer. Nos servirá de lienzo
  46. // para que podamos pintar sobre el. Indicándole el tamaño, bit por pixel,etc..
  47. bufferScreen = SDL_SetVideoMode(800,600,32,SDL_SWSURFACE|SDL_DOUBLEBUF);
  48.  
  49. sprintf(cadenaNumerica,"%d",bufferScreen);
  50.  
  51. cout << "(g)Iniciando bufferScreen con referencia <" << cadenaNumerica << ">\n";// y el puntero <" << *bitmap << ">\n";
  52.  
  53. // Color de fondo por defecto en Azul
  54. backGroundColor = SDL_MapRGB(bufferScreen->format, 0,0,200);
  55.  
  56. // Inicializamos el modo gráfico en una ventana.
  57. SDL_Init(SDL_INIT_VIDEO);
  58. atexit(SDL_Quit);
  59.  
  60. //testSprite=new Sprite(this);
  61. //testSprite->LoadBitmap("pj_1.bmp");
  62.  
  63. };
  64.  
  65. void Update(void){ // Verdadero ENGINE o MOTOR
  66. // Limpiamos la pantalla
  67. SDL_FillRect(bufferScreen, &bufferScreen->clip_rect, backGroundColor);
  68.  
  69. // REcogemos los eventos
  70. if(SDL_PollEvent(&event))
  71. if ((event.key.keysym.sym==SDLK_ESCAPE) || (event.type == SDL_QUIT)) exit(1); else
  72. // Buscamos las teclas definidas...
  73. for( map<int,void (*)(void) >::iterator ii=defineKeyMap.begin(); ii!=defineKeyMap.end(); ++ii){
  74. //sprintf(cadenaNumerica,"%d",engine);
  75. if (event.key.keysym.sym==(*ii).first ) {// y si coincide con la pulsada invocamos el metodo asociado
  76. SDL_WM_SetCaption ( "Evento..." ,(const char*) 0);
  77. (*ii).second();
  78. };
  79. };
  80.  
  81.  
  82.  
  83. // Comprobamos las colisiones
  84.  
  85. //for ()
  86.  
  87. // Pintamos todos los sprites
  88. spriteList<Sprite*>::iterator sprite;
  89. sprite = sprites.begin();
  90. while( sprite != sprites.end()){
  91. (*sprite++)->PutSprite();
  92.  
  93. }
  94.  
  95. //testSprite->DrawBitmap(0,0);
  96.  
  97. sprintf(cadenaNumerica,"%d",bufferScreen);
  98. cout << "(g)La referencia del bufferScreen es <" << cadenaNumerica << ">\n";// y el puntero <" << *bufferScreen << ">\n";
  99.  
  100. // Volcamos la PANTALLA a la ventana visible
  101. SDL_Flip(bufferScreen);
  102. };
  103.  
  104. void SetControlKey(int keyCode, void (*pFuntion)(void) ){
  105. defineKeyMap[keyCode]=(*pFuntion);
  106.  
  107. };
  108.  
  109. void SetMode(void){
  110. };
  111. };
  112.  
  113. // Definimos un singleton que nos permita trabajar con hilos
  114. GameEngine2D * GameEngine2D::pInstance=NULL;
  115.  
  116. GameEngine2D * GameEngine2D::Instance(void){
  117. if(pInstance == NULL) pInstance = new GameEngine2D();
  118. return pInstance;
  119. }
  120.  
  121. #define GE2D GameEngine2D::Instance()
  122.  
  123. #endif


Y aquí una demo sencilla, practicamente no hace nada, crea dos bitmaps (Sprites), define la tecla ARRIBA y cuando es pulsada cambia el título de la ventana. Pulsando ESCape saldréis de la aplicación.
Código:
  1. #include "GameEngine2D.cpp"
  2.  
  3. using namespace std;
  4.  
  5. void SetMove();
  6.  
  7. /*************Funcion Principal***********************/
  8. int main(int argc, char *argv[]){
  9. //char cadenaNumerica[50];
  10. GE2D->InitEngine();
  11.  
  12. Sprite * pj=new Sprite((GameEngine2Dbase*)GE2D),
  13. * pnj=new Sprite((GameEngine2Dbase*)GE2D);
  14. //sprintf(cadenaNumerica,"%d",GE2D);
  15.  
  16. pj->LoadBitmap("pj_1.bmp");
  17. pj->SetPosition(100,100);
  18. // pj->SetCollisionOn(); // Es un objeto que se tendra en cuenta en la rutina de colision del MOTOR
  19. pj->SetSpriteControlledOn();
  20. GE2D->SetControlKey(SDLK_UP,SetMove); // Asigna una tecla e invoca un método cuando se pulse la tecla
  21. //GE2D->SetControlKey.RIGHT(SDLK_RIGHT,"SetMove()");
  22. // GE2D->SetControlKey.BUTTON("disparo",SDLK_SPACE,"SetMove()"); // define un boton, le asigna tecla y una accion
  23.  
  24. pnj->LoadBitmap("MURO_1.bmp");
  25. pnj->SetPosition(0,0);
  26.  
  27. while(true){
  28. GE2D->Update();
  29. };
  30.  
  31. return 0;
  32. }
  33.  
  34. void SetMove(){
  35. SDL_WM_SetCaption ( "Prueba" ,(const char*) 0);
  36. }


Toda esta información sobre el desarrollo va de cara a la gente que sabe programar, osea que entiende de C++, pero de cara al usuario novel, lo que se intenta hacer es una simple librería, osea, un ficherito que deberéis linkar y poner la cabecera GameEngine2D.h, y usar los objetos de forma intuitiva sin ninguna complicación, también se evitará que el usuario final pueda manipular los punteros, pero de momento esta es la versión boceto rápido jajajaj. Por lo que ahora veréis mucha basura en el código.

Bueno no estoy seguro de que algún día la acabe, pero como muchas cosas que voy dejando en el foro, espero que alguien las utilice a su antojo y pueda continuar o mejorar el legado. Ordenador



Ultima edición por WhiteSkull el Jueves 16 Ago 2012 20:24; editado 2 veces
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Vila
Usuario Inquieto


Registrado: 14 May 2010
Mensajes: 137
Ubicación: Vulpesheim

Mensaje Publicado: Jueves 12 Jul 2012 15:00

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

WhiteSkull escribió:
(Próximamente)

Algunas vez se han preguntando que pasaría si convirtieramos un puñado de funciones de C en un paquete de objetos práctico? Seguro que cuando piensa en POO se le nubla la vista, jajajaj, suele ocurrir en el desarrollo, pero una vez que tienes tus propias clases luego ves las cosas así:

[...]


Hola White Skull.
Me gustaría que me explicases qué es SDL. Supongo que una biblioteca de clases que ayuda en el desarrollo de aplicaciones gráficas. ¿Desde qué lenguajes se puede usar? ¿Se puede utilizar desde C++ Builder o desde C#?
Saludos


"Más sabe el zorro por programador que por zorro"
Z. Reynard
Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Jueves 12 Jul 2012 15:54

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Vila escribió:
Me gustaría que me explicases qué es SDL. Supongo que una biblioteca de clases que ayuda en el desarrollo de aplicaciones gráficas.

Supones medio bien Risa , se trata de una biblioteca con funciones simples, pero no contiene clases, porque está desarrollado en C. Cómo es obvio si C++ mantiene la compatibilidad con C, podrás trabajar con la mayoría de compiladores de C++, si hacer nada especial. Por eso lo que se trata en este proyecto, es orientar el paquete a objetos, y de paso evitar que el usuario final tenga contacto con los punteros.

Vila escribió:
¿Se puede utilizar desde C++ Builder o desde C#?
Si, de hecho si visitas la página hay envolventes, aunque si te manejas bien con C# no tendrás inconveniente en cargar la DLL e invocar sus funciones.

Recuerden que para "importar" una dll en C# , tenemos...
Código:
  1. [System.Runtime.InteropServices.DllImport("milibreriadeC.dll")]
  2. ...


luego declaramos la función que queremos invocar, pero debe tener el nombre y parámetros exactos, esto lo podemos hacer observando la cabecera h o con un editor hexadecimal abriendo el fichero DLL. Pero de todas formas, no habrá que ir tan lejos porque desde la página oficial podemos obtener toda la documentación y utilidades.
http://www.libsdl.org/

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
enanogm
Usuario Iniciado


Registrado: 29 Ago 2012
Mensajes: 14

Mensaje Publicado: Viernes 31 Ago 2012 21:11

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

hola
una pregunta

este engine que estas haciendo, ya se puede usar?
aunque sea para cosas simples como vos decias?

osea, si copio el codigo en un proyecto puedo compilar y ejecutar? o falta algun header o algo?

Gracias
saludos

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Viernes 31 Ago 2012 21:59

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Claro, puedes usarlo. El requisito es disponer de la librería SDL, que debes linkar en el proyecto, tal como observas en la cabecera de GameEngine2D.cpp. De momento no tiene mucho, gestiona eventos del teclado, gestión del objeto Sprite, el cual dispone de un par de métodos. Lo siento está en una fase muy primitiva y yo no tengo tiempo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
wiserlander
Usuario Inquieto


Registrado: 01 Abr 2013
Mensajes: 77
Ubicación: La isla picuda.

Mensaje Publicado: Sábado 06 Abr 2013 01:56

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Estupendo aporte WhiteSkull, varios días llevo en esta web, pero debo estar ciego al no haber visto este gran aporte antes, al menos para mi es grande.

Llevaba una semana peleándome con SDL, solo para aprender como instalarla y usar el ejemplo que trae C::B por defecto, hasta hace poco que conseguí hacerla funcionar y probar varios ejemplos.

Ahora la pelea la tengo con SFML, en el intento de hacer lo mismo que SDL, osea que compile un código simple de ejemplo sin errores y compilar, compila, pero el ejecutable resultante me da un error que dice: La memoria no se pudo written y se cierra, le he dado vueltas pero creo que uno de los cuatro módulos de memoria devén estar mal o algo relativo al hardware.

En fin, muchísimas gracias WhiteSkull, por compartir este proyecto SDL, lo voy a tomar como base de referencia.

EDITO: Ya de paso, tengo unos errores al compilar el ejemplo dado...


E:\C++\SDL\Sprite.cpp||In member function 'ConstGameEngine2D::DirectionAt Sprite::GetDirectionAt()':|
E:\C++\SDL\Sprite.cpp|82|warning: no return statement in function returning non-void [-Wreturn-type]|
E:\C++\SDL\GameEngine2D.cpp||In member function 'void GameEngine2D::InitEngine()':|
E:\C++\SDL\GameEngine2D.cpp|60|warning: format '%d' expects argument of type 'int', but argument 3 has type 'SDL_Surface*' [-Wformat]|
E:\C++\SDL\GameEngine2D.cpp||In member function 'void GameEngine2D::Update()':|
E:\C++\SDL\GameEngine2D.cpp|92|warning: suggest explicit braces to avoid ambiguous 'else' [-Wparentheses]|
E:\C++\SDL\GameEngine2D.cpp|129|warning: format '%d' expects argument of type 'int', but argument 3 has type 'SDL_Surface*' [-Wformat]|


E:\C++\SDL\GameEngine2D.cpp|155|error: ISO C++ forbids declaration of 'Instance' with no type [-fpermissive]|
E:\C++\SDL\GameEngine2D.cpp|155|error: prototype for 'int GameEngine2D::Instance()' does not match any in class 'GameEngine2D'|
E:\C++\SDL\GameEngine2D.cpp|37|error: candidate is: static GameEngine2D* GameEngine2D::Instance()|

||=== Construcción finalizada: 3 errors, 4 warnings (0 minutes, 0 seconds) ===|


Entiendo que lo que está marcado en azul son los errores críticos que no permiten terminar la compilación, lo que está en marrón se debe arreglar pero puede escapar en algunos casos y la verdad es que no se como puedo hacer para reparar los errores.

Ayuda please!

Saludos cordiales. Fumao


Normalmente, hace mas el que quiere, que el que puede!
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Sábado 06 Abr 2013 17:44

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Cuelga la carpeta de ese proyecto a un servidor de descargas directas y me pasas el enlace de descarga... examinaré el proyecto y te cuento.

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
wiserlander
Usuario Inquieto


Registrado: 01 Abr 2013
Mensajes: 77
Ubicación: La isla picuda.

Mensaje Publicado: Sábado 06 Abr 2013 18:50

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Ok , ahi lo tienes, muchas gracias.

En este caso, estoy usando C::B + MingW + SDL 1.2.15.

http://wiserlander.sytes.net/SDL_de_WhiteSkull.7z

Saludos cordiales. Fumao


Normalmente, hace mas el que quiere, que el que puede!
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Domingo 07 Abr 2013 01:00

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

No hay errores.

Yo me imagino que es algo que estás haciendo mal en Code::Blocks. Mira... cuando crees el proyecto, incluye solamente el main.cpp, conservando las demás fuentes en el directorio donde se encuentra el main.cpp(en teoría esto es así porque la librería de mi engine está sin compilar). Luego acuérdate de que el binario debe ejecutarse en compañía del SDL.dll (de la misma versión). Tampoco hace falta indicarte que el proyecto tiene que tener incluido el directorio de las cabeceras de la librería SDL, así como la ruta de las librerías estáticas y que el linker hay que agregarle:

-lmingw32 -lSDLmain -lSDL

Ah!, recuerda también que en mi código se aduce a dos ficheros bmp que no tienes y que puedes sustituir por otros.

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
wiserlander
Usuario Inquieto


Registrado: 01 Abr 2013
Mensajes: 77
Ubicación: La isla picuda.

Mensaje Publicado: Domingo 07 Abr 2013 02:58

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Gracias por tu ayuda!!!

Sin duda algo estoy haciendo mal...

La parte de configuración del compilador la tengo asi:

En compiler setting ningun Checkbox está marcado, tal y como venia predefinido.

Misma pestaña, subpestaña -> other options = nada y #defines = nada.

En linker settings, tengo enlazadas solo dos librerías:

libSDL.dll.a
lidSDLmain.a


hay varias librerías similares que tiene un punto al principio pero no se si esas debo linkarlas también.

._libSDL.dll.a
._libSDL.la
._libSDLmain.a

Cuando instale SDL, pensaba que habrían mas librerías que linkar, me extraño un poco que solo fueran dos, no se si es correcto o debería tener tantas librerías como archivos de cabecera tiene SDL.

En otras opciones del linker lo tengo exactamente como recomiendas.

-lmingw32 -lSDLmain -lSDL

En search directories:

Subpestaña compiler, tengo incluida la carpeta SDL, osea la principal donde esta todo lo de SDL y también la carpeta Include del mingw, donde están todas las cabeceras del compilador.

Subpestaña linker en también en Search directories, tengoa la carpeta lib del compilador, hay es donde están todas las librerías, incluidas las que trae SDL con extensión *.a, las que tiene el punto al principio también.



El resto es como venia por defecto, en la instalación.


Lo que no sabia es que el proyecto tiene que tener incluidas las carpetas con las cabeceras de SDL, pues pensé que al estar linkadas desde la configuración del compilador, no haría falta incluirlas en el proyecto, por ese lado tomo nota.

Las librerías estáticas, supongo que te refieres a SDL.dll, la tengo en C:\windows\system32, SysWow64 y carpeta BIN del compilador, junto con las demás, SDL_image.dll y SDL_ttf.dll.

Pero no sabia que también había que ponerlas en la carpeta del proyecto, también tomo nota.

En el editor de variables globales solo uso la dirección base apuntando a la carpeta base de SDL, include y lib están en blanco, por que el tutorial que seguí para la instalación, asi lo recomendaba.

Por otro lado he visto no recuerdo donde, que se recomendaba crear un proyecto de consola en vez de hacerlo con la plantilla que trae codeblocks, para empezar con SDL. ¿Que opinas sobre esto?

Es posible me haya confundido, entremezclando informaciones de diferentes fuentes, guías y tutoriales.

Desde luego, lo que tengo claro es que si la base de instalación esta mal, el producto también tendrá problemas, es lo mismo que cuando pintamos un coche o una pared, primero hay que lijar muy bien para que el acabado sea espectacular...


El tema de las imágenes se me paso por la cabeza pero pensé que compilaría bien, solo que se vería todo negro.
El hecho de que intente compilar sin que las imágenes estén es su sitio, ¿puede dar lugar a errores, como los que mostré mas arriba?

Voy a poner en practica tus recomendaciones...

Por cierto...
¿Que versión de SDL usas tu?, yo estoy con 1.2.15, creo que es la ultima, lo pregunto para usar la misma, no sea que los errores que tengo también vallan por ese camino.

Muchas gracias por tu esfuerzo, tiempo y paciencia, es de apreciar! WhiteSkull.

Saludos cordiales. Fumao


Normalmente, hace mas el que quiere, que el que puede!
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Domingo 07 Abr 2013 04:49

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

wiserlander escribió:
¿Que versión de SDL usas tu?, yo estoy con 1.2.15, creo que es la ultima, lo pregunto para usar la misma, no sea que los errores que tengo también vallan por ese camino.

No me acuerdo para que versión empecé esto... pero lo he probado con la versión que me has mencionado y también con el compilador que indicas.

wiserlander escribió:
Las librerías estáticas, supongo que te refieres a SDL.dll, la tengo en C:\windows\system32, SysWow64 y carpeta BIN del compilador, junto con las demás, SDL_image.dll y SDL_ttf.dll.

No, las librerías estáticas son las que se linkan en la compilación, suelen tener una "o" o una "a" de extensión, en cambio la librería dinámica es la de la extensión dll, de ella el programa obtiene las funciones que necesita mientras se ejecuta.

wiserlander escribió:
Sin duda algo estoy haciendo mal...

La parte de configuración del compilador la tengo asi:
...

Lo siento yo no trabajo con CB, en el pasado me dio muchos problemas así que no lo uso. Para MingW uso DEV C++, que tampoco se queda atrás generando errores.

En la wiki de CB te explica como configurar el proyecto para SDL:
http://wiki.codeblocks.org/index.php?title=Using_SDL_with_Code::Blocks

Te en cuenta que las rutas que te muestra son orientativas, tú debes saber que cuando hablamos de cabeceras del SDL hablamos de, desde la ruta del directorio donde lo descomprimiste, include y include/SDL, y cuando hablo de librerías estáticas entonces nos referimos a todas las contenidas en el directorio lib. La librería dinámica la necesita el programa SDL una vez compilado, y para funcionar requiere que se encuentren en el mismo directorio o localizada desde la variable del sistema PATH, yo no recomiendo meter las librerías dinámicas en el directorio de Windows, porque luego se te crean conflictos por las versiones y sin darte cuenta llenas el directorio de librerías que nunca vas a usar. La dll de SDL suele encontrarse en el directorio bin del directorio de SDL.

Saludos...
Sol

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
wiserlander
Usuario Inquieto


Registrado: 01 Abr 2013
Mensajes: 77
Ubicación: La isla picuda.

Mensaje Publicado: Domingo 07 Abr 2013 11:47

Título del mensaje: Re: Como crear un motor para juegos usando C++ y SDL

Responder citando

Ahora tengo las cosas mas claras!Ok

Sobre: http://wiki.codeblocks.org/index.php?title=Using_SDL_with_Code::Blocks.

Esa wiki la tuve muy en cuenta en el momento de empezar a instalar SDL, aunque me pareció que lo que explicaban no se detallaba minuciosamente y tomé mas referencias de diferentes sitios, contrastando diferentes fuentes para lograr lo que hoy tengo como instalación de SDL, para esto no hay nada mejor que tener varios monitores operativos Reir

Algunos errores en conceptos básicos por mi parte, tratando de empezar la casa por la azotea, creo que tratare de leer mas y limitarme a temas mas básicos de momento, por que confundir librerías estáticas con dinámicas... ya dice por donde van los tiros y es que hay que aprender a caminar antes de empezar a correr. Por supuesto que lo digo por mi mismo!

Tomo nota de lo que comentas, todo queda guardado en el disco duro. Ordenador

Te agradezco el esfuerzo y la orientación. Aplauso


Saludos cordiales. Fumao


Normalmente, hace mas el que quiere, que el que puede!
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Solicito programadores para mi proyecto

alexpin Bolsa de trabajo 0 Miércoles 23 May 2018 22:53 Ver último mensaje
El foro no contiene ningún mensaje nuevo

COmo puedo entrar a los Menus de una Verifone V...

manuelomeli Temas generales 0 Miércoles 23 May 2018 19:58 Ver último mensaje
El foro no contiene ningún mensaje nuevo

AYUDA: COMO RECONECTO VB6 A MYSQL SIN PERDER LA...

rjaguin Visual Basic y VBA 0 Miércoles 09 May 2018 22:27 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Crear lazo en matlab

MarcoAntonio2017 Programación en general 0 Martes 10 Oct 2017 13:43 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Problema para extracción de datos utilizando py...

liz Python 1 Viernes 06 Oct 2017 11:05 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,