Upload
thera-villasana
View
220
Download
0
Tags:
Embed Size (px)
Citation preview
IIC3686 - Creación de Videojuegos
Sebastián Montabone
Programación de juegos en J2ME para celulares
Introducción Java
J2SE: Standard Edition J2EE: Enterprise Edition J2ME: Micro Edition
Configuraciones Máquina virtual, interfaz de programación básica
Connected Limited Device Configuration (CLDC) CLDC 1.1 CLDC 1.0
Connected Device Configuration (CDC)
Introducción (cont.) Perfiles
Interfaz de más alto nivel Mobile Information Device Profile(MIDP) 1.0 Mobile Information Device Profile(MIDP) 2.0 Próximamente MIDP 3.0…
Cada celular implementa una configuración y un perfilEsto define las posibilidades de
programación que el desarrollador tiene disponible.
Introducción (cont.) MIDP1.0
No tiene soporte para audio No hay pintado de pantalla completa No soporta transparencias Conectividad sólo vía HTTP Todos los celulares actuales soportan MIDP1.0
MIDP2.0 Soporte multimedia Soporte para pintado a pantalla completa Soporte para transparencias Conectividad ampliada (HTTP, sockets, etc…) Mejoras específicas para desarrollo de juegos Sólo algunos celulares soportan MIDP2.0
Programación en J2ME Clases públicas
javax.microedition.midletstartApp()pauseApp()destroyApp()
Programación 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 por el AMS. Todos sus recursos
han sido liberados.
Pausado El MIDlet está corriendo en el fondo. No puede responder
a ningún evento de la interfaz de usuario, pero puede ser devuelto a Activo por el AMS
Programación en J2ME (cont.) javax.microedition.lcdui.Display
Display representa a la pantalla LCD del celular
Display.getDisplay(MIDlet m)Obtiene el Display asociado al MIDlet
Display.setCurrent(Displayable d)Setea el objeto que se quiere desplegar en
la pantalla LCD
Programación en J2ME (cont.) javax.microedition.lcdui.Displayable
Displayable representa un objeto que puede ser desplegado en la pantalla LCD
Displayable Screen
Form ChoiceGroup DateField ImageItem Gauge StringItem TextField
Alert List TextBox
Canvas
Programación en J2ME (cont.) Displayable.setCommandListener(CommandLi
stener cl) Especifica quién interpretará los comandos
recibidos por el objeto Displayable El intérprete debe implementar el método abstracto
CommandListener
Displayable.addCommand(Command c) Agrega un comando a la pantalla
Displayable.removeCommand(Command c) Elimina un comando de la pantalla
Programación en J2ME (cont.) Canvas permite interpretar el input del usuario
void keyPressed(int keycode) void keyReleased(int keycode) void keyRepeated(int keycode) int getGameAction(int keycode)
Posee constantes para comparar KEY_NUM0 KEY_NUM9 KEY_STAR KEY_POUND LEFT, RIGHT, UP, DOWN, FIRE GAME_A, GAME_B, GAME_C, GAME_D
Programación en J2ME (cont.) La clase que extienda Canvas tiene que
implementar el método abstracto Paint(Graphics g)
En esa función definimos lo que queremos pintar
Cada vez que queremos que se refresque la pantalla, llamamos al método repaint()
Programación en J2ME (cont.) Graphics
drawImage drawString drawRect drawRoundRect drawLine drawArc fillRect fillRoundRect fillArc
setColor setStrokeStyle …
Programación en J2ME (cont.) Game Loop
Leer Input del usuarioSimular el mundo (IA, colisiones, etc.)Dibujar el resultadoEsperar para completar el tiempo del frame
Hasta ahora, todo lo visto se puede implementar en MIDP1.0
Programación en J2ME (cont.) Game API
javax.microedition.lcdui.game.* GameCanvas Layer LayerManager Sprite TiledLayer
Sólo disponible desde MIDP2.0
Programación en J2ME (cont.) GameCanvas
Extiende a CanvasAgrega un buffer fuera de pantallaPermite hacer polling a las teclasEl método getGraphics() retorna el bufferAl finalizar de pintar el frame fuera de la
pantalla, se llama a flushGraphics()setFullScreenMode(Boolean)
Programación en J2ME (cont.) GameCanvas
int getKeyStates() UP_PRESSED DOWN_PRESSED LEFT_PRESSED RIGHT_PRESSED FIRE_PRESSED
Cómo usarlo? keyStates=getKeyStates(); If(keyStates & LEFT_PRESSED != 0)
Usuario presionó izquierda…
Programación 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()
Programación en J2ME (cont.) Sprite
Extiende Layer agregando animación, detección de colisión, 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)
Programación en J2ME (cont.) Animación del Sprite
void setFrameSequence(int[] sequence) Establece una secuencia a partir de los frames
de la imagen original del sprite
int getFrameSequenceLength() Retorna el número de frames que tiene la
secuencia actual
int getRawFramesCount() Retorna el número de frames que tiene la
imagen original del sprite
Programación en J2ME (cont.) Animación del Sprite
void setFrame(int sequenceIndex) Selecciona un frame en particular de la secuencia para el
próximo 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 número 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
Programación en J2ME (cont.) Transformaciones del Sprite
defineReferencePixel(getWidth()/2, getHeight()/2) setTransform(transformación)
TRANS_NONE TRANS_ROT90 TRANS_ROT180 TRANS_ROT270 TRANS_MIRROR TRANS_MIRROR_ROT90 TRANS_MIRROR_ROT180 TRANS_MIRROR_ROT270
Programación en J2ME (cont.) TiledLayer
TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight)
Especifica las columnas y filas del fondo, imagen donde estás 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 rectángulo
Programación 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)
Programación 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();}
Links a sitios de desarrollo
Nokiahttp://forum.nokia.com/
Siemens.http://www.siemens-mobile.com/developer
Sony Ericsson.http://developer.sonyericsson.com/
Motorola.http://www.motocoder.com/
Instalación
NetBeans 5.0 + J2SE v1.4.2.http://java.sun.com/j2se/1.4.2/download-netbeans-50.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