Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





J2me

Iniciado por Lord Trancos 2, 12 de Octubre de 2005, 11:08:11 PM

« anterior - próximo »

jazcks

 
Cita de: "_Grey"Bueno... por lo menos crear un doblebuffer de toda la vida sera tan facil como crear un objeto Image con la resolucion que usas nop???

Según el libro J2ME (Sergio Gálvez Rojas, Lucas Ortega Díaz, Universidad de Málaga):


5.4.3.3.1. Double Buffering

La técnica de pantalla en segundo plano consiste en lo siguiente: Muchos dispositivos que no poseen una gran capacidad computacional provocan un parpadeo a la hora de actualizar los gráficos en pantalla. En estos casos, lo ideal sería hacer todas las actualizaciones gráficas en memoria y posteriormente volcar el contenido de memoria en pantalla. Esta técnica es la que se conoce como double buffering.

Algunos de estos dispositivos implementan esta técnica sin que tengamos que escribir ni una sola línea de código. Para saber si el MID donde ejecutamos nuestra aplicación aplica esta técnica, existe un método de la clase Canvas que nos devuelve true o false en caso de que aplique esta técnica o no:

boolean isDoubleBuffered().

En caso de que el método nos devuelva true, no tenemos que hacer absolutamente nada especial ya que la implementación del MID se encarga de hacer todas las actualizaciones gráficas en memoria para posteriormente, volcarlo en pantalla. En el caso de que el método retorne false, nos indicaría que el dispositivo no es capaz de implementar esta técnica. En este caso es posible implementarla por nosotros mismos. Para ello, lo que haremos será crear una imagen mutable del tamaño de la pantalla del MID y efectuar todas las operaciones gráficas en el objeto Image para, posteriormente volcar el contenido de esta imagen por pantalla.

1.- Crear la imagen mutable del tamaño de la pantalla.

Image displaysecundario;

If (! isDoubleBuffered()){
  Displaysecundario = Image.createImage(getWidth(),getHeight());
}

2.- Realizar todas las actualizaciones en el objeto Image dentro del método  paint(Graphics).

protected void paint(Graphics g){
  Graphics displayprimario = g;
  g = displaysecundario.getGraphics();
  // Realizamos todas las operaciones para actualizar la pantalla en g.
  ...
  //Realizamos el volcado en pantalla
  displayprimario.drawImage(displaysecundario, 0,0,Graphics.LEFT | Graphics.TOP);
}

zupervaca

 os recomiendo tener memorizado el graphics del doble bufer, tambien os recomiendo que eviteis pintar una imagen fuera de pantalla ya que algunos moviles tardan lo mismo que si se pinta dentro

Lord Trancos 2

Cita de: "zupervaca"os recomiendo tener memorizado el graphics del doble bufer,
No entiendo.
¿puedes dar mas detalles, please?
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

zupervaca

 esta linea g = displaysecundario.getGraphics(); podeis hacerla despues de crear el doble bufer y asi no tener que hacerla siempre que se llama al evento paint, ademas al hacer esto con comprobar si g es nulo o no ya sabreis en el evento paint si existe o no el doble buffer y asi usar uno u otro graphics

por ejemplo, es mas rapido comprobar si g es nulo en el evento paint que comprobar llamando a la funcion isDoubleBuffered, con lo que siempre debeis de evitar realizar llamadas innecesarias al api de java, tambien es bueno memorizar en dos variables el ancho y alto de la pantalla del movil para no llamar siempre a getWidth y getHeight, para moviles os recomiendo olvidaros de usar funciones para ocultar miembros, lo mejor es que por ejemplo el ancho y alto de la pantalla del movil sean variables estaticas de una clase y publicas

Lord Trancos 2

 zankius, ahora si que ha quedado claro.  (ole)  
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Lord Trancos 2

 Mas dudas.  :lol:

- Cuanta memoria se supone q tiene un cacharro de estos (movil nokia s40) para ejecutar una aplicacion (juego)?
- Como puedo saber cuanta memoria esta usando mi juego?

He tenido un problema bastante raro:
- Tengo un mapa de tiles con un único tile formado por un .png 32x32 24bits de un unico color con un 1 pixel de otro color.
- Si cambio ese tile por otro mas complejo (con mas variedad de colores) pero del mismo tamaño, los mismos bits, hecho con la misma herramienta, etc... en el emulador funciona, pero en el movil me da un error de nullpointerexception  O_O ¿Alguna idea de pq sucede? Sospecho que debo de haberme comido toda la memoria (otra cosa no se me ocurre) Pero no tiene sentido, ¿acaso un .png de una determinada resolucion no ocupa lo mismo que otro igual una vez se encuentra en memoria?
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

zupervaca

 si te digo la verdad no se cuanta memoria tienen los moviles jeje, pero te recomiendo exprimirlo todo al maximo, sobre el nullpointerexception solo puedo decirte que sucede cuando un puntero es nulo, puede ser que la ruta de la imagen que le pasas al createimage sea incorrecta y la imagen no se cree y al usarla te da ese error, si estas con netbeans, ¿estas agregando en propiedades del proyecto el directorio de los recursos?

Lord Trancos 2

 
Cita de: "zupervaca"sobre el nullpointerexception solo puedo decirte que sucede cuando un puntero es nulo, puede ser que la ruta de la imagen que le pasas al createimage sea incorrecta y la imagen no se cree y al usarla te da ese error, si estas con netbeans, ¿estas agregando en propiedades del proyecto el directorio de los recursos?
Es que es muy cachondo lo que me pasa.
En el emulador del netbeans todo me va chachi.
En el movil (nokia 6100) me va bien.
Si cambio la imagen de color plano tile1.png (~300 bytes) por otro archivo con el mismo nombre, misma resolucion, misma profundidad de color, etc... tile1.png (~1000 bytes), me da ese error.

Insisto: el mismo codigo fuente, el mismo nombre de archivo, la misma resolucion, el mismo programa para editar la imagen, la misma profundidad de color, el mismo movil.... pues va y me da ese error. (en el movil; en el emulador va bien).  (nooo)

EDIT: probablemente sea algo de lo que dices (que no pueda cargar la imagen), pero no se... es raro. ¿que programa usais para hacer los png?
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

zupervaca

 
Citar¿que programa usais para hacer los png?
cuando quiero hacer la version definitiva uso el photoshop, tienes la opcion de guardar para web en el menu archivo, debes de poner formato png-8 y el tipo de optimizacion de paleta perceptual, asi ocupara la minima expresion, en el modo perceptual puedes cambiar el numero de colores,a veces aunque te diga que son necesarios 128 puedes bajarlo a 64 y hacer que ocupe aun menos la imagen

jazcks

 
Citar
cuando quiero hacer la version definitiva uso el photoshop, tienes la opcion de guardar para web en el menu archivo, debes de poner formato png-8 y el tipo de optimizacion de paleta perceptual, asi ocupara la minima expresion, en el modo perceptual puedes cambiar el numero de colores,a veces aunque te diga que son necesarios 128 puedes bajarlo a 64 y hacer que ocupe aun menos la imagen

y como haces las transparencias?, a mi no me deja seleccionar el color transparente.
Al final lo que hago es usar photoshop primero, y luego pasarlo a macromedia fireworks que tb optimiza png y es su formato normal de trabajo.

@Lord Trancos 2, porque no pones el código?, lo que comentas es bastante raro, así probamos, tengo un 6600 para probar.

Lord Trancos 2

 Gracias. Esta tarde si me acuerdo subo el proyecto a una web para que lo podais probar.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

_Grey

 Ya se que el J2ME esta algo limitado, pero...... he buscado por la documentacion, y no encuentro manera de leer de los ficheros.
Vamos, que no puedo hacer un simple :

InputStream f=new FileInputStream("/Loquesea.txt");

No se pueden leer ficheros de datos que lleves con la aplicacion!? :blink:

Gracias.

zupervaca

 
Citary como haces las transparencias?, a mi no me deja seleccionar el color transparente
cuando estas en guardar para web debes de seleccionar el color que quieres que sea transparente con el gotero que hay en las herramientas de la izquierda, luego debajo de la paleta de colores veras el numero de colores, un dibujo que parece como un tablero de ajedrez, un cubo, candado, etc, el que parece un dibujo de un tablero de ajedrez es el que sirve para indicar que el color seleccionado es el color de mascara, os pongo una imagen para aclararos mejor


Citarno encuentro manera de leer de los ficheros
la clase puedes usar esta InputStream y la creas asi:

InputStream is;
is = getClass().getResourceAsStream( "/loquedesa.txt" );

trabis

 saludos, es la primera vez q escribo un mensaje en este foro a donde he llegado motivado por el concurso al que me gustaria presentarme. He hecho algunas cosas en J2ME pero no habia desarrollado antes nada para nokia, me he bajado el SDK de nokia para series 60 que puso zupervaca y lo he colocado en la carpeta de devices del WTK 2.2 pero al intentar probar cualquiera de las aplicaciones de ejemplo que trae el WTK en el emulador de nokia me da un error. Por ejemplo al cargar el ejemplo Demos me dice:

Fatal Error: Unable to find package java.lang in classpath or bootclasspath
com.sun.kvem.ktools.ExecutionException

pero lo mismo ocurre con todos. Alguna idea de porque pasa?

Un saludo a todos

zupervaca

 hola el WTK 2.2 es para midp 2.0 con lo que en algunos nokia no te funcionara, no obstante para hacerlo funcionar debes de copiar el .jar de la plataforma en el direcotrio de librerias, no obstante te recomiendo usar el netbeans que mediante el sistema de plataformas es solo indicar el directorio donde tienes instalado el ui






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.