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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Motor juegos C++, openGL y codeblocks
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Motor juegos C++, openGL y codeblocks  (Leído 7,026 veces)
Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Motor juegos C++, openGL y codeblocks
« en: 25 Febrero 2015, 17:01 pm »

Muy buenas!:

He estado buscando y no encuentro lo que yo busco.

Tengo cierta experiencia programando juegos en Blender. Mientras aprendía a programar para Blender en python, toque Python (lo que viene siendo el programa en consola) y PyGame. Despues aprendí a programar en PHP y javascript en un curso. Despues pude aplicar lo aprendido de javascript para aprender Canvas. (para quien no sepa: lo que aprendí de canvas es mostrar imagenes. Lo demas realmente no es mas que javascript puro y duro.) Y ahora estoy a tope con C++.

Estoy viendo cosillas. Mirando por un lado y por otro. Aún no consigo nada realmente extraordinario o medianamente bueno como para estar orgulloso, y ya estoy buscando como hacer un juego.

El caso es: En los juegos que he echo en javascript funcionan de la siguiente forma:
 
Una funcion run() llama a Act(), Paint() y run() (si se llama a sí misma). Esta ultima pasados 0.017s.

Al llamarse a si misma en ese intervalo de tiempo se obtiene el bucle que engloba al juego.

Despues en Act() se hacen los calculos con las teclas que se pulsan y se dejan de pulsar.
Y por ultimo Paint() muestra el estado actual de los calculos de forma visual al jugador (dibujando el cubito en player.x=25 o player.x=500).

Busco hacer juegos a base de puro codigo. Nada de usar motores externos que despues dan errores que no tienen nada que ver con mi codigo. (Eso mismo me paso con Blender y por eso lo dejé de lado.)

Lo que quiero saber es: ¿Hay algo como el run() que acabo de explicar? ¿Se puede hacer en C++ que una funcion se llame a sí misma al cabo de X segundos o milisegundos sin que en ningún momento el programa quede como "no responde"? ¿Como lo hago exactamente? (se coger las teclas pulsadas y el ratón con OpenGL [mas o menos...])

(lo ideal como respuesta es: sentencia(parametros), forma de uso de la sentencia, librería necesaria para usarla y tipos de los parametros [int, double, char, string, boolean, matriz, tupla].)

Datos extra por si falta informacion:
- Utilizo Codeblocks 13.12.
- Sigo los tutoriales de minidosis.org.
- Tengo windows 7 64 bits.
- Estoy enfocado a usar OpenGL. (Por cabezonería. No pienso en hacer juegos DirectX.)
- Ya tengo todo lo necesario para correr OpenGL. (he echo pruebas)

Ejemplos de juegos que he echo en javascript: http://desiresportal.esy.es/juegos/


« Última modificación: 25 Febrero 2015, 17:03 pm por Desiresportal » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Motor juegos C++, openGL y codeblocks
« Respuesta #1 en: 25 Febrero 2015, 17:20 pm »

Y ahora estoy a tope con C++.

Si pretendes dominar C++, más vale que le dediques varios añitos... no es algo que se pueda controlar al 100% con un par de añitos de experiencia ;)

Una funcion run() llama a Act(), Paint() y run() (si se llama a sí misma). Esta ultima pasados 0.017s.

Eso se llama recursividad... si intentas hacer eso en un juego programado en código nativo, el juego va a morir en un par de segundos porque te has quedado sin pila. Lo más normal es que la función "run" tenga un bucle que ejecute "Act()", "Paint()", y añada una pausa del tiempo que sea necesario... sin recursividad.

Busco hacer juegos a base de puro codigo. Nada de usar motores externos que despues dan errores que no tienen nada que ver con mi codigo. (Eso mismo me paso con Blender y por eso lo dejé de lado.)

Para diseñar ese juego vas a hacer uso de la librería estándar... que aunque funciona estupendamente no está exenta de algún que otro bug.

Además también te vas a tener que apoyar en el sistema operativo... que también suelen ser famosos por tener bugs.

Moraleja: No tengas tanto miedo a usar librerías externas. Una cosa es que quieras aprender y por eso decides reinventar la rueda, pero a la hora de la verdad hay que ser práctico.

Lo que quiero saber es: ¿Hay algo como el run() que acabo de explicar? ¿Se puede hacer en C++ que una funcion se llame a sí misma al cabo de X segundos o milisegundos sin que en ningún momento el programa quede como "no responde"? ¿Como lo hago exactamente? (se coger las teclas pulsadas y el ratón con OpenGL [mas o menos...])

* En C++ no hay nada expecífico como el run() que acabas de comentar
* En C++ se puede programar la recursividad sin ningún problema... eso si, si no le pones límite, tu programa no saldrá bien parado
* Ejemplo de recursividad:

Código
  1. void func( )
  2. {
  3.  printf( "1" );
  4.  func( ); // Se llama a sí misma
  5. }
  6.  
  7. int main( )
  8. {
  9.  func( );
  10. }

(lo ideal como respuesta es: sentencia(parametros), forma de uso de la sentencia, librería necesaria para usarla y tipos de los parametros [int, double, char, string, boolean, matriz, tupla].)

Esta información podría ser útil si utilizases una librería externa para el motor gráfico, como no es así te lo tienes que currar todo tu.

- Utilizo Codeblocks 13.12.

El IDE que uses no es relevante. Eso únicamente te afecta a tí, asi que lo mejor es elegir uno con el que te sientas cómodo.

- Estoy enfocado a usar OpenGL. (Por cabezonería. No pienso en hacer juegos DirectX.)

Pues fíjate que DirectX obtiene mejores rendimientos y es más portable (dentro de las diferentes versiones de Windows y de tarjetas gráficas) que OpenGL, aun así tienes tus motivos y es una opción perfectamente válida.

PD.: no me apetece iniciar un debate sobre qué es mejor OpenGL o DirectX.

En Resumen. En C++ puedes hacer lo que te propongas, pero al ser un lenguaje de más bajo nivel que javascript, vas a tener que estar más atento a lo que haces... aquí no hay barreras y es muy fácil salirse del camino... eso sí, la satisfacción de hacer un programa completo compensa :)

Un saludo.


En línea

Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Motor juegos C++, openGL y codeblocks
« Respuesta #2 en: 25 Febrero 2015, 17:36 pm »

¿Y no hay algo como el "window.setTimeout(run(), 17);" de javascript pero para C++?

Ademas en javascript la "rellamada" de run() se hace antes de Act() y Paint() para que se hagan 60fps lo mas reales posibles. Sino tardaría 17 milisegundos despues de calcularlo y dibujarlo todo.

Mejor se hace antes y si ha dado tiempo a calcularlo todo y dibujarlo todo para cuando han pasado esos 17 milisegundos, bien. Sino, a por el siguiente frame.
En línea

Seyro97

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Motor juegos C++, openGL y codeblocks
« Respuesta #3 en: 5 Junio 2015, 01:30 am »

C++ es un lenguaje que es secuencial a primera vista, es decir, que las cosas se van haciendo en el orden que vas escribiendo. En el caso de javascript, es cierto que tenemos la función 'setTimeout', pero C++ no usa ese método.

En C++, para que algo se repita indefinidamente (hasta que se cierra el juego, o así) tienes, como ya se ha mencionado, la recursividad.

Un ejemplo:

Código
  1. void run() {
  2.    Act();
  3.    Paint();
  4.  
  5.    run();
  6. }

Analicemos:
Una vez se ejecuta por primera vez esa función 'run', se va a ejecutar Act(), posteriormente se va a ejecutar la función 'Paint' y por último se va a ejecutar la función 'run', y comencamos de nuevo el ciclo.

Si lo que quieres es pausar la función 'run' un tiempo determinado, harías lo siguiente:

Código
  1. #include <thread>
  2. #include <chrono>
  3.  
  4. void run() {
  5.    Act();
  6.    Paint();
  7.  
  8.    std::this_thread::sleep_for(std::chrono::milliseconds(17));
  9.    run();
  10. }

Lo que hace 'std::this_thread::sleep_for(std::chrono::milliseconds(17));' es pausar el programa entero 17 milisegundos

Este es un ejemplo algo tosco, por lo que habría que añadirle mas cosas para que vaya mejor. Suerte
En línea

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!
Br1ant


Desconectado Desconectado

Mensajes: 791


Incluso la "nada" es un "algo"


Ver Perfil WWW
Re: Motor juegos C++, openGL y codeblocks
« Respuesta #4 en: 5 Junio 2015, 10:17 am »

Bueno, no creo que ayude mucho, y dices que no quieres DirectX, pero puedes probar el motor Unity 5, en donde usas el sistema de scripting para codificar el juego. Puede ser javascript, o si quieres interactuar mucho más, C#. Boo no es muy tomado en cuenta.

La función que "engloba" el juego (ejemplo):

Código
  1. function Update () { // Función reservada que se ejecuta por cada frame
  2. // Función
  3. }

Para Act() tienes un script prefabricado en la librería.
Para Paint() tienes los famosos "GUITextures".

Y acerca del tiempo, no es neceario, ya que la función Update se ejecuta continuamente. De todas maneras puedes usar Corountines o simples yield WaitForSeconds(tiempo);.

Puedes revisar la documentación, si ya dominas javascript entonces no se te dificultará tanto.
En línea

Namasté, criatura.
Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Motor juegos C++, openGL y codeblocks
« Respuesta #5 en: 10 Marzo 2016, 17:41 pm »

Lo cierto es que al final me decanté por utilizar la funcion "display" para hacer ambos procesos. Primero "act" y despues "paint". Y utilizo la funcion "idle" de OpenGL para que se produzca la animacion cuando el usuario no pulsa nada.

Doy por cerrado el tema. Y gracias por la ayuda.
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Motor juegos C++, openGL y codeblocks
« Respuesta #6 en: 10 Marzo 2016, 21:05 pm »

Código
  1. window.setTimeout(run(), 17);

No sé mucho de javascript, pero creo que sé para qué sirve "window.setTimeout(run(), 17);" Sirve para que la función run() se ejecute cada 17 milisegundos, ¿no?. Si es el caso, en C++ no existe algo para hacer eso. Esa instrucción sirve para la sincronización vertical, es decir, para que el juego vaya a 60 FPS. Para activar la sincronización vertival en tu aplicación de C++, en Windows, se hace así:

Código
  1. wglSwapIntervalEXT(1);

Lo que hace la función es darle tiempo a la gráfica y al monitor a mostrar un fotograma.

El código general quedaría así:

Código
  1. // Inicialización de OpenGL
  2. ...
  3. wglSwapIntervalEXT(1);
  4. ...
  5.  
  6. // Función del bucle del juego (ejecutar cuando todo se haya inicializado
  7. void run() {
  8.   while(evento_cerrar_ventana == false) {
  9.      // Escribir todo lo que se hará en cada fotograma, como pintar, reproducir sonidos...
  10.   }
  11. }

_______________________________________________

Dejando el tema este tema, te recomiendo encarecidamente que uses unas librerías externas (tranquilo, no te quitan el trabajo gráfico, solo te FACILITA la vida) que son GLFW y GLEW (ambas gratuitas). La librería GLFW te permite crear un sistema de ventanas con pocas líneas, y es compatible tanto con Windows, Linux y Mac OSX (me parece), y GLEW te carga las extensiones de OpenGL (las necesitarás para trabajar con el OpenGL 3.3 en adelante). De verdad, es aburridísimo cargar las funciones nuevas de OpenGL y además no es multiplataforma... mejor usa GLEW y GLFW.

Te recomiendo una página, que aunque esté en inglés, es muy buena explicando lo referente a gráficos, y trabaja en C++. http://learnopengl.com/
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Menus y librerías para juegos. OpenGL. « 1 2 »
Programación C/C++
APOKLIPTICO 10 7,841 Último mensaje 20 Noviembre 2010, 17:03 pm
por APOKLIPTICO
Ejecutar juegos de Android con aceleración hardware OpenGL en Linux
Noticias
wolfbcn 0 2,166 Último mensaje 29 Noviembre 2012, 21:52 pm
por wolfbcn
Os presento el IscEngine, mi propio motor de juegos (100% C++11 + OpenGL)
Programación C/C++
BlackM4ster 0 2,012 Último mensaje 26 Febrero 2016, 16:28 pm
por BlackM4ster
Ayuda con el motor de juegos M.U.G.E.N
Programación General
Toreto1500 0 2,497 Último mensaje 10 Octubre 2018, 00:07 am
por Toreto1500
Ayuda sobre DLL injection y opengl - Hacking de juegos
Hacking
ghostff 4 3,070 Último mensaje 9 Febrero 2022, 21:06 pm
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines