Download - IIC3686 - Creación de Videojuegos
![Page 1: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/1.jpg)
IIC3686 - Creación de Videojuegos
Nicolás [email protected]
Programación de juegos en J2ME para celulares
![Page 2: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/2.jpg)
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.
![Page 3: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/3.jpg)
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)
![Page 4: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/4.jpg)
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.
![Page 5: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/5.jpg)
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)
![Page 6: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/6.jpg)
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.
![Page 7: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/7.jpg)
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
![Page 8: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/8.jpg)
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
![Page 9: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/9.jpg)
Demo
FishGame Netbeans 5.0 + Movility pack
![Page 10: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/10.jpg)
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/
![Page 11: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/11.jpg)
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
![Page 12: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/12.jpg)
Otros links útiles
Página j2me del curso Wikipedia MIDP2 Wikipedia CLDC Carbide.j
![Page 13: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/13.jpg)
Anexo
Más sobre programación en J2ME
![Page 14: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/14.jpg)
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
![Page 15: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/15.jpg)
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
![Page 16: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/16.jpg)
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
![Page 17: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/17.jpg)
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
![Page 18: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/18.jpg)
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()
![Page 19: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/19.jpg)
Programación en J2ME (cont.)
Graphics drawImage drawString drawRect drawRoundRect drawLine drawArc fillRect fillRoundRect fillArc
setColor setStrokeStyle …
![Page 20: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/20.jpg)
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
![Page 21: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/21.jpg)
Programación en J2ME (cont.)
Game API javax.microedition.lcdui.game.*
GameCanvas Layer LayerManager Sprite TiledLayer
Sólo disponible desde MIDP2.0
![Page 22: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/22.jpg)
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)
![Page 23: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/23.jpg)
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…
![Page 24: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/24.jpg)
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()
![Page 25: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/25.jpg)
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)
![Page 26: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/26.jpg)
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
![Page 27: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/27.jpg)
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
![Page 28: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/28.jpg)
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
![Page 29: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/29.jpg)
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
![Page 30: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/30.jpg)
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)
![Page 31: IIC3686 - Creación de Videojuegos](https://reader036.vdocuments.pub/reader036/viewer/2022062323/56815275550346895dc0a5e3/html5/thumbnails/31.jpg)
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();}