Vereis, un colega y yo intentamos hacer un juego multiplataforma (Win32/Linux) en 2D desde hace algun tiempo. Nos dedicamos horas y horas a intentar hacer un motor xa q moviera todo el juego. Y una parte eran los graficos.
Lo que nosotros llamamos "motor gráfico" lo hemos programado usando la SDL sin OpenGL, es decir, utilizando las funciones de Blit de la SDL y algun acceso bloqueando alguna superficie. Esta en C++ y puedes añadir objetos rollo textos, capas, fondos con scroll, sprites, y cosas de ese palo.
Pero los problemas vienen si queremos hacer rotaciones, escalamientos, efectos de color o fades de los sprites y estas cosas.
Que me recomendariais:
1) Utilizar OpenGL para dibujar en 2D (teniendo en cuenta que usaremos SDL para la entrada / sonido / ... )
2) Ingeniarme mis funciones para conseguir estos efectos ( alguna sugerencia ;-D )
3) Otros ...
Por cierto que es eso que he oido de que SDL es muuu leeenttaa pa dibujar, tendriamos alguna otra solución buena para poder conservar el codigo multiplataforma.
Bueno, saludos.
Rotaciones y escalados se pueden hacer usando SDL pero via software por lo que sera lento... depende de la maquina minima que pidais (echa un vistazo a una lib llamada SDL_gfx). Efectos de color pues depende lo que quieras y los fades... se pueden conseguir bien por software.
Tambien puedes mirar glSDL que es un backend 2D que utiliza opengl para la acelaracion y no tendras que tocar nada de tu codigo y con leves modificaciones, podeis conseguir escalados y rotados via opengl utilizando lo que ya tienes hasta ahora.
Otra opcion es utilizar SDL solo para el input,sonido y demas... y utilizar directamente OpenGL en modo 2D.
Y no hagas caso a eso que dicen de SDL = lento, porque no es asi. Si quieres probar benchmark puedes pasarte por mi web y te descargas el glSDL, o en este foro, busca un subforo que se llama CRM32Pro y alli hay otro test puramente 2D y software y de paso ves mi lib... lastima que no la hubieras visto antes jeje, seguro que os habia ahorrado muchas cosas...
Anything else? :D
Ummm, parece bastante interesante lo de tu libreria, le echaré una vistazo de todas formas ... (no sé como puedes codificar en ensamblador, yo me volvía loko en las prácticas con el 8086, jeje )
Lo del backend no sé muy bien q significa, pero le pegaré un ojo al glSDL ese también.
Espero a ojear un poco la CRM32Pro para ver como resuleves algunas cosas y sigo postenado más dudas ...
Gracias.
Cita de: "_XUTI_H_"Ummm, parece bastante interesante lo de tu libreria, le echaré una vistazo de todas formas ... (no sé como puedes codificar en ensamblador, yo me volvía loko en las prácticas con el 8086, jeje )
Lo del backend no sé muy bien q significa, pero le pegaré un ojo al glSDL ese también.
Espero a ojear un poco la CRM32Pro para ver como resuleves algunas cosas y sigo postenado más dudas ...
Gracias.
Acabo de actualizar la lib.... despues de trabajar duro en ella. Tenia que pulir varias cosillas por ahi....
Pues pregunta lo que quieras, que si no soy yo, algun otro te ayudara (ole)
me voy a descansar un poco jeje
Más preguntas: :ph34r:
Aunque el juego que pensamos hacer ahora seria freeware, en caso de querer utilizar nuestro motor para realizar un juego, por ejemplo, shareware, más adelante. ¿Como está el tema de las licencias de glSDL y SDL_gfx (y ya puestos tus librerias, TheAzazel, ;-D)?
pues a riesgo de que se me ponga a cardo, yo te aconsejo que si lo que quereis hacer es un juego 2d te pilles el BlitzMax, es "sencillo", muy potente y extremadamente flexible, en el sentido de que puedes ampliarlo con tus propias funciones que crees en c++ o las que crean otras personas.
Este lenguaje te proporciona imágenes con alpha, escalables, con bordes suavizados,..., permite programación orientada a objetos y es multiplataforma (windows, linux y mac).
Sobre el tema de las licencias creo que no tienes que pagar ninguna, estoy casi seguro pero no te lo puedo asegurar.
Pues eso, que si lo único que quereis hacer es un juego 2d con una calidad profesional, este es vuestro lenguaje.
Saludos.
Citaryo te aconsejo que si lo que quereis hacer es un juego 2d te pilles el BlitzMax
Hombre, de momento nos hemos pegado ya un buen currote con lo que tenemos en cpp, y tampoco creo que sea buena idea tener q rediseñar todo para adaptarlo.
El BlitzMax no lo he usado, me quedé en el Blitz3D, y el tema de programar en pseudoBasic tampoco me emociona especialmente. Pero como te digo no he visto las posibilidades de BlitzMax ...
Realmente acabar el juego ahora mismo puede que no sea lo más importante para nosotros. Lo que buscamos, además de aprender un poco de "tecnologia", es intentar crearnos nuestro propio motorcillo, a nuestra manera y con nuestros vicios (buenos y malos).
De todas maneras llevamos mucho tiempo en plan onda sinosiodal (ahora gastamos esto, ahora intentamos programarlo nosotros, ahora buscamos otras librerias para hacer lo que nos hemos planteamos 1000 veces, ... XDD) y si he de serte sincero no sé como vamos a acabar haciendo las cosas, así que gracias por la reflexión, era lo que nos faltaba para volver a replantearnos otra vez todo (jeje, otra vez en el punto d salida, wueno casi ;) )
Espero + propuestas ...
BlitzMax es lo último en motores para videojuegos, actualmente solo es para 2d y deja a años luz a Blitz3d.
Yo tambien estaba haciendo un proyecto en Blitz3D, el cual llevaba muy avanzado en cuanto a la interfaz gráfica, pero debido a las limitaciones de Blitz3D, para mostrar imágenes con bordes suavizados, con alpha,... necesetaba crear unos algoritmos realmente complicados y nada efectivos, por lo que he decidio pasarlo a BlitzMax y la diferencia es avismal, el desarrollo es unas 50 veces más rápido y unas 100 veces de mayor calidad y rendimiento. En cuanto a la velocidad de ejecución es casi similiar a utilizar c++.
Ahora bien, si dices que lo que quieres es crear tu propio motor gráfico con tu "estilo" pues entonces no se para que estas utilizando SDL, ya que es "exactamente" lo mismo que BlitzMax, solamente que este último está mucho más currado.
Un consejo, prueba BlitzMax, busca juegos hechos con el, y no te quedes solo con los ejemplos que bienen en el lenguaje ya que me parecen bastante pobres.
Saludos.
Cita de: "pelmazote"Sobre el tema de las licencias creo que no tienes que pagar ninguna, estoy casi seguro pero no te lo puedo asegurar.
80$ para adquirir el programa y su licencia para poder comercializar los juegos que hagas con el. Echa un vistazo en su web.
Cita de: "pelmazote"BlitzMax es lo último en motores para videojuegos, actualmente solo es para 2d y deja a años luz a Blitz3d.
Weno, eso de que es lo ultimo en motores... BlitZ Max no es un motor, es un lenguaje de programacion orientado a juegos, no es lo mismo. RPG Maker por ejemplo si es un motor de juegos.
Cita de: "pelmazote"En cuanto a la velocidad de ejecución es casi similiar a utilizar c++.
Imposible, siendo un lenguaje interpretado como es no puede tener una velocidad similar a la de un lenguaje compilado como es C/C++ ni por asomo.
Cita de: "pelmazote"Ahora bien, si dices que lo que quieres es crear tu propio motor gráfico con tu "estilo" pues entonces no se para que estas utilizando SDL, ya que es "exactamente" lo mismo que BlitzMax, solamente que este último está mucho más currado.
No te equivoques, como te he dicho atnes, BlitZ Max es un lenguaje con funciones orientadas a la creacion de juegos (el resultado es un interprete de codigo al fin y al cabo), SDL simplemente es una libreria de funciones, no un lenguaje. SDL no deja de ser una simple capa que añades a un lenguaje como C++, es como si me dices que DirectX u OpenGL son lo mismo que BlitZMax cuando no es asi :P
SDL + C++ te da mas libertad en cuanto a programacion y requiere mas trabajo de desarrollo que BlitZ Max o cualquier otro lenguaje de juegos que te da las cosas tan mascadas.
_XUTI_H_, aunque habeis dejado claro que quereis desarrollar vuestro propio motor con SDL y C++ yo os recomendaria que echarais un ojo a otro lenguaje de programacion de juegos que no esta nada mal, completo, multiplataforma, con una gran comunidad detras de el y sobre todo gratuito,
Fenix (
Sitio oficial,
Portal FenixWorld)
Salu2...
No quiero menospreciar a los diversos motores que hay para programar juegos, tampoco pondré a caldo a pelmazote, cada cosa tiene su utilidad para según la persona, el lugar y el momento, pero en este caso parece claro que XUTI quiere aprender y tener su propio motor, y hacer sus propios efectos, tener algo portable, rápido, gratis, y que además lo que aprenda no se quede obsoleto en 4 días.
Esta bien usar SDL y las librerías de Azazel porque hay muchas cosas que no son de programación gráfica que es un coñazo tener que implementarlas uno mismo, pero para lo que es el dibujo en sí, lo mejor es usar OpenGL, potencia y versatilidad sin más limite que uno mismo.
Citar2) Ingeniarme mis funciones para conseguir estos efectos ( alguna sugerencia ;-D )
te pongo unos ejemplos para que veas de que va más o menos, luego busca más información sobre los comandos, mira las ayudas, tutoriales y ejemplos terminados, practica y experimenta mucho, y ve creando tus propias funciones a medida que haces cosas nuevas. Esto no se aprende en cuatro días pero al menos lo que aprendas te servira para siempre y no dependeras de nadie, y además en un futuro podrás ampliar el motor a las 3D.
para iniciar el entorno
glViewport(0,0, AnchoVentana, AltoVentana); // dimensiones del puerto de vista igual a la ventana
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // se reinicia la matriz de proyeccion
glOrtho(0, AnchoVentana, 0, AltoVentana, -1.0, 1.0); // se establece el volumen de trabajo
glMatrixMode(GL_MODELVIEW); // se activa la matriz de modelo para trabajar con ella
glClearcolor(0,0,0);
para crear una textura.
glGenTextures( 1, piedra); // generamos un nuevo identificador de tetura
glBindTexture(GL_TEXTURE_2D, piedra); // activa la creacion de un nombre
glTexImage2D(GL_TEXTURE_2D, 0, 4, 256,256, 0, GL_RGBA, GL_UNSIGNED_BYTE, DatosTextura);
glEnable(GL_TEXTURE_2D);
para dibujar un triangulo coloreado
glBegin(GL_TRIANGLES); // dibujar triangulos
glColor3ui(255, 0, 0); glVertex2f (0.0f, 1.0f);
glColor3ui(0, 255, 0); glVertex2f (0.87f, -0.5f); // y cada vertice.
glColor3ui(0, 0, 255); glVertex2f (-0.87f, -0.5f);
glEnd();
para dibujar un cuadrado con textura (sprite)
glBindTexture(GL_TEXTURE_2D, textura);
glBegin(GL_QUADS); // dibujar cuadrados
glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0); // se establece cada coordenada de textura
glTexCoord2f(1.0, 0.0); glVertex2f(TamX,0.0); // y cada vertice.
glTexCoord2f(1.0, 1.0); glVertex2f(TamX,TamY);
glTexCoord2f(0.0, 1.0); glVertex2f(0.0, TamY);
glEnd();
Para usar transparencia o mezclas de color con el fondo.
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_NOTEQUAL, 0xFF); // si el valor alpha no es igual a 0 el pixel pasa el test
glEnable(GL_BLEND); // se activa y luego se establece el tipo de mezcla que queramos
glBlendFunc(GL_DST_COLOR, GL_ONE); // (col Origen * col Destino) + (col Destino * 1)
Para rotar, desplazar y escalar
glRotatef(20, 0, 0, 1.0); // rota el dibujo o sprite 20 grados
glTranslatef(100.0, 0, 0); // Lo traslada 100 unidades en el eje de las x
glScalef(2.0, 2.0, 1.0); // Lo Escala x 2
Si no quieres complicarte de momento la vida con las matrices, reinicia la matriz antes de situar, rotar, escalar y dibujar cada sprite, asi.
glMatrixMode(GL_MODELVIEW); // seleccionamos la matriz de modelo
glLoadIdentity(); // la reiniciamos
glTranslatef(300.0, 260, 0); // situamos el sprite
DibujarPersonaje();
Y antes del render hay que borra el buffer de color y al final hay que intercambiarlo.
glClear(GL_COLOR_BUFFER_BIT); // borrar el buffer de color
// dibujos
glFlush(); // despachar comandos pendientes
SwapBuffers(hDC); // intercambiar buffer
Recuerda que si quieres desactivar algo tienes que usar glDisable
ej: glDisable(GL_BLEND);
Practica haciendo figuras con glBegin/glEnd, se pueden hacer puntos, lineas, triangulos, cuadrados, con GL_TRIANGLE_FAN podras hacer circulos coloreados o sprites circulares, modificar sus vertices para hacer efectos tipo burbuja, o goma, bueno... la verdad es que cuando controles podras hacer lo que te de la gana y aún así siempre tendras cosas nuevas que aprender, te aseguro que nunca se te va a quedar pequeño.
También te recuerdo que tendrás que usar algunas funciones (pocas) que son diferentes para cada plataforma que no son estrictamente de OpenGL pero que son necesarias para poder usarlo en cada entorno, aunque si vas a usarlo junto a SDL Seguramente Azazel te pueda ayudar.
Quizás vas a encontrar muchos problemas hasta conseguir hacer lo que quieres en cada momento, pero si realmente te gusta esto disfrutarás resolviendolos (yo disfruto mucho cada vez que consigo que funcione algo).
suerte y hasta otra.
1.- Es cierto que hay que pagar por el programa, pero como ocurre con blitz3d y blitzbasic estoy casi seguro que no hay que pagar licencia alguna para comercializar sus juegos, de ser así en su web no lo mencionan.
2.- ok, es lo último en lenguajes de programación de videojuegos.
3.-
CitarImposible, siendo un lenguaje interpretado como es no puede tener una velocidad similar a la de un lenguaje compilado como es C/C++ ni por asomo.
Pues solamente te invito a que te pases por los foros de blitzmax y hagas tu mismo la prueba, quedaras sorprendido:
Velocidad de blitzmaxCitarSDL + C++ te da mas libertad en cuanto a programacion y requiere mas trabajo de desarrollo que BlitZ Max o cualquier otro lenguaje de juegos que te da las cosas tan mascadas.
¿Te da más libertad?, dime una sola cosa que puedas hacer con las librerias de SDL que no puedas hacer con BlitzMax.
No compares BlitzMax con cualquier otro lenguaje de juegos ya que no te da nada mascado que no te lo de SDL o cualquier otra libreria. Realmente estoy arto de la gente que menosprecia estos lenguajes de programación y que se cree que si los utilizan son menos "hombres" ya que te facilitan el trabajo. Mira, el 99.9 de los que quieren hacer un juego y empiezan por hacer su propio motor gráfico, pues simplemente no llegan a acabar nada nunca. Para programar videojuegos hay que seguir una curva de aprendizaje, no se puede dividir antes de saber sumar.
Ya por último, das a entender que BlitzMax no vale nada y prentendes encastetarles Fenix????????????? por favor un poco de seriedad.
_XUTI_H_, yo solamente te recomiendo que te bajes la version de prueba de BlitzMax y no perdais el tiempo con SDL ya que en absoluto es la mejor opción para empezar a programar juegos.
Saludos.
Está claro que si no tienes mucha idea y quieres hacer unos juegos concretos yo buscaría lo mas fácil y que me lo dieran todo mascado. Me quito un montón de quebraderos de cabeza y voy al grano sin tanta paranoia. Pero está claro que no voy a poder trabajar con nadie más, a no ser que también use ese motor o lenguaje determinado. También tendré muchas lagunas porque como siempre me lo han dado todo hecho....
Pero si quieres aprender de verdad y te gusta, disfrutas solucionando los problemillas que van surgiendo, tienes paciencia y quieres dedicarte a ello en un futuro, hay que morder el polvo y pelearse con los punteros, el DirectX y sus versiones, los formatos, y la madre que los parió, claro... para eso te tiene que gustar mucho, porque si no es absolutamente imposible. Y tampoco hay que tener prisa por hacer el juego del siglo porque aprender es cuestión de años, y con tener unos conocimientos básicos de C ya se puede empezar por el buen camino aunque sea para hacer un juego de parchís en GDI.
Todos los sistemas son buenos, quizás la cuestión es preguntarse cada uno ¿que quiero hacer?, ¿para que lo quiero?, ¿que necesito?, ¿de donde vengo y a donde voy?, e informarse bien para no ir dando palos de ciego.
un saludo, y a ver que opina XUTI
que bueno ray, gracias a ti he recuperado las 200 fps que perdia en opengl respecto a directx, es increible jaja, perdona que me ria, pero es que me di cuenta que no tenia el glFlush antes del swap (uoh)
saludos
editado: incluso ahora con opengl tengo picos de 20 fps mas que con directx ;)
Buenasss.
Tampoco quiero pecar de "vanidoso", seguro que vosotros habeis hecho mil cosas más que yo y conoceis mucho más estos temas (por eso os pido opinión), pero tampoco es el primer juego que hago y supongo que un poco de idea tengo del tema.
El problema de los juegos (o demos, mejor dicho) que he realizado hasta ahora es que tienen un código bastante desordenado y lleno de parches, ahora mismo lo que nos interesa es crear codigo robusto y estructurado, preferiblemente en C++, y que podamos aprovechar para reutilizarlo en proyectos futuros. (si experiencia también nos hace falta mucha XD )
OpenGL lo he gastado muy poco, en prácticas de Informática Gráfica. Y sé que tengo mucho que aprender de esto, pero queria intentar sacarle el máximo provecho a las funciones de Blitting de la SDL como os dije antes. De todas maneras es una opción que me interesa mucho así que te agradezco mucho los apuntes sobre esto Ray, se lo plantaré a mi compañero y igual nos ponemos como lokos a reescribir funciones, jeje ;)
Bueno creo que ya queda dicho todo, pero lo de Blitz o Fenix me parecen buenas opciones para realizar pruebas o prototipos ràpidos. Hace tiempo usaba Div2 para hacer pruebas de los que más tarde pasaba a C.
Cuando decidamos que vamos a utilizar os comentamos (y preguntamos ;) ) más cosas.
Gracias a todos.
Citar1.- Es cierto que hay que pagar por el programa, pero como ocurre con blitz3d y blitzbasic estoy casi seguro que no hay que pagar licencia alguna para comercializar sus juegos, de ser así en su web no lo mencionan.
Si no pagas por el blitzmax o blitz3D no tienes derecho a comercializar tus juegos, si compras el programa ya estas pagando por el programa y por la licencia para poder comercializar tus juegos. Es de logica.
CitarPues solamente te invito a que te pases por los foros de blitzmax y hagas tu mismo la prueba, quedaras sorprendido: Velocidad de blitzmax
Que se que acerque por 3 o 4 segundos a C++ en unas pruebas sencillas de bucles e incrementos de variables no es nada del otro mundo. Que hagan Benchmarks con operaciones graficas utilizando las mismas librerias entre los dos lenguajes y entonces hablamos por que ahi es donde se vera la velocidad del lenguaje en cuanto a juegos, que los graficos es la parte que mas pesa en un juego y no una variable numerica que se incrementa. Que esto es asi, blitzmax con su varias capas de codigo e interfaces y que da como resultado un interprete de pseudo-codigo compilado no puede ser tan rapido como un lenguaje compilado.
Citar¿Te da más libertad?, dime una sola cosa que puedas hacer con las librerias de SDL que no puedas hacer con BlitzMax.
Un lenguaje que no este orientado a un campo especifico siempre te dara mas libertad que un lenguaje orientado a juegos.
CitarNo compares BlitzMax con cualquier otro lenguaje de juegos ya que no te da nada mascado que no te lo de SDL o cualquier otra libreria. Realmente estoy arto de la gente que menosprecia estos lenguajes de programación y que se cree que si los utilizan son menos "hombres" ya que te facilitan el trabajo. Mira, el 99.9 de los que quieren hacer un juego y empiezan por hacer su propio motor gráfico, pues simplemente no llegan a acabar nada nunca. Para programar videojuegos hay que seguir una curva de aprendizaje, no se puede dividir antes de saber sumar.
Menospreciar? Donde has visto que diga que BlitzMax o sus semejantes son una mierda que no valen para nada? Te has molestado en mirar en que lenguaje programo por ejemplo? Utilizo VB junto con mi libreria como si de un BlitzBasic se tratase y este si es un lenguaje menospreciado y limitado. No digas cosas que no son por que hasta yo en mi web o con gente que me pide consejo acabo recomendando lenguajes como BlitZMax o incluso, el que tu si que parece que desprecias, Fenix. No te inventes palabras donde no las hay. Si yo no estuviese embarcado en mi proyecto estaria programando en BlitZ3D o BlitZMax.
CitarMira, el 99.9 de los que quieren hacer un juego y empiezan por hacer su propio motor gráfico, pues simplemente no llegan a acabar nada nunca.
Date un paseo por paginas como esta y paginas de grupos de desarrollo y despues me cuentas de donde te sacas es 99.9 de proyectos fracasados, majo :P La mayoria de proyectos que no se terminan principalmente son por que sin tener experiencia ni recursos han tratado de llevar a cabo un proyecto de gran envergadura (el ejemplo mas popular, un MMORPG :P) y un proyecto asi en C++, Fenix, VB, BlitzMax o el lenguaje que se te ocurra nunca llegara a buen puerto si no se tiene los medios ni los conocimientos para llevarlo a cabo. Y es mas, ya que vuelves a confundir "lenguaje" con "motor", BlitzMaX te da las funciones para dibujar y demas facilidades, pero tendras que programar un motor para hacerte un juego o es que acaso BlitzMax genera motores automaticamente de la nada? :P
CitarYa por último, das a entender que BlitzMax no vale nada y prentendes encastetarles Fenix????????????? por favor un poco de seriedad.
El chaval buscaba algo gratuito para desarrollar un proyecto comercial y yo aconsejo una opcion gratuita, completa y que dia a dia sigue a adelante gracias a una comunidad como la que tiene atras. Pocos proyectos tan desinteresados vas a encontrar por ahi con un nivel semejante. Que no es mejor que BlitzMax? totalmente de acuerdo pero Fenix es una opcion tan valida como la que mas y gratuita. Y no recomiendo la dx_lib32 por tener que programar en VB6 si no iba haber tardado menos que
TheAzazel en publicitar y recomendar mi libreria :P
Citar_XUTI_H_, yo solamente te recomiendo que te bajes la version de prueba de BlitzMax y no perdais el tiempo con SDL ya que en absoluto es la mejor opción para empezar a programar juegos.
Leyendo esto denotas no tener mucha idea de lo que hablas asi que prefiero dejar el tema por que no veo final a esta discursion.
Conclusion, si no quieres aprender a programar a bajo nivel (DirectX, OpenGL, SDL...) un lenguaje orientado a desarrollo de juegos es una opcion excelente ya que te lo da todo preparado para desarrollar el juego, ya sea BlitzBasic, BlitzMax, Fenix, PureBasic, PlayBasic o cualquier variante que encuentres por la red. Si lo que quieres es aprender a programar desde la raiz tu motor para tu juego, C++ y SDL, Allegro, OpenGL u DirectX.
Salu2...
Esto es lo de siempre. La misma discusión una y otra vez por estos foros. Todo depende de lo que quieras hacer:
A ) Un juego
B ) Un motor 2d
C ) Un juego y un motor 2d
Y aquí te pongo algunas (ojo, no todas, solo algunas, de las opciones que tienes para 2d)
Si quieres A )
1) Usando pseudo-script
1a) Con aceleración gráfica:
- Torque 2d
- Blitz
1b) Por software
- Fenix
2) Usando una librería junto con un lenguaje como c++
- SDL
- Popcap framework
- Cmp32
- Dxlib_32
- Looverlib
- Ptk
Si quieres B )
1) Con aceleracion hardware
- Ogl
- Direc3d
2) Por sofware
- Tu mismo con tu mecanismo
Si quieres C )
Podría aplicarse el punto 2) de A) pero quizás ampliando el motor 2d algo más sin pensar solo en el juego en cuestión sino generalizándolo algo más.
Y echale un vistazo a mi librería 2d, muy chula pero asquerosamente no portable :) (solo D3d9)
Un saludo!
Wueno, vamos a ver, por ejemplo este es un proyecto pa una asignatura de la carrera
ZeldaEU. Dibuja utilizando GDI poque era lo que pedian en la asignatura: MFCs con C++ y GDI para dibujar en contextos de dispositivos.
Estoy pensando en continuar con el proyecto y llegar a poder hacer un juego completo. Debo implementar muchísisimas cosas, pero entre ellas un sistema de dibujado decente con doble buffer y esas cosas. El rollo es que si me pego el kurrote con esto, poder utilizarlo después para otros proyectos. Por tanto mi idea es hacer una "especie de motor gráfico en 2D".
A parte, tengo el problema de que con mi colega estoy desarrollando otro "motorcillo" con SDL. Mi principal aspiración seria diseñar un "cosa wapa" que pudiera integrar en este proyecto, y que me sirviera para el otro también (y para futuros intentos, jeje)
Wueno, si quereis le pegais un vistazo y me comentais ...
(X cierto, inicio rápido: abrir el editor, menu Fitxer/obrir y abrir el mapa Aventura.zel. Podeis toketear lo q querais, o jugar con F1)
Salu2 y gracias a todos.
EDIT: Por cierto zupervaca, yo tb soy asiduo de charas-project como veràs, jeje :P
Cita de: "zupervaca"que bueno ray, gracias a ti he recuperado las 200 fps que perdia en opengl respecto a directx, es increible jaja, perdona que me ria, pero es que me di cuenta que no tenia el glFlush antes del swap (uoh)
Y yo acabo de comprobar por experiencia ajena los efectos que tiene el no ponerlo :lol:
por cierto... no necesitaras por casualidad esto:
glGetTexImage
Hola de nuevo. Cada vez creo que estoy más convencido de utilizar OpenGL. Pero todavía tengo unas dudas. A ver si Ray o alguien puede echarme un mano:
+ (Ante todo y pudiendo pecar de igsnorante d la vida supongo que el OpenGL tiene algún tipo de aceleración de hardware) El tema de ir canviando de textura para cada sprite (GlBindTexture) , ¿supone envio de transacciones PCI a la tarjeta?, según tengo entendido esto retrasa bastante el dibujado.
Entonces tendria que cambiar la forma que tengo de dibujar para optimizar este proceso, ya que ahora lo que hago es ordenar el dibujado por una profundidad "virtual", es decir, una variable que dice que sprite está más al fondo, y que sprite está más cerca ... y puede darse el caso de que por ejemplo el array de sprites listos para dibujar en orden tenga la siguiente secuencia: Text1, Text4, Text1, Text6, Text2, Text4, ...
Que me recomendais, ¿se puede activar algún tipo de z-buffer?, ¿es una buena solución?, ¿usar el tema ese de la multi-textura (se supone que reducimos la velocidad de dibujar cada "poligono")?, ¿crear textures enormes con todos los sprites posibles e ir cambiando la coordenadas u,v?, ¿más opciones?
Arggg, ya me sale humo, es que esto d pensar muxo, jeje (uoh)
Bueno, y por si alguien no vio el link de antes es este
ZeldaEUSalu2 y gracias
El cambio de textura en OpenGL puede provocar una transferencia desde la memoria del sistema hasta la memoria de vídeo, dependiendo de si la textura está ya allí o no. Es interesante que ordenes los sprites por textura, aunque no indispensable para obtener un rendimiento aceptable con el hardware de hoy en dia. Si quieres hacer algo comercial, entonces sí deberias preocuparte por el tema, ya que en tarjetas antiguas con 16mb podrías tener problemas de "texture trashing".
Lo preferible suele ser planear la carga gráfica de modo que todas las texturas que necesitas usar en un sólo frame quepan en memoria de vídeo. No siempre es posible, en ese caso, ordena por texturas para realizar el menor número de intercambios.
El uso del zbuffer suele ser casi "gratis", puedes usarlo sin miedo.
El problema principal de OpenGL ahora mismo es la incertidumbre sobre su rendimiento en el próximo Windows Vista <_< .. aunque dado que DirectX9 tambien estará bajo una capa de compatibilidad, deberia ir bastante suelto. Teóricamente, un PC que es capaz de hacer funcionar correctamente Windows Vista, deberia tener una tarjeta gráfica moderna.
PD: Por cierto el multi-texturing sirve para dibujar polígonos con varias texturas combinadas, que no suele ser demasiado frecuente en juegos 2d.
No te preocupes, OpenGL esta más que preparado para mover y trabajar con una gran cantidad de texturas y calculos 3d. Por lo que podras dibujar cientos de sprites 2D a 100 fps, con alfas, mezclas, filtros, recortes, máscaras, tramados, operaciones lógicas de color, niebla, etc... sin problemas, si son sprites muy grandes no podrá soportar cientos lógicamente, pero de todas formas no te iban a caber en la pantalla por lo que no hay ningun problema.
glBindTexture sirve precisamente para eso, para cambiar rapidamente de una textura a otra, el efecto que tu dices surgiría si cargasemos la textura con glTexImage2D antes de dibujar cada sprite (que también se puede hacer).
Lo de crear texturas enormes y asignar al sprite las cordenadas de textura es buena idea para acelerar el tema, y además OpenGL solo puede trabajar con texturas que sean potencias de 2, de 256x256 o 512x512 está bien, tampoco hace falta que te pases.
[COUTE]
puede darse el caso de que por ejemplo el array de sprites listos para dibujar en orden tenga la siguiente secuencia: Text1, Text4, Text1, Text6, Text2, Text4, ...Que me recomendais, ¿se puede activar algún tipo de z-buffer?
[/COUTE]
Si, se puede, si te fijas en algunos de los ejemplos situaba los objetos con glTranslate la cual tiene 3 coordenadas. x, y, z, la coordenada z podrás usar para establecer la profundidad de cada objeto. pero para usar el z-buffer o test de profundidad como siempre hay que activar el estado correspondiente concretamente glEnable(GL_DEPTH_TEST); y para establecer el tipo de operación glDepthFunc(GL_LESS); dibujar cuando sea menor (más cerca).
Tambien al usar el z-buffer se usa un buffer paralelo al de color, con lo cual tendriamos 2 buffers diferentes que hay que borrar al mismo tiempo en la llamada a clear.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
También hay ampliar la profundidad del volumen de trabajo, por ejemplo si queremos que tenga de profundidad 100 hacia atras y 500 hacia adelante:
glOrtho(0, AnchoVentana, 0, AltoVentana, -100.0, 500.0);
Los dibujos saldran igual de tamaño independientemente de la distancia porque hemos usado glOrtho, si queremos que tenga perspectiva usariamos glFrustum, y los objetos más lejanos saldrás mas pequeños. pero eso ya pertenece al mundo de las 3d.
hmmm.... La verdad es que nunca he probado a usar el z-buffer sobre una proyeccion ortogonal por lo que no puedo asegurar que funcione eso que te he comentado y si habrá algún tipo de problema en hacerlo.
Zaelsius:
[COUTE]
El problema principal de OpenGL ahora mismo es la incertidumbre sobre su rendimiento en el próximo Windows Vista dry.gif ..
[/COUTE]
Si, es una cabronada, seguramente la pretensión es que OpenGL esté siempre un paso por debajo que DirectX en cuanto a rendimiento, pero me da igual, sigo prefiriendo OpenGL, y para 2D siempre va a ir sobrao.
PD: ZeldaEU me da error.
Perdon por el archivo corrupto, lo habia subido (por alguna extraña razón) como ASCII en vez de como BINARIO).
Ahora ya funciona, d todas formas pongo el link otra vez más:
ZeldaEU.
A la tercera va la vencida. Salu2
Ya sale (ole)
Pero no me funciona.... :(
vamos, quiero decir que no se como se maneja, porque toco todas las teclas y el ratón y no hace nada, se ve como una cama y un rectangulo sobre un mapa.
tiene buena pinta para ser en gdi, y la música esta guapa para ser midi, lástima que no haya podido probarlo.
Pues sí, estaría bien que tu proximo proyecto fuera ese mismo juego pero en SDL/OpenGL, aunque.... decías que ya se había montado el pollo en el programa y se hacía muy dificil de actualizar, no te preocupes eso suele pasar a lo primero, y la solución es empezarlo de nuevo, siempre sale mejor cada vez que repites y si no mira a los diseñadores del DirectX que cada dos años lo hacen de nuevo y les sale un poco mejor.
Y no tengas prisa, piensa que necesitarás ampliar y reutilizar muchas cosas en el futuro, no atajes, no escatimes, no utilices variables globales si no es absolutamente imprescindible, luego lo vas a agradecer muchísimo. Intenta también aprovechar los algoritmos y rutinas que ya tienes hechos.
Un saludo y hasta otra.
Cita de: "Ray"toco todas las teclas y el ratón y no hace nada, se ve como una cama y un rectangulo sobre un mapa.
Eh??
Bueno, no paran de salir bugs ultimamente, jeje XDDDD
Es un editor de niveles, una vez abres el aventura.zel (desde menu "Arxiu/obrir", con doble-click desde el documento no carga bien) puedes ejecutarlo con F1 o desde el menu "Edicio/Executa Joc". Los controles estan en el txt.
Tampoco es gran cosa, pero como he visto que te habia interesado ...
Por cierto, si alguien lo prueba y no le funciona me molaria que me dijerais cual es el error y que equipo teneis. Gracias :)
Citary la música esta guapa para ser midi,
Gracias :D, es bastante repetitiva, pero aunque hubiera dispuesto de programas con samples y hubiese podido poner la musica en ogg, tampoco hubiera ganado mucho el tema, todavia me falta mucho que aprender tb de esto XDD
A mi si me funciono y no he visto ningun fallo exceptuando el parpadeo que provoca el refresco del GDI, pero esto es inevitable :)
Esta muy bien el editor de escenarios y el motor en si, sobre todo para estar hecho con el GDI (ole)
Salu2...