Autor Tema: Implementacion de javax.microedition.lcdui.game  (Leído 2252 veces)

Desconectado Zheo

  • Grupo_Moderadores
  • Miembro Imprescindible
  • *
  • Mensajes: 1.397
    • Ver Perfil
Implementacion de javax.microedition.lcdui.game
« en: Abril 25, 2006, 11:31:35 am »
Buenas, se que he estado muy muy desligado de esta p?gina, y tengo algunas cosas por hacer (SDL_Wrapper *ejem* :P constestar? ahora un hilo sobre su progreso )  pero estoy realmente ocupado y no puedo sacar mucho tiempo.

Esta semana santa, dentro de lo poco de estudio que hice, he terminado un proyecto que empec? en vacaciones de navidad: la implementaci?n del API para juegos que tienen los m?viles MIDP 2.0. Es decir, he implementado las clases del paquete javax.microedition.lcdui.game.

Es la primera versi?n finalizada, aunque est? sin depurar (me refiero a probarlo extensivamente en un proyecto m?s serio, no en las pruebas que hice) y sin optimizar ( (b?sicamente intentar? reducir el consumo de memoria, que suele ser la mayor preocupaci?n)

Para los que no lo conozcan, el game API incluye una clase para manejo de sprites, otra para mapas de tiles (tilemaps), un manejo de eventos de entrada mejorado (pulsaciones de teclas, vamos) y una clase de manejo de varias capas de tilemaps de forma conjunta.
Para los m?viles nokia tiene una clase m?s (ImageSet) para gestionar im?genes con tiles de forma m?s eficaz (b?sicamente es la t?pica mejora que consume un poco m?s de memoria, pero facilita mucho el dibujado de im?genes)
Recientemente he descubierto que la implementaci?n para nokia s?lo funciona correctamente en los m?viles de la serie 40, concretamente no funciona para los m?viles de la serie 60 por un bug en un m?todo de la biblioteca de nokia. Esto tampoco es mucho problema, ya que la serie 60 soporta midp2.0 En cualquier caso la implementaci?n que no usa el Nokia UI funciona correctamente, como en cualquier movil

El c?digo s?lo compila en NetBeans 5.0, ya que, como no tengo mucho conocimiento de ANT en Java, me pas? al NetBeans que incluye una especie de pseudo preprocesador al estilo de C++ (#define, #if, #ifelse, y esas cosas, algo vital para que con un s?lo fichero de c?digo compile para varias plataformas) sin embargo es una simple biblioteca .jar que puede incluirse en cualquier proyecto, en caso de querer utilizarla, por lo que se puede usar en cualquier IDE.

El caso es que si hay alguien interesado en hacer alguna prueba, o tiene alg?n proyecto en MIDP2.0 podr?a publicarla aqu? para que me dierais feedback. Incluso puede ser ?til para un proyecto real, aunque est? destinado a MIDP2.0, ya que, por ejemplo, cuando se compila en modo debug, se dibuja en pantalla los rect?ngulos de colisi?n de los sprites y cada una de las celdas que forman el tileMap como se ve en el ejemplo.

Ocupa unos 12Kbs lo que, en mi modesta opini?n, creo que est? bastante bien teniendo en cuenta que con eso ya tienes pr?cticamente el motor gr?fico del juego completo.

Bueno, pues eso, que me pareci? un detalle compartirlo con vosotros primero, y si a alguien le interesa, s?lo tiene que pedirlo.

Adjunto un jar de ejemplo, en modo debug. las im?genes son m?as, excepto la antorcha animada y el sprite que puedes mover, que est?n sacadas de internet. El ejemplo va a unos 30FPS en modo normal en un 6630  y a unos 20 en modo debug (seguro que puedo mejorarlo simplemente sin crear nuevos string por frame para albergar los n?meros que aparecen, es decir, algo que no tiene que ver con la biblioteca. Los que programen en J2ME ya sabr?n que a los m?viles les cuesta un poco crear strings, ya no te digo uno por frame :P)
Los rect?ngulos que se ven en algunas im?genes son, o bien el mapa de tiles, o bien el rect?ngulo de colision. Si el rect?ngulo de colision del sprite toca un tile con una imagen de la mesa, las sillas o las plantas aparecer? una 'C' escrita arriba, que indica que se ha detectado una colisi?n. No hay ni habr? nunca colisi?n por pixel. xD
« última modificación: Abril 27, 2006, 08:06:28 am por Zheo »

Desconectado Zheo

  • Grupo_Moderadores
  • Miembro Imprescindible
  • *
  • Mensajes: 1.397
    • Ver Perfil
Implementacion de javax.microedition.lcdui.game
« Respuesta #1 en: Abril 25, 2006, 11:33:23 am »
Dos cosas, lo primero que no subi? el jar, y lo segundo que la implementaci?n para m?viles sin NOKIA UI no soporta transformaciones de sprites, es decir, que no podemos rotarlo, reflejarlo, etc, necesitaremos im?genes nuevas para cada posici?n del sprite.

A ver si ahora sube bien...

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Implementacion de javax.microedition.lcdui.game
« Respuesta #2 en: Abril 26, 2006, 08:41:22 am »
Zheo sabemos que siempre estas presente en cuerpo y alma en este site, entendemos que estes liado y no puedas pasarte. Lo bueno es que lo poco que te pasas es para hacer colaboraciones tan buenas :)

Un saludo y hasta pronto.

Desconectado Zheo

  • Grupo_Moderadores
  • Miembro Imprescindible
  • *
  • Mensajes: 1.397
    • Ver Perfil
Implementacion de javax.microedition.lcdui.game
« Respuesta #3 en: Abril 26, 2006, 11:01:17 am »
Por cierto, he estado haciendo pruebas, y en la versi?n "release" mi biblioteca funciona a la misma velocidad en mi m?vil que con el mismo ejemplo con MIDP 2.0 "nativo" :king:
Ah? va la biblioteca en jar para m?viles gen?ricos. Tengo que probar un poco m?s la versi?n para nokia s40, la cual incluye adem?s fullscreen gracias a la clase FullCanvas de Nokia.

Desconectado keogh

  • Grupo_Moderadores
  • Experto
  • *
  • Mensajes: 371
    • Ver Perfil
Re: Implementacion de javax.microedition.lcdui.game
« Respuesta #4 en: Septiembre 28, 2008, 08:12:23 pm »
Orale xD, aunque es un post muy viejo hasta orita lo voy viendo :P, esta bien, lo acabo de probar en un Nokia N76. Solo que la imagen se ve muy pequeña :P. Yo actualmente estoy haciendo un PONG xD para celular, ya que termine la versión beta lo subo jejeje. Será algo sencillo, después me gustaría hacer un shooter 2D aca como Gradius :P.

Me gustaría saber como calculas los FPS :P, otra cosa cuales celulares  les cuesta crear strings :D.

s4lu2

Desconectado Zheo

  • Grupo_Moderadores
  • Miembro Imprescindible
  • *
  • Mensajes: 1.397
    • Ver Perfil
Re: Implementacion de javax.microedition.lcdui.game
« Respuesta #5 en: Octubre 01, 2008, 01:18:28 pm »
Tienes la última versión en Google Code:
http://code.google.com/p/midp10gameapi/

Los FPS los calculaba en ese ejemplo midiendo el tiempo que se tarda en generar un frame en milisegundos, y dividiendo 1000 entre ese número. Lo puedes ver como una regla de tres sencilla:
si en a ms calculamos 1 frame
en 1000ms calcularemos x frames

a es conocido, por tranto x = 1000/a

Por ejemplo si tardas 16.6666 ms en calcular un frame: 1000/16.6666 = 60 FPS
si tardas 33.3333 => 1000 / 33.3333 = 30FPS


Crear strings le cuesta a cualquier máquina  virtual de java.
Los strings son inmutables, es decir, se crea un objeto y nunca se modifica. Si parece que modificas una strings en realidad es un truco. Por ejemplo si haces

Código: [Seleccionar]
string s1 = "Hola";
string s3 = "Mundo";

string s = s1 + " " + s3;

En realidad estás creando, no 3 strings, sino 6. Las otras dos salen de
1ª string oculta: " "+ s3
2ª string oculta: s1 + (" "+ s3)

Al concatenar strings no puedes modificarlas, luego te ves forzado a crear strings nuevas. Puede que en el fondo no sean 6 sino 4 o 5 dependiendo de posibles optimizaciones del compilador, pero ya es una más de lo que parece.

Por tanto si en cada frame (pongamos que cada 33.3333 ms) creas un string para dibujar los FPS, estás creando más de 30 strings por frame!

En un móvil además es mucho peor, ya que éstos suelen tener la memoria limitada (ya no tanto como antes, pero siempre es un bien excaso) y esas strings se quedan en memoria hasta que el recolector de basura se lanza porque necesita la memoria (lo que de paso te comera ciclos :P). Además crear objetos es algo que a la J2ME le cuesta (en J2ME siempre es mejor reutilizar objetos ya creados que crearlos nuevos), y recuerda, estás creando 30 nuevos por frame si tienes 30FPS... aunque esto último no se si se aplica

Es un poco de todo,  que al final si lo sumas te hace la pascua.
« última modificación: Octubre 01, 2008, 01:47:25 pm por Zheo »