Julio 2005
David Bueno Vallejo
Índice
• Consideraciones generales de los juegos
• Inteligencia Artificial en los Juegos
– Carreras de coches
– Path finding (b
(bú
úsqueda de caminos)
– Juegos mesa
– Shooting games (FPS -First Person Shooter
Shooter))
– Dead Reckoning (shooting games
games,, red)
• J2ME
– Introducció n
Introducció
– Primer programa
– Interfaz de usuario
– GameCanvas
– Ciclo de vida de un juego
– Sprites,, TyledLayer
Sprites TyledLayer,, Scroll
Scroll,, Colisiones
– Almacenamiento (RMS)
– Bluetooth
– Versiones de prueba
– Comunicaciones
– Sonidos, vibració
vibración, iluminació
iluminación
• Referencias
2
1
Consideraciones generales de los juegos
• En la programació
programaci ón de videojuegos es necesario prestar
atenció
atenci ón al elementos té
técnicos como:
– Lectura del dispositivo de entrada: teclado, rató
rató n, volante,
joystick,, keypad
joystick keypad……
– Refresco/Modos de pantalla
– Uso eficiente de la Memoria
– Tama
Tamañ ño del programa
– Gesti
Gestióón de colisiones
• Y a otros como:
– Objetivo del juego
– Jugabilidad
– Capacidad de motivació
motivació n
– Calidad grá
gr áfica
– Multijugador o Red
– Inteligencia Artificial
3
2
Carreras de coches
• En este apartado se pretende dar una idea de có
cómo un juego de
coches genera los enemigos inteligentes
• El primer paso consiste en dividir el circuito en sectores
• Cada lílínea que separa el sector indica por donde deberí
debería pasar el
coche
Carreras de coches
• El jugador conoce el sector en el que se encuentra, la distancia al
principio, final y posició
posici ón de otros jugadores
• Para hacer jugadores má
más inteligentes, pueden mirar en la lílí nea de
carrera de varios sectores má
más allá
allá de su posició
posici ón actual
• Esto le permite ajustar la aceleració
aceleració n y direcció
direcció n
• El algoritmo má
más sencillo para adelantar consiste en seguir la linea
de adelantamiento
• Una forma rá
rápida de generar la lílí nea de carrera es almacenando los
datos de la mejor vuelta de un jugador humano.
3
Path finding (B
(Búúsqueda de caminos)
• Uno de los problemas que deben resolverse en muchos juegos es
encontrar un camino para ir de un punto a otro
• El algoritmo A* utiliza búsqueda heurí
heur ística y es uno de los más
empleados con sus muchas variaciones
• Para cada nodo del camino se tiene en cuenta lo que cuesta llegar
llegar a
ese punto y el coste estimado desde ese punto hasta el final
• La estimació
estimación que suele utilizarse es la distancia de Manhattan
• Se tienen dos listas de nodos
– Abierta. Con los nodos que pueden visitarse en cada iteració
iteració n
– Cerrada. Con los nodos ya visitados
4
Demo Path Finding B ásico (J.A
(J.A.. Chacó
Chacón)
10
5
Demo 3 pasos
11
Path finding
finding-- Táctico
• Cuando hay enemigos que pueden representar una
amenaza para el jugador. Se puede implementar una
variante tá
t áctica de A*
• La idea consiste en dar un coste mayor a las celdas en
las que un enemigo tiene contacto visual
12
6
Demo Path finding Táctico (J.A
(J.A.. Chacó
Chacón)
13
Juegos de mesa
• Ajedrez, Othello
Othello,, Damas, Cuatro en raya
raya……
• Algoritmo Minimax
– Este algoritmo toma la situació
situació n actual del tablero
– Prueba los posibles movimientos del jugador actual intentando
maximizarlos utilizando una funció
función que evalú
evalúa la situació
situació n del tablero
– De forma recursiva, para cada una de las situaciones obtenidas se
miran los movimientos del contrario intentando minimizar la funci funció n de
evaluació
evaluación
• Es decir, seleccionando los mejores movimientos del contrario
– Las llamadas terminará
terminarán por:
• Se alcance un nivel de profundidad suficiente
• El tiempo de bú
búsqueda esté
esté restringido
• Uno de los jugadores gana
– la decisió
decisió n minimax maximiza la utilidad bajo el supuesto de que el
contrincante jugará
jugará perfectamente para minimizarla
• Poda alfa-
alfa- beta
– Se dejará
dejarán de explorar las situaciones que no lleven a obtener
resultados relevantes
– Esto permitirá
permitirá analizar má
más situaciones útiles a mayor profundidad
14
7
Juegos de mesa:
mesa : Cuatro en raya
• Como ejemplo se muestra una implementació
implementaci ón de las
cuatro en raya
• Caracter
Caracteríísticas
– Permite 1 o 2 jugadores en el mismo terminal
– 2 jugadores por bluetooth
– 3 niveles de dificultad (fá
(fácil, medio, difí
difícil)
– Música
– Vibraci
Vibracióón
• Inteligencia de la má
m áquina con minimax
– Con poda por niveles 3, 5 y 7 para cada dificultad
Autores:
JOSÉ GUERRERO BENÍTEZ
JUAN DANIEL GUERRERO LUQUE
JOSÉ ÁNGEL RELAÑO GALLARDO
JUAN RIVAS ORTIZ
15
Juegos de mesa:
mesa : Cuatro en raya
• Funci
Funcióón de evaluació
evaluaci ón
– Cuenta el nú
número de vecinos del mismo color en las 4 posibles
direcciones (horizontal, vertical, diagonales)
• Para cada posible posició
posici ón de la ficha se evalú
eval úan
– El ordenador mueve con negras
Posición elegida (5ª columna)
-300,-300,-300,2,3,-300,-300
16
8
Juegos de mesa:
mesa : Cuatro en raya
• Otra situació
situaci ón
– No habrá
habr á un ganador pronto, pero una de las posiciones destaca
con respecto a las demá
demás por dar varias opciones de victoria
3, 3, 3, 3, 4, 3, 3
17
18
9
Dead Reckoning (shooting games
games))
• Los algoritmos de Dead Reckoning predicen el movimiento
• El origen fue una herramienta para navegantes.
– Un barco puede usar té cnicas de dead reckoning para estimar la
posició
posició n de su barco dado su posició
posició n original, el camino deseado y la
velocidad
• En dominios militares se utiliza para estimar movimientos de flotas
flo tas o
trapas enemigas entre diferentes saté
satélites, radares o contactos
visuales
• Ejemplo para juegos militares:
– Si hay un objetivo a 150 metros, que se mueve a 1 metro por segundo
segundo
a la derecha y la bala viaja a 50 m/s. Cuando llegue al destino el
objetivo ya no estará
estará en esa posició
posició n
Correcto
(Dead Reckoning)
Fallado
19
20
10
J2ME :Introducci
:Introduccióón
• Se llama J2ME (Java Micro Edition Edition)) a las
implementaciones de Java par dispositivos mó
móviles
• Hay varias implementaciones dependiendo del tipo de
dispositivo
• En esta presentació
presentaci ón se ve la implementació
implementaci ón
relacionada con Telé
Tel éfonos Móviles, PALM y Blackberry
(API MIDP)
21
Introducció
Introducci ón
11
Introducció
Introducci ón
23
24
12
Primer Programa: Có
Código y explicació
explicación
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class DBVHolaMundo extends MIDlet implements CommandListener {
private Display pantalla ;
private TextBox texto1 ;
private Command salir;
public DBVHolaMundo() {
pantalla = Display.getDisplay(this); // Devuelve un manejador de la pantalla
salir = new Command("Salir", Command.SCREEN, 1); // Crea un nuevo comando para Salir
texto1 = new TextBox("Hola Mundo", "Mi primer MIDlet", 40, 0); // Crea un cuadro de texto
texto1 .addCommand(salir); // A ñade el comando al cuadro de texto
texto1 .setCommandListener(this); // Indica que la gestión de evento se hace en esta clase
}
public void startApp() { // Se ejecuta al comenzar la aplicación
pantalla .setCurrent(texto1); // Muestra en la pantalla el texto y el comando
}
public void pauseApp() { } // Se ejecuta si se interrumpe la aplicación
public void destroyApp(boolean unconditional) { } // Se ejecuta al terminar
public void commandAction(Command c, Displayable displayable) { // Gestiona los eventos
if (c == salir) { // Si el evento es pulsar el botón salir, termina
destroyApp(false);
notifyDestroyed();
}
}
}
25
26
13
Primer Programa: Generació
Generación
2. Ktoolbar
2. Compilar/Enlazar el có
có digo con el botó
botó n Build
27
14
Primer Programa: Preparació
Preparación para el mó
móvil
2. Ktoolbar
5. Editar datos del proyecto: (Project
( Project àSettings
Settingsà
àRequired
Required))
Nombre del perfil. Por
defecto es MIDP-2.0. Si
el teléfono sólo es
Nombre del
compatible con MIDP -1.0
proveedor
es IMPRESCINDIBLE
cambiarlo. (Por ejemplo,
para el Nokia 3650)
30
15
Primer Programa: Enví
Envío al telé
teléfono bluetooth
3. Enviar los 2 ficheros al telé
tel éfono por bluetooth
6. En el telé
teléfono se recibirá
recibirán 2 mensajes. Uno por cada fichero.
Aceptarlos.
7. En el menú
men ú mensajes
mensajesàà Buzon de entrada del telé
teléfono Abrir el
fichero HolaMundo.jad
HolaMundo.jad.. Aparecerá
Aparecerá un mensaje como:
¿Instalar HolaMundo 1.0 suministrado por David Bueno?
31
32
16
Programa: DBVCommands (Commands
Commands))
33
34
17
IU: Canvas y GameCanvas
• Canvas es la clase bá
básica para trabajar con la pantalla a bajo nivel:
Dibujar pixels
pixels,, lineas
lineas,, figuras, etc.
• GameCanvas mejora Canvas incluyendo carga de Imá
Im á genes, Sprites
Sprites,,
TiledLayers y un mejor control de los botones del telé
teléfono
• Estas clases son la utilizada para hacer los juegos Java que han
hecho tan populares los mó
m óviles
• La programació
programació n de juegos se convierte en algo mucho mámás sencillo
que en cualquier otra plataforma
• El programador no tiene que preocuparse de problemas clá clásicos
como:
– Refresco de pantalla, doble buffering
buffering,, colisiones, gestió n de capas o
mapas
• Las clases anteriores se encargan de todo el ‘trabajo sucio’
sucio’
35
36
18
IU: GameCanvas
GameCanvas:: Sprites
• La clase Sprite maneja los personajes del juego
• Carga del Sprite en un fichero con 5 posiciones
• Se indica el tamañ
tamaño de un elemento
Sprite babosin;
24
Image imagen;
imagen = Image.createImage("/babosin.png");
babosin = new Sprite (image,16,24);
16
0 1 2 3 4
24
80 Fichero: babosin.png
37
IU: GameCanvas
GameCanvas:: Sprites
• Para mostrar el sprite hay que seleccionar la posició
posici ón de
pantalla
• Tambi
Tambié én cual de los frames se va a mostrar
• Y có
cómo quiere mostrarse: Su posició
posici ón original, invertida
o girada en x grados
Sprite.TRANS_NONE , Sprite.TRANS_MIRROR, Sprite.TRANS_ROT90, Sprite.TRANS_ROT180,
Sprite.TRANS_ROT270, Sprite.TRANS_MIRROR_ROT90, Sprite.TRANS_MIRROR_ROT180,
Sprite.TRANS_MIRROR_ROT270
38
19
IU: GameCanvas
GameCanvas:: TiledLayer
Deco.png
+ =
Image tileImages = Image.createImage("/deco.png"); // Carga la imagen con los elementos de la pantalla
TiledLayer decorado = new TiledLayer(40,24,tileImages ,8,8); // reserva espacio para la capa del decorado
// Selecciona los 40x24 elementos del decorado según su posición en deco.png
// 0 indica que no hay nada en esa posición
int[] map=
{42,41,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,42,41,1,2,
264,264,264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,264,
264,264,264,0,0,248,249,250,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,264,
…
}
// Guarda los elementos del mapa en la posición de pantalla que corresponda
for (int i=0; i < mapa.length; i++) {
int columna = i % 40; // Se divide por el número de elementos de una fila =numero de columnas
int fila = i/40;
decorado.setCell(columna,fila,mapa[i]); // Actualiza 1 a 1 todas las celdas
} 39
IU: GameCanvas
GameCanvas:: TiledLayer+Sprite+Image
+
=
+
// Dibuja la imagen de fondo
g.drawImage(fondo,decox/4,decoy/4,0);
decorado.setPosition(decox,decoy ); // Actualiza el decorado
controlcapas.paint(g,0,0); // Pinta el decorado
// Actualiza el personaje
babosin.setPosition(babosinX,babosinY );
babosin.paint(g ); // pinta el personaje
40
20
IU: GameCanvas
GameCanvas:: Scroll Fondos
TRUCO
• En muchos juegos de plataformas los escenarios pueden
estar a diferentes distancias
• Los escenarios má m ás lejanos deben moverse a menor
velocidad que los cercanos para producir un movimiento
real
• Es fáfácil conseguir ese efecto dá dándole al primer plano
unas coordenadas (x,y (x,y)) y a cada plano má
más lejano se le
asignará
asignar á un (x/distancia,y
(x/distancia,y/distancia)
/distancia)
• En el ejemplo anterior el fondo se desplaza 4 veces má más
lentamente que el decorado principal
// Dibuja la imagen de fondo
g.drawImage(fondo,decox/4,decoy/4,0);
41
IU: GameCanvas
GameCanvas:: Colisiones
• Se puede mirar en cada momento si un Sprite choca con
otro Sprite, Imagen o TiledLayer
• Las colisiones se pueden hacer a nivel de pixel
(pixelLevel
pixelLevel=true)
=true) o aproximando la imagen a un
rectangulo (pixelLevel
pixelLevel=false)
=false)
// Mira si el sprite babosin choca con la imagen situada en x,y
choca=babosin.collidesWith(imagen,x,y,pixelLevel);
// Mira si el sprite babosin choca con la otro Sprite
choca=babosin.collidesWith(enemigo,pixelLevel);
// Mira si el sprite babosin choca con un tiledLayer
choca=babosin.collidesWith(escenario,pixelLevel);
42
21
Programa: DBVBabosin
• En el siguiente programa se combina todo lo relacionado
con GameCanvas
GameCanvas:: Sprites
Sprites,, Imá
Im ágenes, TiledLayer
TiledLayer,,
LayerManager,, Control de Teclado
LayerManager Teclado……
• Con esto se podrí
podría hacer prá
prácticamente cualquier juego
en 2D
• Se va a utilizar para el midlet la misma clase que en
(DBVGameCanvas
DBVGameCanvas))
• Por otro lado, se va a utilizar una clase que hereda de
GameCanvas (BabosinCanvas
BabosinCanvas)) en la que se desarrolla el
juego
• El programa carga una imagen de fondo, un tiledLayer y
un sprite y cuando se mueven los cursores, el sprite se
desplaza por el fondo que tambié también se desplaza,
detectando posibles colisiones
43
Programa: DBVBabosin
44
22
RMS (Record Management System)
• El almacenamiento en J2ME se realiza a travé
través de RMS
• No existen ficheros
• RMS permite guardar registros numerados
• El contenido de un registro es un array de bytes
• La gestió
gestió n de todo lo que haya en el registro debe hacerla el
usuario.
– Por ejemplo, si se guarda una cadena y un nú
número será
será el usuario el
encargado de escribirlo y leerlo correctamente convirtiendo los datos
a arrays de bytes
• La clase RecordStore es la encargada de la manipulació
manipulación de los
registros
Id registro contenido
1 valor1
2
45
Autores:
JESUS BEAS ARCO
PABLO GÓMEZ JIMÉNEZ
FCO JAVIER RODRIGUEZ
PABLO SANTANA BASTIDA 46
23
Bluetooth:: Mario Karts
Bluetooth
• Estructura cliente-
cliente-servidor
– Uno de los mó
mó viles hace de servidor de la partida
– El otro se conecta como cliente
• Servidor
– Se da de alta el servicio bluetooth para que otros dispositivos lo
encuentren
– Permanece a la espera hasta que algú
alg ún cliente inicie la conexió
conexi ón
• Cliente
– Busca los dispositivos bluetooth que haya en las proximidades
– Busca en cada uno de ellos el servidor del juego
– El usuario selecciona una de los servidores disponibles
– Se inicia la conexió
conexi ón
• Conectados
– Una vez conectados, cada movimiento se enví
envía al otro telé
teléfono
47
48
24
Problema: Versiones de Prueba
• Cuando se quiere entregar una muestra de un programa
antes de venderlo hay varias opciones:
– Limitar opciones
– Fecha lílímite de uso
– Nú mero limitado de ejecuciones
• Se pide utilizando RMS hacer una aplicació
aplicaci ón que sólo
pueda ejecutarse 5 veces
– Cada vez que se ejecuta debe decirnos cuantas pruebas nos
quedan
• Puede ser necesario otro programa que inicialice o
modifique el nú
número de evaluaciones posibles
49
Comunicaciones HTTP
• J2ME permite hacer conexiones por HTTP
• Esto permite hacer cualquier tipo de aplicació
aplicaci ón en la que
el dispositivo m óvil será
ser á el cliente
• Lo único que hay que hacer es definir un protocolo
propio para interpretar los mensajes entre el cliente y el
servidor
• Lo má
m ás sencillo es que el servidor devuelva texto plano
• Por ejemplo, el telé
tel éfono pide por el mé
método get la lista
de citas del dí
día, y el servidor las devuelve:
Cliente (Teléfono abre esta dirección) El servidor devuelve texto plano
50
25
Vibraci
ibracióón, iluminació
iluminación
• Para hacer vibrar el telé
tel éfono a partir de MIDP 2.0
– Display.vibrate
Display.vibrate(100)
(100) .-
.- Tiempo en Milisegundos
– Display.flashBacklight(tiempo
Display.flashBacklight(tiempo).
).-- Enciende la luz del telé
teléfono
• Para probar estas caracterí
caracter ísticas se va a mostrar un
programa que permitirá
permitirá usar el telétel éfono para dar
masajes o como una linterna :- :- )
• En el emulador la vibració
vibraci ón se muestra con un zumbido
• La luz de fondo se muestra con un marco de color
• No todos los telé
tel éfonos permiten controlar la luz y el
vibrador
• Estos efectos son muy útiles para los juegos, como la
vibració
vibraci ón de los keypad
keypad/volantes
/volantes de las consolas
51
Programa:: DBVMasaje
Programa
zumbido
52
26
Sonidos
• Tonos en la clase Manager
playTone(int nota, int duracion, int volumen)
53
Knight Rider
Master Esquivador Nemo Persia
Puzzle Booble
54
27
Para ampliar
ampliar……
• Servicios Web (jsr172)
• Bluetooth/OBEX (jsr82)
• Grá
Gr áficos 3D (jsr184)
• Sonidos y Música
sica.. MMAPI(Mobile Media API-API-jsr135)
• Uso de push para iniciar aplicaciones desde un servidor
en el movil
• Location (jsr179) Localizaci
Localizació
ón geogr
geográáfica (CLDC 1.1)
55
Referencias
Libros sobre programació
programación de Juegos
(Algunas imá
imágenes tomadas de estos libros)
libros)
• Steve Rabin, “AI Games Programming Wisdom 1 y 2” 2”, 2002, 2004 de
Ed. Charles River Media
• Serie “Games Programming Gems 1, 2 y 3”,2000,2001,2002 de Ed.
Charles River Media
• Mat Buckland, “AI Techniques for Game Programming”
Programming”, 2002
• Antonio Ruiz, “Có mo Programar Videojuegos en Windows”
Windows”, 2001, Ed.
Rama
56
28
Referencias
Libros
• Jonathan Knudsen, “Wireless Java: Developing with J2ME”
J2ME ”, 2nd edition.
Ed. APress
APress,, 2003.
• James Keogh, “The Complete Reference: J2ME”
J2ME ”, Ed. Osborne, 2003.
• Jason Lam, “J2ME & Gaming”
Gaming”, 2004.
http://www.jasonlam604.com
Art ículos
Artí
• Qusay H. Mahmoud
Mahmoud,, “Wireless Application Programming with J2ME and
Bluetooth””, 2003
Bluetooth
http://developers.sun.com/techtopics/mobility/midp/articles/bluetoot
http ://developers.sun.com/techtopics/mobility/midp/articles/bluetooth1/
h1/ y /bluetooth2/
• Jonathan Knudsen, “Creating 2D Action Games with the Game API
API””,
2003. http
http://developers.sun.com/techtopics/mobility/midp/articles/game/
://developers.sun.com/techtopics/mobility/midp/articles/game/
Webs de Inter
Interé és
Forum Nokia. http://
http://www.forum.nokia.com
www.forum.nokia.com//
Java en sun. http://java.sun.com/
Dispositivos que soportan j2me: http://jal.sun.com/webapps/device/device
57
29