× PortadaNoticiasTrabajoColaboraciónEnlacesForosIRCFormaciónNosotros
Stratos: Developer's Meeting Point

Welcome to Stratos!

Acceder



Plantilla J2ME - Helius (Autor : ethernet)
« 26 de Septiembre de 2006, 07:46:23 pm »
Aprovechando que la programacin de juegos para mviles est cada da ms presente en stratos y que ms gente est interesada en la programacin para estos dispositivos, Helius nos manda un cdigo a modo de plantilla para crear un juego en J2ME. Nos hace un pequeo resumen del cdigo:

Citar

Este COTW se trata de una plantilla para juegos sobre J2ME.

La plantilla est estructurada de tal manera que ya existe un thread con un bluce principal en el que se actualiza constntemente la pantalla del mvil.

Aparte, consta de algunas funciones de utilidad para responder al input y la capacidad de detectar si el mvil soporta o no doble buffer, en caso negativo lo realizar de forma manual.

Las funciones ms relevantes estn en la clase MainCanvas:

 - private final static void MAIN_Render(Graphics g)
 
 Aqu es dnde se deben pintar todos los grficos del juego.


 - private final static void MAIN_Loop()

 Aqu es donde se debe actualizar toda la lgica del juego.


 - private final static boolean INP_KeyDown(int key)

 Esta funcin nos dice si una tecla est pulsada en este momento. Hay que usar las constantes que estn definidads al principio de la clase (CONS_KEY_...) como parmetro.


 - private final static boolean INP_AnyKeyDown()

 Devolver true si cualquiera de las teclas est pulsada.


 - private final static boolean INP_KeyPress(int key)
 - private final static boolean INP_AnyKeyPress()

 Estas dos son iguales que las anteriores pero slo devolvern true una vez, hasta que vuelva a soltarse y volverse a pulsar la tecla.


Otra de las caractersticas es que est pensada teniendo en cuanta la posibilidad de poder realizar la compilacin, tanto para Nokias, como para mviles con MIDP 1 y mviles con MIDP 2, tan slo cambiando unas directivas de preprocesador.

Si tenis alguna duda podis contactarme a travs de los foros de Stratos (www.stratos-ad.com).



Cdigo: Plantilla_J2ME


La imagen que general el proyecto:          



Otro artculo que puede interesar leer para preparar el entorno es el que escribi zupervaca en su tutoblog:
- Preparndose para programar en j2me
Esperemos que esto sirva como base para los cursos  y grupos de iniciacin que se estn montando ahora mismo


Cdigo enviado por Nacho Snchez (Helius), http://www.geardome.com



Si quieres enviar un COTW, puedes enviarlo a qualopec@gmail.com o por PM a ethernet.
Responder #1 por Helius
« 26 de Septiembre de 2006, 08:41:35 pm »
Aprovecho para aclarar que se trata de un proyecto para Netbeans + Wireless Toolkit. Supongo que cogiendo los dos ficheros .java compilarn sin problemas en cualquier IDE.

Espero vuestros comentarios.

Saludos.
Responder #2 por Harko
« 26 de Septiembre de 2006, 10:28:00 pm »
Cita de: "ethernet"
Otro artculo que puede interesar leer para preparar el entorno es el que escribi zupervaca en su tutoblog:
- Preparndose para programar en j2me
Esperemos que esto sirva como base para los cursos  y grupos de iniciacin que se estn montando ahora mismo

Hey! Justo lo que estaba buscando, muchas gracias :D

Harko.
Responder #3 por ss
« 27 de Septiembre de 2006, 08:44:23 am »
Un cdigo estupendo para el que quiera emepzar a trastear con J2ME. Ms de uno te lo agradecer :)
Responder #4 por Mars Attacks
« 28 de Septiembre de 2006, 10:17:28 pm »
Yo lo agradecer :****************
Responder #5 por Lex
« 01 de Octubre de 2006, 03:43:54 am »
...
Responder #6 por Helius
« 02 de Octubre de 2006, 10:03:26 am »
Cita de: "Lex"
he podido comprobar lo que tanto me advirti y no le hice caso

Huir de Java mientras podis bwahahahaha!!!!  :P
Responder #7 por TrOnTxU
« 05 de Enero de 2007, 06:40:13 am »
Cita de: "Lex"
Lo que estara bien es, hacer la lista de los 1001 trucos y advertencias de J2ME :twisted:


Yo haria la lista de los 1001 problemas y trucos de los mviles.
Comienzo con unos apuntes:
    1- En principio s60 de Nokia no descargan bien los objetos Image. Dependiendo del dispositivo convine: igualar todas las refs a null, hacer un gc(), un sleep() de pocos milisegundos, y otro gc() ... a veces funciona.

    2- TSM7 i G402i (DoJa no MIDP), fabricados por VitelCom, Murcia, tienen un error en el driver de "video". Pueden aparecer puntos blancos en el extremo inferior dererecho de las imagenes que tengan transparencia, dependiendo del numero de colores que tenga su paleta y el la imagen a la que estn solapando.

    3-
[trick] Si quieres visualizar la memoria libre restante recuerda utilizar arrays de char "reservados previamente" y no objetos String, sino vers tu contador de memoria libre decreciendo en cada frame (por la memoria que se consume crear los String cada frame).

4- [trick] No confies nunca en j2me!!!!!!!! Es como la Ley de Murphy: si algo va bien, ir mal.

5- [trick] Busca la mayor compatibilidad posible!!!!! Utiliza solo MIDP1 siempre que puedas. Con directivas como las del tutorial puedes tener los trozos de cdigo especfico para cada plataforma. (FullCanvas, vibracion, ...)

6- [trick] Usa imagenes separadas para las animaciones de los sprites (te ahorrars problemas con el clipping de MIDP1), incluso puedes probar a partir el sprite en trozos reutilizables en varios frames. Si lo que te preocupa es el tamao la cabecera de los PNGs puedes crearte un archivo que contenga la paleta y la informacin comn de las cabeceras de cada png de la animacin, el resto lo construyes en tiempo de ejecucin, lo metes en un array de bytes, lo creas como un stream (con "Image.CreateImage")  y a correr.

7- [ultra trick] AHORRO de epacio Jar: Resulta que existe la manera de crear un png con el maximo numero de Rows (es decir, cual pixmap o raw normal y corriente de 8 bits, un array de bytes con el numero de color de la paleta). De manera que si construyes bien la cabecera puedes cargar directamente una imagen en raw, lo que te permite tb crearla invirtiendo las filas y/o las columnas (bienvenidos a los flips/rots en MIDP1). Puedes creer que una imagen en raw ocupa ms que un PNG ... pues haz la prueba, y metelo todo en un Jar ... resulta que, a veces, incluso se gana espacio respecto al png. Otras dos ventajas de esto son que te evitas cabeceras innecesarias (el punto 6), y que puedes tener varias paletas por imagen/sprite, solo mete en la cabecera los colores que quieres y listo.

8- El tamao del cdigo tambin suele ser problemtico (sobretodo en DoJa donde su mximo tamao es 20kB).
Recuerda comentar todos los xivatos (println) cuando no los necesites.
ProGuard suele hacer un buen trabajo por nosotros, pero debemos facilitarle la tarea. Cualquier clase que solo contenga variable del tipo " final public static ... " (siempre que no sea un array) ser eliminada del cdigo ofuscado y los valores de estas variables "inlineados". As que (por comodidad y legibilidad de cdigo) puedes crearte tus clases (DEF.java, por ejemplo) con tus constantes definidas, sin miedo a que ello implique mayor tamao de cdigo.
Otro truco es no utilizar bloques "if / else if" para asignaciones sencillas:
Esto:
if ( x > 30 ) {
    y = 30;
} else {
    y = x;
}
equivale a esto:
y = (x>30)?(30):(x);
[/list]
Bueno son solo algunas sugerencias que he podido aprender por ahi. Pero la ms importante es que si haces un juego de mvil, intenta NO HACER nada ms de los imprescindible, perders tiempo que luego no cobrars. A no ser que quieras hacerte tus herramientas y tenerlas "pa siempre" o venderlas, etc.

Por cierto, muy bueno el cdigo, gracias por compartir :D

Un saludo!
Responder #8 por zheo
« 05 de Junio de 2007, 06:58:41 pm »
Bueno, aprovecho para presentarme en esta vuestra comunidad con un primer comentario.

Ya que se est utilizando el preprocesador de NetBeans, por qu no utilizarlo tambin para el log?
Es decir, en el mtodo UTIL_OutputDebugString(String str), en vez de tener

if (DEBUG)
{
    System.out.println("DEBUG: " + str);
}

hacer

//#if _DEBUG
   System.out.println("DEBUG: " + str);
//#endif


Es una tontera, pero te ahorras el cdigo del condicional, y una variable.

Por cierto, muy interesante el truco 8 TrOnTxU.
Responder #9 por ss
« 06 de Junio de 2007, 08:36:27 am »
Para NetBeans puedes hacer esto:
//#debug
System.out.println("DEBUG: " + str);


o esto para varias lneas:
//#mdebug
System.out.println("DEBUG: " + str);
//#enddebug



De todas formas no es mala idea el uso de constantes. Ese cdigo lo elimina cualquier compilador si DEBUG==false y no dependes de ningn preprocesador.
Responder #10 por ethernet
« 06 de Junio de 2007, 09:47:58 am »
Cual es la razn por cual cual usas yield y no un sleep para ceder el hilo de ejecucin a otro thread?
Responder #11 por Helius
« 06 de Junio de 2007, 04:58:00 pm »
Cita de: "ethernet"
Cual es la razn por cual cual usas yield y no un sleep para ceder el hilo de ejecucin a otro thread?


Pues simplemente por la definicin de yield en la documentacin:

public static void yield()

Causes the currently executing thread object to temporarily pause and allow other threads to execute.


Pero efectivamente podra usarse sleep(0). De todas formas creo que existan telfonos que funcionaban mal con sleep y otros que funcionaban mal con yield...  :roll:

Saludos.
Responder #12 por ss
« 07 de Junio de 2007, 09:10:53 am »
Yo siempre uso sleep(0).
Responder #13 por chechocossa
« 07 de Junio de 2007, 01:42:26 pm »
La gente que me hace el testing de Padre Carlos, me deca que en algunos Sony las teclas no les respondan correctamente:

"K700i, w550i

Las teclas de d-pad no responden bien. Tienes que sostener la tecla al menos un segundo antes que responda. Funciona bien el men pero en el juego no.
Las teclas de nmeros no funcionan tampoco. El 4 debe ser izquierda, el 2 arriba, el 6 derecho, etc."


Buscando en un foro de desarrolladores de Sony-Ericsson le que una de las causas por la falta de respuestas de las teclas, es que hay que incluir el comando yield()
Cuando lo hice, los problemas en esos mviles desaparecieron.

Por eso, una parte de mi loop es:

// Demora para controlar los FPS
            if( loopTime < loopDelay )
            {
                try
                {
                    Thread.sleep(loopDelay - loopTime);
                }
                catch(java.lang.InterruptedException e)
                { }
            }
            else
                Thread.yield();



Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.