Sunteți pe pagina 1din 31

IIC3686 - Creacin de Videojuegos

Programacin de juegos en J2ME para celulares

Nicols Mery njmery@uc.cl

Introduccin : Recursos

Recursos limitados

RAM en kilobytes Almacenamiento (RMS) alrededor de 1 mb Pantallas ms comunes de 128x128 pixeles

Diferentes configuraciones Necesidad de adaptarse a las diferentes configuraciones Optimizar todo lo posible en pro de la jugabilidad.

Introduccin : APIs

Java

J2SE: Standard Edition J2EE: Enterprise Edition J2ME: Micro Edition Mquina virtual, interfaz de programacin bsica Connected Limited Device Configuration (CLDC)

Configuraciones

CLDC 1.1 CLDC 1.0

Connected Device Configuration (CDC)

Introduccin (cont.)

Perfiles

Interfaz de ms alto nivel Mobile Information Device Profile(MIDP) 1.0 Mobile Information Device Profile(MIDP) 2.0 Prximamente MIDP 3.0 Interfaz propia del celular (ej: Nokia UI)

Cada celular implementa una configuracin y un perfil

Esto define las posibilidades de programacin que el desarrollador tiene disponible.

Introduccin (cont.)

MIDP1.0

No tiene soporte para audio No hay pintado de pantalla completa No soporta transparencias Conectividad slo va HTTP Todos los celulares actuales soportan MIDP1.0 Soporte multimedia Soporte para pintado a pantalla completa Soporte para transparencias Conectividad ampliada (HTTP, sockets, etc) Mejoras especficas para desarrollo de juegos Varios soportan MIDP2.0 hoy en da. (2007)

MIDP2.0

Programacin en J2ME

javax.microedition.MIDlet

startApp()

Cuando parte la aplicacin o cuando vuelve de pausa Sucede cuando llaman al celular o un SMS, etc. Cuando se sale de la aplicacin.

pauseApp()

destroyApp()

Programacin en J2ME (cont.)

Ciclo de vida de un MIDlet

Activo El MIDlet est siendo ejecutado y tiene control sobre los recursos del sistema Destruido El MIDlet fue destruido. Todos sus recursos han sido liberados. Pausado El MIDlet est corriendo en el fondo. No puede responder a ningn evento de la interfaz de usuario, pero puede ser devuelto a Activo por el AMS

Programacin en J2ME (cont.)

Game Loop

Leer Input del usuario ( Canvas.keyPressed(), CommandListeners ) Simular el mundo (IA, colisiones, etc.) Dentro del loop cuando el juego se esta corriendo. Dibujar el resultado Al final o entremedio cuando se quiere obligar a que ciertas cosas se dibujen antes que otras. ( No abusar ) Esperar para completar el tiempo del frame

Demo

FishGame Netbeans 5.0 + Movility pack

Links a sitios de desarrollo

Nokia http://forum.nokia.com/ Siemens. http://www.siemens-mobile.com/developer Sony Ericsson. http://developer.sonyericsson.com/ Motorola. http://www.motocoder.com/

Instalacin

NetBeans 5.0 + J2SE v1.4.2. http://java.sun.com/j2se/1.4.2/download-netbeans50.html NetBeans Mobility Pack (incluye Wireless Toolkit 2.2). http://www.netbeans.org/products/mobility/

Extra: Tabla comparativa de celulares con sus configuraciones, perfiles, y otros datos. http://developers.sun.com/techtopics/mobility/device/ device

Otros links tiles


Pgina j2me del curso Wikipedia MIDP2 Wikipedia CLDC Carbide.j

Anexo

Ms sobre programacin en J2ME

Programacin en J2ME

javax.microedition.lcdui.Display

Display representa a la pantalla LCD del celular Obtiene el Display asociado al MIDlet Setea el objeto que se quiere desplegar en la pantalla LCD

Display.getDisplay(MIDlet m)

Display.setCurrent(Displayable d)

Programacin en J2ME (cont.)

javax.microedition.lcdui.Displayable

Displayable

Displayable representa un objeto que puede ser desplegado en la pantalla LCD Screen

Form

Canvas

Alert List TextBox

ChoiceGroup DateField ImageItem Gauge StringItem TextField

Programacin en J2ME (cont.)

Displayable.setCommandListener(CommandLi stener cl)

Especifica quin interpretar los comandos recibidos por el objeto Displayable El intrprete debe implementar el mtodo abstracto CommandListener Agrega un comando a la pantalla

Displayable.addCommand(Command c)

Displayable.removeCommand(Command c)

Elimina un comando de la pantalla

Programacin en J2ME (cont.)

Canvas permite interpretar el input del usuario

Posee constantes para comparar


void keyPressed(int keycode) void keyReleased(int keycode) void keyRepeated(int keycode) int getGameAction(int keycode)

KEY_NUM0 KEY_NUM9 KEY_STAR KEY_POUND LEFT, RIGHT, UP, DOWN, FIRE GAME_A, GAME_B, GAME_C, GAME_D

Programacin en J2ME (cont.)

La clase que extienda Canvas tiene que implementar el mtodo abstracto Paint(Graphics g) En esa funcin definimos lo que queremos pintar Cada vez que queremos que se refresque la pantalla, llamamos al mtodo repaint()

Programacin en J2ME (cont.)

Graphics

drawImage drawString drawRect drawRoundRect drawLine drawArc fillRect fillRoundRect fillArc

setColor setStrokeStyle

Programacin en J2ME (cont.)

Game Loop

Leer Input del usuario Simular el mundo (IA, colisiones, etc.) Dibujar el resultado Esperar para completar el tiempo del frame

Hasta ahora, todo lo visto se puede implementar en MIDP1.0

Programacin en J2ME (cont.)

Game API

javax.microedition.lcdui.game.*
GameCanvas Layer LayerManager Sprite TiledLayer

Slo disponible desde MIDP2.0

Programacin en J2ME (cont.)

GameCanvas

Extiende a Canvas Agrega un buffer fuera de pantalla Permite hacer polling a las teclas El mtodo getGraphics() retorna el buffer Al finalizar de pintar el frame fuera de la pantalla, se llama a flushGraphics() setFullScreenMode(Boolean)

Programacin en J2ME (cont.)

GameCanvas

int getKeyStates() UP_PRESSED DOWN_PRESSED LEFT_PRESSED RIGHT_PRESSED FIRE_PRESSED Cmo usarlo? keyStates=getKeyStates(); If(keyStates & LEFT_PRESSED != 0)

Usuario presion izquierda

Programacin en J2ME (cont.)

Layer

Base para Sprite y TiledLayer void setPosition(int x, int y) void setVisible(int x, int y) boolean isVisible() void move(int dx, int dy) int getHeight() int getWidth() int getX() int getY()

Programacin en J2ME (cont.)

Sprite

Extiende Layer agregando animacin, deteccin de colisin, transformaciones de imagen Sprite(Image imagen) Sprite(Image imagen, int frameWidth, int frame Height) Sprite(Sprite s) collidesWith(Image imagen, int x, int y, bool pixelLevel) collidesWith(Sprite s, bool pixelLevel) collidesWith(TiledLayer t, bool pixelLevel) defineCollisionRectangle(int x, int y, int width, int height)

Programacin en J2ME (cont.)

Animacin del Sprite

void setFrameSequence(int[] sequence)

Establece una secuencia a partir de los frames de la imagen original del sprite

int getFrameSequenceLength()

Retorna el nmero de frames que tiene la secuencia actual


Retorna el nmero de frames que tiene la imagen original del sprite

int getRawFramesCount()

Programacin en J2ME (cont.)

Animacin del Sprite

void setFrame(int sequenceIndex) Selecciona un frame en particular de la secuencia para el prximo paint del sprite void nextFrame() Selecciona el siguiente frame en la secuencia void prevFrame() Selecciona el frame anterior en la secuencia int getFrame() Retorna el nmero de frame dentro de la secuencia que est selecconado actualmente void paint(Graphics g) Pinta el Sprite. El pixel de referencia es el de arriba a la izquierda

Programacin en J2ME (cont.)

Transformaciones del Sprite


defineReferencePixel(getWidth()/2, getHeight()/2) setTransform(transformacin) TRANS_NONE TRANS_ROT90 TRANS_ROT180 TRANS_ROT270 TRANS_MIRROR TRANS_MIRROR_ROT90 TRANS_MIRROR_ROT180 TRANS_MIRROR_ROT270

Programacin en J2ME (cont.)

TiledLayer

TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight) Especifica las columnas y filas del fondo, imagen donde ests los tiles y sus dimensiones Void setCell(int col, int row, int tileIndex) Pinta en (col, row) con el tile tileIndex (parte de 1, el 0 es transparente) Void fillCells(int col, int row, int numCols, int numRows, int tileIndex) setCell pero en un rectngulo

Programacin en J2ME (cont.)

LayerManager

Sirve para pintar grupos de Layers Void append(Layer l) Void insert(Layer l, int index) Int getSize() Void remove(Layer l) Void setViewWindow(int x, int y, int width, int height) Void paint(Graphics g, int x, int y) Layer getLayerAt(int index)

Programacin en J2ME (cont.)

Esperar para completar el tiempo del frame


15 FPS o menos Aprox. 70 milisegundos por frame

elapsed=startTime; startTime=System.currentTimeMillis(); elapsed=startTime-elapsed; If(elapsed < MILLISECS_PER_FRAME) { thread.sleep(MILLISECS_PER_FRAME-elapsed); } Else { thread.yield(); }

S-ar putea să vă placă și