310 likes | 496 Views
IIC3686 - Creación de Videojuegos. Programación de juegos en J2ME para celulares. Nicolás Mery njmery@uc.cl. Introducción : Recursos . Recursos limitados RAM en kilobytes Almacenamiento (RMS) alrededor de 1 mb Pantallas más comunes de 128x128 pixeles Diferentes configuraciones
E N D
IIC3686 - Creación de Videojuegos Programación de juegos en J2ME para celulares Nicolás Mery njmery@uc.cl
Introducción : Recursos • Recursos limitados • RAM en kilobytes • Almacenamiento (RMS) alrededor de 1 mb • Pantallas más comunes de 128x128 pixeles • Diferentes configuraciones • Necesidad de adaptarse a las diferentes configuraciones • Optimizar todo lo posible en pro de la jugabilidad.
Introducción : APIs • 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… • Interfaz propia del celular (ej: Nokia UI) • Cada celular implementa una configuración y un perfil • Esto 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 • Varios soportan MIDP2.0 hoy en día. (2007)
Programación en J2ME • javax.microedition.MIDlet • startApp() • Cuando parte la aplicación o cuando vuelve de pausa • pauseApp() • Sucede cuando llaman al celular o un SMS, etc. • destroyApp() • Cuando se sale de la aplicación.
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. 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.) • 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 • 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
Otros links útiles • Página j2me del curso • Wikipedia MIDP2 • Wikipedia CLDC • Carbide.j
Anexo • Más sobre programación en J2ME
Programación en J2ME • 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(CommandListener 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.) • setColor • setStrokeStyle • … • Graphics • drawImage • drawString • drawRect • drawRoundRect • drawLine • drawArc • fillRect • fillRoundRect • fillArc
Programación 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
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 Canvas • Agrega un buffer fuera de pantalla • Permite hacer polling a las teclas • El método getGraphics() retorna el buffer • Al 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(); }