elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Librería de apoyo para la creación de videojuegos SDL/OpenGL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Librería de apoyo para la creación de videojuegos SDL/OpenGL  (Leído 3,269 veces)
SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Librería de apoyo para la creación de videojuegos SDL/OpenGL
« en: 5 Septiembre 2013, 21:33 pm »

Buenas, ultimamente he tenido algunos días libres y he estado trabajando en una cosilla que he pensado que podría interesar y servir de ayuda a la hora de desarrollar videojuegos. Por supuesto, está en su versión alpha, y agradecería aportes, sugerencias y críticas que se hagan para que entre todos podamos ir mejorandola.

Basicamente, se trata de una serie de clases y funciones que podrían ser una base para cualquier videojuego. Esto quiere decir, una clase de la que derivan todos los objetos en pantalla, una clase que maneja estos objetos, etc. Es simplemente para partir de aquí cuando empezamos a desarrollar un videojuego, y así no tener que escribirlo todo cada vez.

He incluido además un el código de un pequeño juego que desarrollé en un par de horas con esta colección de archivos. Es un juego muy tonto, pero sirve de ejemplo para aprender la jerarquía de clases y todo eso.

Link: http://www.mediafire.com/download/6yvr866cp626a1a/Game_template.zip

Ningún archivo está compilado. He incluido el archivo de proyecto de codeblocks (para guardarlo como template) y el archivo Makefile si no tienes este IDE y usas linux.

Un saludo  y espero que os sirva
SrCooper

PD: Sinceramente, no sé usar los archivos Makefile. Espero que alguien me ayude con eso :laugh:

PD2: Acabo de darme cuenta de que hay que cambiar el SDL_GL_BUFFER_SIZE a 32 en la función init()


« Última modificación: 5 Septiembre 2013, 21:36 pm por SrCooper » En línea

kaltorak

Desconectado Desconectado

Mensajes: 71



Ver Perfil
Re: Librería de apoyo para la creación de videojuegos SDL/OpenGL
« Respuesta #1 en: 11 Septiembre 2013, 17:01 pm »

Hola SrCooper

he localizado un error a parte del que mencionas en el post mira.

Código
  1. void Entity::setCoords(int X, int Y)
  2. {
  3.  if (X != NULL) box.x = X;
  4.  if (X != NULL) box.y = Y;
  5. }

Aquí le dices que compruebe si X es distinto de 0 y le dices que ponga X, pero debajo no deberías comprobar si Y es 0 en vez de comprobar nuevamente X??

Aparte por que motivo no se puede colocar en la posición 0,0 ??

Esto no es un error pero si un mal habito de programación en opengl

Código
  1.  glBegin(GL_QUADS);
  2.  glTexCoord2i(0,0); glVertex2i(box.x, box.y);
  3.  glTexCoord2i(1,0); glVertex2i(box.x + box.w, box.y);
  4.  glTexCoord2i(1,1); glVertex2i(box.x + box.w, box.y + box.h);
  5.  glTexCoord2i(0,1); glVertex2i(box.x, box.y + box.h);
  6.  glEnd();

El motivo es que las tarjetas 3d mueven triángulos y no cuadrados, así que cuando le pasamos esto la tarjeta lo que hace es descomponer el cuadrado en 2 triángulos, con el gasto de recursos que ello con lleva, que si bien hoy en día es ínfimo, lo ideal para optimizar la librería seria que le pasaras los 2 triángulos en vez del cuadrado.

Haber si tengo un ratito esta noche y lo miro todo mas detenidamente  ;)

Un saludo
Kaltorak.


« Última modificación: 12 Septiembre 2013, 11:18 am por kaltorak » En línea



SrCooper

Desconectado Desconectado

Mensajes: 137


Bazinga!


Ver Perfil
Re: Librería de apoyo para la creación de videojuegos SDL/OpenGL
« Respuesta #2 en: 11 Septiembre 2013, 20:15 pm »

Sí, vi el error justo después de publicar el post. La función sería así:
Código
  1. void Entity::setCoords(int X, int Y)
  2. {
  3.  if (X != NULL) box.x = X;
  4.  if (Y != NULL) box.y = Y;
  5. }

La idea de la función setCoords era poder pasar NULL como parámetro si solo quieres cambiar una de las coordenadas. Tengo entendido que en un entero no es lo mismo poner 0 que poner NULL, ¿me equivoco?

No sabía lo de los triángulos. Para la próxima versión lo mejoraré.

Un saludo y gracias por echar un vistazo  ;)

SrCooper
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Librería de apoyo para la creación de videojuegos SDL/OpenGL
« Respuesta #3 en: 11 Septiembre 2013, 21:06 pm »

Citar
Tengo entendido que en un entero no es lo mismo poner 0 que poner NULL, ¿me equivoco?
Son equivalentes, de hecho NULL no es más que esto:
Código
  1. #define NULL 0

Los siguientes códigos serían igual de correctos para lo que tu quieres:

Código
  1. void Entity::setCoords(int X, int Y)
  2. {
  3.  if (X != NULL) box.x = X;
  4.  if (Y != NULL) box.y = Y;
  5. }

Código
  1. void Entity::setCoords(int X, int Y)
  2. {
  3.  if (X != 0) box.x = X;
  4.  if (Y != 0) box.y = Y;
  5. }

Código
  1. void Entity::setCoords(int X, int Y)
  2. {
  3.  if (X) box.x = X;
  4.  if (Y) box.y = Y;
  5. }
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
kaltorak

Desconectado Desconectado

Mensajes: 71



Ver Perfil
Re: Librería de apoyo para la creación de videojuegos SDL/OpenGL
« Respuesta #4 en: 12 Septiembre 2013, 03:43 am »

Como bien te a dicho amchacon poner NULL o poner 0 es exactamente lo mismo.

Una opción es poner -1 y así decirle al programa que no lo use poniendo este código.

Código
  1.    void Entity::setCoords(int X, int Y)
  2.    {
  3.     if (X >= NULL) box.x = X;
  4.     if (Y >= NULL) box.y = Y;
  5.    }
  6.  

O crear 2 nuevas funciones para definir cada una de las coordenadas por separado así.

Código
  1.    void Entity::setCoordX(int X)
  2.    {
  3.     box.x = X;
  4.    }
  5.  

Código
  1.    void Entity::setCoordY(int Y)
  2.    {
  3.     box.y = Y;
  4.    }
  5.  

Una comprobación que incluiría también en estas funciones, es que la coordenada introducida no exceda los limites de la pantalla, para evitar futuros errores a la hora de visualizar los objetos.

Y por ultimo y no con ello menos importante  ;D

Aquí te dejo un código para que veas como hacer un cuadro con dos triángulos en Opengl, tanto con color, como con texturas  ;)

Código
  1. #ifdef __cplusplus
  2.    #include <cstdlib>
  3. #else
  4.    #include <stdlib.h>
  5. #endif
  6.  
  7. #include <SDL/SDL.h>
  8. #include <SDL/SDL_opengl.h>
  9. #include <SDL/SDL_Image.h>
  10.  
  11.  
  12. int main ( int argc, char** argv )
  13. {
  14.  
  15. //Definimos las variable box y box1 del tipo SDL_Rect
  16. SDL_Rect box,box1;
  17.  
  18. //Inicializamos los valores de box para posicionarlo en las posicion 100,100 y le damos un ancho y un alto de 100.
  19. box.x = 100;
  20. box.y = 100;
  21. box.w = 100;
  22. box.h = 100;
  23.  
  24. /*Inicializamos los valores de box1 para posicionarlo en las posicion 300,200
  25.    y le damos el ancho y un alto de la imagen que vamos a cargar como textura.*/
  26. box1.x = 300;
  27. box1.y = 200;
  28. box1.w = 34;
  29. box1.h = 26;
  30.  
  31. //Inicializamos el modo de video de las SDL.
  32. SDL_Init(SDL_INIT_VIDEO);
  33.  
  34. //Creamos la Surface principal del juego, la que se va a mostrar en pantalla.
  35. SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWSURFACE | SDL_HWACCEL );
  36.  
  37. //Cambiamos el titulo de la ventana por "Cuadro Hecho con triangulos".
  38. SDL_WM_SetCaption ("Cuadro Hecho con triangulos", NULL);
  39.  
  40. //Activamos el modo Interpolado de Opengl
  41. glShadeModel(GL_SMOOTH);
  42. //cargamos la matriz de proyección en modo ortográfico al solo usar 2D
  43. glOrtho(0, 640, 480, 0, -1, 1);
  44.  
  45. //Carmos la imagen que vamos a usar como textura.
  46. SDL_Surface *Image = IMG_Load("conejo.png");
  47.  
  48. //Definimos la variable Textura que contendra la ID de la textura.
  49. GLuint Textura;
  50.  
  51. //Generamos el ID de la Textura.
  52. glGenTextures(1, &Textura);
  53. //Referenciamos la TExtura para que todas las operaciones posteriores afecten a esa textura.
  54. glBindTexture(GL_TEXTURE_2D, Textura);
  55. //Aplicamos los filtros a la textura para que se escale en funcion de la distancia.
  56. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  57. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  58. //Creamos la Textura.
  59. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Image->w, Image->h, 0, GL_RGB, GL_UNSIGNED_BYTE, Image->pixels);
  60.  
  61. //Liberamos la imagen cargada por que ya no la vamos a usar mas.
  62. SDL_FreeSurface(Image);
  63.  
  64.    bool done = false;
  65.    //Bucle principal
  66.    while (!done)
  67.    {
  68.        /*Comprobamos los eventos del sistema para comprobar si la ventana a sido cerrada o si se
  69.           pulsa escape en caso de que asi sea ponemos El valor true en done para que finalice la
  70.           ejecucion del programa.*/
  71.        SDL_Event event;
  72.        while (SDL_PollEvent(&event))
  73.        {
  74.            switch (event.type)
  75.            {
  76.            case SDL_QUIT:
  77.                done = true;
  78.                break;
  79.  
  80.            case SDL_KEYDOWN:
  81.                {
  82.                    if (event.key.keysym.sym == SDLK_ESCAPE)
  83.                        done = true;
  84.                    break;
  85.                }
  86.            }
  87.        }
  88.  
  89. ////////////Primer cuadro sin texturizar pintado de verde.///////////////
  90.  
  91.  //Seleccionamos el color verde para Pintar el primer cuadro.
  92.  glColor3ub(0,255,0);
  93.  //Comenzamos a pintar el primer cuadro usando 2 triangulos.
  94.  glBegin(GL_TRIANGLES);
  95.  //Primer triangulo
  96.  glVertex2i(box.x, box.y);
  97.  glVertex2i(box.x, box.y + box.h);
  98.  glVertex2i(box.x + box.w, box.y);
  99.  
  100.  //Segundo Triangulo
  101.  glVertex2i(box.x, box.y + box.h);
  102.  glVertex2i(box.x + box.w, box.y);
  103.  glVertex2i(box.x + box.w, box.y + box.h);
  104.  glEnd();
  105.  
  106. ////////////Fin del primer cuadro sin texturizar.///////////////
  107.  
  108.  
  109. //////////////////Segundo cuadro aplicándole texturas./////////////
  110.  
  111.  //Especificamos el modo de aplicar la textura sobre el cuadro para que no le afecte el color del cuadro.
  112.  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
  113.  
  114.  //Activamos la Textura para usarla en el cuadro
  115.  glEnable(GL_TEXTURE_2D);
  116.  //Comenzamos a pintar el segundo cuadro usando 2 triangulos.
  117.  glBegin(GL_TRIANGLES);
  118.  //Primer Triangulo
  119.  glTexCoord2i(0,0);glVertex2i(box1.x, box1.y);
  120.  glTexCoord2i(0,1);glVertex2i(box1.x, box1.y + box1.h);
  121.  glTexCoord2i(1,0);glVertex2i(box1.x + box1.w, box1.y);
  122.  //Segundo Triangulo
  123.  glTexCoord2i(0,1);glVertex2i(box1.x, box1.y + box1.h);
  124.  glTexCoord2i(1,0);glVertex2i(box1.x + box1.w, box1.y);
  125.  glTexCoord2i(1,1);glVertex2i(box1.x + box1.w, box1.y + box1.h);
  126.  glEnd();
  127.  //Desactivamos la textura.
  128.  glDisable(GL_TEXTURE_2D);
  129.  
  130.  ////////////////////Fin del Segundo cuadro usando texturas./////////////////////////
  131.  
  132.  //Mostramos el buffer en pantalla
  133.  SDL_GL_SwapBuffers();
  134.  
  135.    }
  136.  
  137. //Devolvemos 0 por que todo a salido bien.
  138. return 0;
  139. }
  140.  

Se que faltan muchas cosas, pero como era solo para que vieras como funcionaba lo de los dos triángulos no me he complicado mucho la vida  ;D

Aquí te lo dejo el código fuente, esta echo en Windows por que no puedo usar Opengl en Linux, por que lo tengo virtualizado con VirtualBox y no funciona  :-(

http://ultrashare.net/hosting/fl/38544fe607

Un saludo
Kaltorak.
« Última modificación: 12 Septiembre 2013, 07:24 am por kaltorak » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Apoyo para sql injection
Hacking
aivx 3 3,363 Último mensaje 16 Septiembre 2013, 21:38 pm
por aivx
Sony dará apoyo económico y comercial a videojuegos españoles
Noticias
wolfbcn 0 1,094 Último mensaje 10 Julio 2014, 01:55 am
por wolfbcn
Apoyo para descarga de documento de una web
Foro Libre
Pox1 0 1,863 Último mensaje 10 Octubre 2016, 06:54 am
por Pox1
Ayuso agradeció a los venezolanos por el apoyo para lograr su triunfo en Madrid
Foro Libre
Machacador 2 3,087 Último mensaje 6 Mayo 2021, 22:58 pm
por WHK
Apoyo con batch para FTP
Scripting
_CrisiS_ 1 2,304 Último mensaje 7 Febrero 2022, 03:23 am
por .xAk.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines