Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Street Chase
Street Chase
StreetChase
Documento técnico
Programación Orientada a Objetos II
Presenta:
Roberto Alonso Renteria Cuevas
Profesora de POO II: Profesor de EDT:
Dra. Dora Luz Flores M.C. David Cerón
Este proyecto busca desarrollar un videojuego el cual podrá ejecutarse en celulares con
compatibilidad de aplicaciones MIDlet, estas son aplicaciones desarrolladas para la platafor-
ma java ME, esta es una tecnologı́a que está incluida en la mayorı́a de los teléfonos móviles
de nueva generación.
En particular este proyecto reúne las caracterı́sticas de un video juego de carreras y per-
secución en el que estarán conduciendo un auto a alta velocidad a través de una calle muy
transitada y tendrán que esquivar a los demás autos y obstáculos que se atraviesen en el
camino como baches y otro tipo de cosas. Para hacer más fácil el juego se podrán recoger
objetos en el camino estos pueden ser bonos, vidas, objetos para regenerar los daños del auto
y armas que podrán utilizarse para abrirse paso a través de las calles ası́ como también para
evitar a la policı́a.
El principal objetivo de este juego será conducir el auto a la meta sin destruirlo o sin ser
atrapado por la policı́a.
El juego constara de tres modos de juego en cuanto a dificultad en los cuales incrementara
la velocidad del juego y los daños recibidos, también tendrá tres diferentes niveles en los que
cambiara el diseño del las calles y la dificultad del juego, esto para hacerlo menos monótono.
Abstract
This project seeks to develop a video game which can run on phones with MIDlet ap-
plication compatibility, which are applications developed for the Java ME platform, this is a
technology that is included in most new generation mobile phones.
In particular this project has the characteristics of a pursuit racing videogame in which
they’ll drive a car at high speed through a busy street and have to dodge other cars and
obstacles on the road. To make easier the game will pick up objects in the way these bonus
can be, lives, objects to regenerate the damage to the car, and weapons that may be used to
fight their way through the streets as well as to avoid the police.
The main objective of this game is drive the car to the finish line without destroys it or
be caught by police.
The game has three play modes of difficulty, which they will change the speed of play and
the possibility of be damage, also have three different levels they’ll which change the design
of streets and the difficulty of the game, this to make it less bored.
Índice general
1. Introducción II
1.2. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vi
2. MIDlets 1
2.2. Imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3. Pantallas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3. Ambiente Grafico 13
3.1. Sprites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2. Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.1. Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5. Proyecto Terminado 36
Introducción
JVM: (máquina virtual de java) es un programa que funciona como plataforma para
interpretar el bytecode (código maquina de bajo nivel) generado por el compilador de java
1. Introducción iii
la principal ventaja de JVM es que el mismo código escrito en Java puede ejecutarse en
cualquier plataforma ya sea Windows, Linux u otro sistema operativo con el simple hecho de
tener instalada la Màquina virtual de Java.
JAR: (Archivo Java) este es un tipo de archivo de compresión que contiene en su interior
archivos pertenecientes a una aplicación de Java, como pueden ser clases, librerı́as y archivos
como imágenes y sonido que forman parte de la aplicación.
Su sintaxis es la siguiente:
El parámetro texto alternativo es un texto que se mostrará en el caso en el que no sea posible
mostrar el gráfico. El parámetro layout indica cómo se posicionará el gráfico en la pantalla.
Sus posibles valores son:
LAYOUT_DEFAULT
LAYOUT_LEFT
LAYOUT_RIGHT
LAYOUT_CENTER
LAYOUT_NEWLINE_BEFORE
LAYOUT_NEWLINE_AFTER
La clase DateField: Con DateField tenemos una herramienta que permite la entrada de
datos de tipo fecha o tipo hora. Su sintaxis es la siguiente:
La clase ChoiceGroup: este elemento permite seleccionar un valor de una lista de opciones.
Su sintaxis es la siguiente:
StreetChase
En Este proyecto se desarrollara un video juego para dispositivos móviles que implementen
la tecnologı́a Java ME (Java Micro Edition). Este video juego es un juego de carreras y
persecución en el que el jugador estará conduciendo un auto a través de una calle muy tran-
sitada en la que el reto será llegar a la meta sin sufrir mayores daños, el jugador tendrá que
evadir a otros autos y obstáculos que se atraviesen en el camino para hacer más fácil el juego
se podrá capturar objetos en el camino estos objetos podrán ser:
-Vidas.
-Armas.
-objetos para regeneración de daños.
-objetos.
Controles:
Las teclas con las que se utilizara el juego serán las siguientes:
2 = Arriba
4= Izquierda
6 = Derecha
8 = Abajo
0 = Disparo
5 = Utilización de objetos encontrados en el camino.
1. Introducción vi
1.2. Objetivo
El principal objetivo de este juego es conducir un auto hasta la lı́nea de meta sin recibir
suficientes daños, para esto el jugador deberá esquivar obstáculos en el camino y a los demás
autos que circulan en el camino.
El jugador tiene como meta terminar los tres niveles del juego, en los que se incrementara
sucesivamente la velocidad y dificultad del juego.
MIDlets
El objetivo de Esta práctica es mostrar en la pantalla del celular el nombre del proyecto
y además tiene que aparecer justo en el centro de la pantalla.
Para realizar esta prácticas se utiliza una Clase de Java microedition llamada “Canvas” o
Lienzo en español esta es una subclase de la clase Displayable que forma parte del paquete
“lcdui”.
1- El primer paso es crear el proyecto con la estructura básica que debe llevar un MIDlet,
esto es incluir los paquetes lcdui y midlet, hacer una clase que herede directamente de mi-
dle y en este caso implementamos la interface CommandListener para poder introducir un
comando para salir de la aplicación, asi como también los métodos básicos del MIDlet estos
son: el constructor, el método startApp(), pauseApp() y destroyApp(boolean unconditional).
2- El siguiente paso es crear los campos de nuestra clase en este caso fueron dos:
2. MIDlets 2
3.- El siguiente paso es crear otra clase que heredara de la Clase Canvas. Esta clase no llevara
campos solo el método paint(Graphics g). este método desplegara el mensaje en pantalla;
Este método lo primero que hace es obtener la anchura y altura de la pantalla mediante los
métodos: getWidth() y getHeight().
Para desplegar el nombre del proyecto en pantalla se utiliza un método llamado drwString();
public Practica2() {
//crea el commando Salir
exitCommand = new Command("Salir", Command.EXIT, 2);
d = new TextoCentrado();
//esta parte agrega el commando y un titulo a nuestro objeto Displayable
d.addCommand(exitCommand);
d.setTitle("Nombre Proyecto");
d.setCommandListener(this);
}
2.2. Imágenes
Objetivo:
Esta práctica trata de realizar un programa que implemente imágenes en un MIDlet, este
deberá ser un programa que desplegué en la pantalla del teléfono celular una imagen referente
al proyecto a realizar para esto se utilizara una subclase de la clase Item llamada ImageItem.
Procedimiento:
1) Primero se crea o escoge una imagen de preferencia con formato .PNG, es importante
que la imagen no sobrepase a la resolución del dispositivo utilizado.
3) El siguiente paso es crear su clase principal con sus métodos correspondientes y como
capos un objeto de tipo Display.
4) Una vez creada la clase queda solamente queda crear el método startApp este es el
método principal de la clase el cual deberá contener el siguiente código:
5) Por último se crean los paquetes JAR y JAD para después ejecutarlos en su dispositivo
móvil.
2. MIDlets 5
2.3. Pantallas
Objetivo:
Crear el menú principal del video juego el cual debe de incluir las siguientes opciones:
-Jugar
-Reglas
-Mejores puntuacuiones
-Creditos
Además crear las pantallas para las reglas del juego y los créditos.
Introducción:
Para esta práctica se utilizaros Screens de tipo List y Form. Para realizar el menú principal
se utilizo una Lista de tipo IMPLICIT, estas despliegan una listas de elementos en las que se
puede seleccionar solo un elemento a la vez. Para obtener el elemento seleccionado o verificar
si un elemento fue seleccionado en el menú se puede utilizar el método getSelectedIndex()
o también el método isSelected(int NUM ELEMENTO), la diferencia es que el primero
regresa el numero del elemento seleccionado y el otro es un método booleano que te dice si
un elemento en especifico fue seleccionado.
Para desplegar las reglas del juego y los créditos se utilizaron objetos de tipo StringItem.
Procedimiento:
1- Crear un nuevo MIDlet.
2- Hacer una clase con el nombre Menú la cual contendrá los siguientes campos:
3- Crear el constructor.
public Menu() {
display = Display.getDisplay(this);
// Crea los comandos
exit = new Command("Salir", Command.EXIT, 1);
ok = new Command("OK", Command.OK, 1);
regresar = new Command("Regresar", Command.BACK, 1);
// genera un vector con los nombres de las opciones
String[] opciones = new String[]{"JUGAR", "REGLAS", "MEJORES PUNTUACIONES", "CRÉDITOS"};
// crea la Lista para el Menu
menu = new List("OPCIONES", List.IMPLICIT, opciones, null);
// Agrega los comandos al menu
menu.addCommand(exit);
menu.addCommand(ok);
menu.setCommandListener(this);
}
4- Después se crea un método para manejar las selecciones que se hagan en el menú prin-
cipal.
creditos();
}
5- Después se crean cada uno de los métodos que serán llamados cada que se seleccione
una opción en el menú principal en esta práctica solo se crearon los métodos que despliega
las reglas del juego y los créditos. Las dos métodos tienen el siguiente formato:
} else if (c == regresar) {
display = Display.getDisplay(this);
display.setCurrent(menu);
}
}
Resultados
setColor()
Este método establece el color a utilizar al dibujar un objeto en pantalla.
Sintaxis:
void setColor(int rojo, int verde, int azul)
Los parámetros de color tienen un rango de 0 a 255.
setGrayScale()
Este método se utiliza para escoger la tonalidad de grises para dibujar un objeto en pantalla,
este puede utilizar para dispositivos que no tienen pantalla a color.
Sintaxis:
void setGrayScale(int tono)
El parámetro tono puede tomar un valor entre 0 y 255.
drawLine()
Este método dibuja una lı́nea de una coordenada inicial a una final.
Sintaxis:
void drawLine (int x1, int y1, int x2, int y2)
dibuja una lı́nea que une el punto (x1, y1) con (x2, y2).
drawRect()
Este método dibuja un rectángulo en pantalla.
Sintaxis:
void drawRect (int x, int y, int ancho, int alto)
Los parámetros (x , y) indican cual será la esquina superior izquierda del rectángulo.
2. MIDlets 10
Los siguientes dos parámetros nos indican el ancho y el alto que tendrá el rectángulo en
pı́xeles.
drawRoundRect()
Este método también sirve para dibujar rectángulos pero con sus esquinas redondeadas.
Sintaxis:
void drawRoundRect (int x, int y, int ancho, int alto, int ancho arco, int al-
to arco)
Los parámetros (x,y) son las coordenadas de la esquina superior izquierda.
Los dos siguientes parámetros establecen el alto y ancho del rectángulo.
Los otros dos parámetros son al ancho y el alto del arco de las esquinas.
-El método que despliega un rectángulo con esquinas redondeadas con relleno es el sigu-
iente:
void fillRoundRect (int x, int y, int ancho, int alto, int ancho arco, int al-
to arco)
drawArc()
Con este método se pueden dibujar secciones de arco.
void drawArc(int x, int y, int ancho, int alto, int ángulo inicial, int ángulo)
Los parámetros (x,y) son las coordenadas en donde se anclara el arco.
Los siguientes dos parámetros establecen el alto y ancho.
2. MIDlets 11
Los siguientes parámetros establecen el ángulo inicial y el ángulo del arco (longitud del arco).
drawString()
Este método permite desplegar texto en pantalla en modo grafico.
Sintaxis:
void drawString (String texto, int x, int y, int ancla)
El primer parámetro es el texto que queremos mostrar.
Los parámetros (x, y) indican la posición donde se situara el texto dentro de la pantalla.
El cuarto parámetro indica cuál es el punto de referencia para situar el texto en las coorde-
nadas.
Los valores posibles son:
TOP, BASELINE y BUTTOM para la posición vertical del texto.
LEFT, HCENTER y RIGHT para la posición horizontal del texto.
setFont()
2. MIDlets 12
drawImage()
Este método se utiliza para desplegar imágenes en una posición determinada.
Sintaxis:
boolean drawImage(Image img, int x, int y, int ancla)
Los parámetros (x,y) son las coordenadas donde se situara la imagen.
El último parámetro es donde se anclara el texto en las coordenadas, sus posibles valores son:
TOP, VCENTER y BUTTON determinan el posicionamiento vertical (superior, cento verti-
cal, base).
LEFT, HCENTER, RIGHT para la posición horizontal (lado izquierdo, centro horizontal,
lado derecho).
Capı́tulo 3
Ambiente Grafico
3.1. Sprites
Introducción:
En esta sección se creara un MIDlet en el que se utilizaran “Sprites”, esto es un elemento
grafico con identidad propia al cual se pude cambiar su aspecto y posición en pantalla entre
otras cosas, este puede ser un auto, avión, pelota, etc.
Se utilizara el método “boolean collide(Sprite sp)” para determinar si dos “Sprites” están
utilizando el mismo espacio en pantalla.
Objetivo:
Desarrollar un MIDlet en el que se empleen dos o más “Sprites” y desplegué un mensaje si
hay colisión entre los dos Sprites.
Desarrollo:
1- Crear la clase Sprite con los siguientes campos y constructor.
3. Ambiente Grafico 14
class Sprite {
private int posx, posy; //indicaran las coordenadas del Sprite
private boolean active; //indica si esta activo el Sprite
private int frame, nframes; //frame actual y num total de frames
private Image[] sprites; // vector que contiene a los frames
//modificadores
public void setX(int x) {
posx = x;
}
public void setY(int y) {
posy = y;
}
// accesadores.
if (((x1 + w1) > x2) && ((y1 + h1) > y2) && ((x2 + w2) > x1) && ((y2 + h2) > y1)) {
return true;
} else {
return false;
}
}
//método que despliega al Sprite en pantalla
public void draw(Graphics g) {
g.drawImage(sprites[frame], posx, posy, Graphics.HCENTER | Graphics.VCENTER);
}
}
2- Generar una clase que herede de Canvas. En esta clase se crearan los Sprites
y contendrá el método que desplegara un mensaje en pantalla si hay colisión entre
los Sprites.
public SSCanvas() {
//agregar las imágenes para los Sprites
miSprite1.addFrame(1, "/fig.png");
miSprite2.addFrame(1, "/fig2.png");
//establecer las coordenadas de los Sprites
miSprite1.setX(getWidth() / 2);
miSprite1.setY(getHeight() / 2 + 50);
3. Ambiente Grafico 17
miSprite2.setX(60);
miSprite2.setY(50);
//activar a los dos Sprites
miSprite1.setActive(true);
miSprite2.setActive(true);
}
public void paint(Graphics g) { //método para dibujar la pantalla
g.setColor(0, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight()); //limpia la pantalla
//despliega los Sprites
miSprite1.draw(g);
miSprite2.draw(g);
//si el Sprite1 colisiona con Sprite2 despliega el String ‘‘Colisión’’
g.setColor(250, 1, 1);
if (miSprite1.collide(miSprite2))
g.drawString("Colisión", getWidth() / 2, 20, Graphics.BASELINE | Graphics.HCENTER);
}
}
public SpriteTest() {
display = Display.getDisplay(this);
screen = new SSCanvas();
}
public void startApp() throws MIDletStateChangeException {
display.setCurrent(screen);
}
3. Ambiente Grafico 18
Resultados:
3.2. Mapas
Introducción:
En esta sección se desarrollara una aplicación MIDlet la cual contendrá el mapa del proyecto
elegido, un mapa es el grafico principal de un videojuego que contiene todos los elementos
gráficos como Sprites y Layers (capas), que pueden estar conformado de pequeños cuadros
que juntos forman las capas del juego. Los elementos pueden ser estáticos (sin animación) o
dinamicos.
Objetivo:
Crear el mapa del proyecto utilizando las clases de Java GameCanvas, TiledLayer y Lay-
erManager para definir el fondo de la pantalla. Debe contener el menor número de imágenes
con las cuales se formará el fondo completo del proyecto.
Procedimiento:
2- Crear las imágenes que contendrán los cuadros que conforman los elementos
visuales del video juego.
// CONSTRUCTOR
public StreetChase(boolean b) {
super(b);
int y = coordY + 160;
// Inicializacion de variables
g = getGraphics();
// Layer manager en el que colocar los distintos
// elementos visuales que componen la aplicacion
lm = new LayerManager();
//se asignan las imagenes
try {
tiled = Image.createImage("/tiledLayer.png");
3. Ambiente Grafico 21
sprited = Image.createImage("/carro1.png");
} catch (java.io.IOException e) { }
// Inicializacion del TiledLayer
tl = new TiledLayer(13, 48, tiled, 16, 16);
//continua en el siguiente paso
//rellena la capa de fondo del mapa con los elementos del vector map[]
for (int i = 0; i < map.length; i++) {
int column = i % 13;
int row = (i - column) / 13;
tl.setCell(column, row, map[i]);
}
// hacemos visible el TiledLayer que dibuja el fondo
tl.setVisible(true);
5- Una vez creado el mapa de fondo se crean los demás elementos que conforman
el juego como pueden ser Sprites, capas y demás elementos visuales, para después
ser añadidos al objeto LayerManager.
3. Ambiente Grafico 22
6- En el constructor se define la región del mapa que será visible con setViewWin-
dow().
this.actualizaPosicion(keyState);
lm.setViewWindow(coordX, coordY, WIDTH_VW, HEIGHT_VW);
carro.setRefPixelPosition(coordXSprite, coordYSprite);
// Responder a la pulsacion de teclas,
// repintando
lm.paint(g, 0, 0);
flushGraphics();
// Esperamos.
Thread.sleep(50);
}
} catch (Exception e) {
System.out.println(e);
} } }
Resultados:
Introducción:
Parametros:
* s = Sprite con el cual se revisara si hay collision.
* pixelLevel = true prueba si existe colisión tomando en cuenta solo los pixeles opacos,
false para detectar colisión tomando en cuenta los bordes.
Parámetros:
*Image= es el Objeto Image que establecerá si este colisiona con el Sprite.
*X =coordenada X de esquina superior izquierda.
*Y =coordenada Y de esquina superior izquierda.
*pixelLevel = true prueba si existe colisión tomando en cuenta solo los pixeles opacos ,
false para detectar colisión tomando en cuenta los bordes.
3. Ambiente Grafico 25
Parámetros:
*t= es la capa con la cual se determinara si existe colisión.
*pixelLevel = true prueba si existe colisión tomando en cuenta solo los pixeles opacos ,
false para detectar colisión tomando en cuenta los bordes.
Parámetros:
* X =coordenada X de esquina superior izquierda del rectángulo.
* Y =coordenada Y de esquina superior izquierda del rectángulo.
* width = longitud horizontal del rectángulo.
* height = longitud vertical del rectángulo.
Objetivo:
Realizar la parte del proyecto que involucra la utilización de Sprites y Colisiones.
Procedimiento:
3- Crear un método que revise en cada momento si existe alguna colisión, este
método deberá invocarse desde el método run().
Resultados:
Introducción:
En esta sección se desarrollara el primer nivel del juego, esto incluye el movimiento de los
enemigos y del Sprite que representa al jugador, ası́ como también el manejo de colisiones;
en esta sección también se establecen los daños que aumentaran cada vez que el jugador coli-
sione con algo y en el caso de las vidas se descontara una cada vez que los daños lleguen a 100.
Procedimiento:
1- El primer paso fue agregar los campos a la clase del juago para representar
a los enemigos, balas, jugador y las vidas.
// CAMPOS DE LA CLASE
int vidas; //contador de Vidas
Sprite[] arbol = new Sprite[6]; //Sprites arboles del mapa
Sprite[] bala = new Sprite[6]; //Sprites para las balas
Auto player; //Sprite del Jugador
Auto auto[] = new Auto[6]; //Sprites para el trafico
2- Después se crearon los siguientes métodos para inicializar todos los Sprites
del Juego:
public void inicializarAutos(); //crea y asigna valores iniciales a los autos del juego
public void inicializarBalas(); //utiliza un ciclo para inicializar las balas
void colisiones(int i) {
if (player.collidesWith(auto[i], true) && auto[i].getDeterioro() == 0) {
auto[i].setFrame(auto[i].getFrame() + 2);
auto[i].setDeterioro(auto[i].getDeterioro() + 30);
if (player.getDeterioro() == 0) {
player.setImage(playerCollideImg, 18, 33);
}
player.setDeterioro(player.getDeterioro() + 30);
} else if (player.collidesWith(arbol[i], true)) {
arbol[i].setFrame(i + 6);
if (player.getDeterioro() == 0) {
3. Ambiente Grafico 30
Resultados:
4.1. Registros
Introducción:
En esta práctica se realizara la parte del proyecto que almacenara los records del juego,
para esto se utilizaran las clases del paquete RMS(Record Manegment System); Este
paquete contiene todo lo necesario para crear, manipular, comparar y modificar registros.
Objetivo:
Realizar la opción para capturar el nombre del jugador e implementar el puntaje que el
jugador va adquiriendo en el juego, además ya debe mostrar cuando se termina el primer
nivel o en su caso cuando el jugador no alcance a terminarlo. El juego deberá tener la opción
para mostrar los mejores 5 puntajes, incluyendo el nombre de jugador en orden descendente.
Procedimiento:
4. RMS(Record Manegment System) 32
1- Realizar una clase que se encargue del manejo de registros, esta clase debe
de implementar la interface RecordComparator para ordenar los registros; la
clase debe contener los siguientes campos y constructor :
4- El siguiente paso es crear un método que regrese una lista de scores ordena-
da de mayor a menor, este método podrá ser llamado para desplegar los records
en pantalla.
4. RMS(Record Manegment System) 34
registros.addScore(score, nick);
void addNick() {
formulario.addCommand(regresar);
formulario.addCommand(jugar);
formulario.setCommandListener(this);
//formulario.append(fondo);
formulario.append(nickInput);
}
-la siguiente line es utilizada para pasar el nombre del jugador al juego para
después crear el registro.
juego.setNick(nickInput.getString());
Proyecto Terminado
Introducción:
En esta práctica se verá como agregar más niveles al juego y además agregar dificultad a
cada nivel agregando mas enemigos, para esto se requiere crear un nuevo mapa e imágenes
de los sprites esto para cambiar el aspecto del escenario del juego al pasar al siguiente nivel
y también inicializar de nuevo todos los sprites y posiciones. También se agregara la parte
del proyecto que despliega el puntaje actual.
Objetivo:
Crear y agregar nuevos niveles del juego además implementar el puntaje actual y aumentar
la dificultad cada que se pase de nivel.
5. Proyecto Terminado 37
Procedimiento:
1- El primer paso para agregar otro nivel al juego es crear las imágenes que
serán utilizadas en el nuevo mapa y en los sprites que serán agregados.
2- Después se agrega una bandera a la clase del juego, esta bandera se activara
cuando se termine cada nivel. También debe agregarse una variable que almacene
el nivel en que se encuentre el juego.
4- Se crea un método que inicialicé el siguiente nivel este método debe hacer
lo siguiente: -cambiar las imágenes del mapa. -restablecer los valores por default
de sprite de jugador. -inicializar de nuevo los arboles con las nuevas imágenes.
-restablecer los autos a sus valores iniciales. -desaparecer explosiones activas.
5. Proyecto Terminado 38
explosion[i].setActive(false);
explosion[i].setVisible(false);
explosion[i].setFrame(0);
}
lm.paint(g, 0, 0);//repintar
flushGraphics();
try { //Hace una pequenia pausa antes de iniciar el siguiente nivel.
Thread.sleep(3000);
} catch (InterruptedException ex) {}
}
Para desplegar el puntaje actual en pantalla se agrega la siguiente lı́nea al método run().
Resultados:
5. Proyecto Terminado 40
Figura 5.2: Imagen que muestra los dos niveles uno y dos.
5. Proyecto Terminado 41