Explicación del código
Clase Demo1
No sufre ningún cambio respecto a la entrada anterior.
Clase SSCanvas
El principal cambio es añadir la capacidad de escuchar (leer) desde el teclado del ratón los eventos producidos por este (eventos son las acciones que puede producir un objeto, en el caso del teclado son cuando una tecla es pulsada, es soltada, etc). Con esto haremos que uno de los sprites (el que llamamos player) podamos moverlo por la pantalla en el sentido que le indiquemos por medio del teclado o joystick del movil. El otro cambio es crear un sprite más llamado player que será con el que interactuemos con el teclado y unas lineas más de codigo para actualizar su posición y el pintado en pantalla.
Clase Sprite
Aqui añadiremos más atributos para controlar el estado del desplazamiento (utilizado por player), otros atributos estáticos para identificar las teclas pulsadas y 3 métodos más. El primer método es computePlayer que controlara el movimiento del sprite cuando se utilice un teclado, luego dos métodos que que controlaran en que dirección debe desplazarse, el primero keyDown activa el desplazamiento y keyUp desactiva el desplazamiento.
Código fuente
/importamos las clases de java que utilizaremos en nuestro programa
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/*aqui nuestro MIDlet, esta clase sera la primera en ser ejecutada cuando se
ejecute el programa*/
public class Demo1 extends MIDlet {
//metodo cuando el midlet arranca
public void startApp() {
//creamos un objeto SSCanvas (nuestra pantalla de juego)
SSCanvas screen=new SSCanvas();
//indicamos al dispositivo que screen (instancia de SSCanvas) será la
//nueva pantalla activa
Display.getDisplay(this).setCurrent(screen);
new Thread(screen).start(); //arrancamos el bucle (nuevo hilo de ejecución)
}
//metodo cuando el midlet entra en pausa
public void pauseApp() {
}
//metodo cuando el midlet es destruido
public void destroyApp(boolean unconditional) {
}
}
//esta clase es la encargada de hacer funcionar nuestra aplicación gráfica
class SSCanvas extends Canvas implements Runnable{
private Sprite ball;
private Sprite player;
//metodo constructor
public SSCanvas(){
//instanciamos (creamos) el objeto ball a partir de la clase Sprite
ball = new Sprite(getWidth()/2,getHeight()/2,20,20);
player = new Sprite(getWidth()/2,getHeight()/3,30,30);
}
public void run(){
while(true){
//actualizamos la posicion de la bola
ball.compute(getWidth(),getHeight());
player.computePlayer(getWidth(),getHeight());
//forzamos el repintado de la pantalla
repaint();
serviceRepaints();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
}
}
}
//metodo de la clase canvas para pintar en pantalla
public void paint(Graphics g){
//seleccionamos el color negro para pintar el fondo
g.setColor(0,0,0);
//pintamos el fondo de pantalla con un rectangulo con el tamaño de
//la pantalla getWidth() y getHeight() es un método de la clase canvas
//que nos devuelve el ancho y alto de la pantalla
g.fillRect(0,0,getWidth(),getHeight());
//pintamos la bola en pantalla
ball.draw(g);
player.draw(g);
}
/*sobrecarga de método para detectar cuando una tecla es soltada
por el usuario*/
public void keyReleased(int keyCode) {
int action=getGameAction(keyCode);
switch (action) {
case LEFT:
player.keyUp(player.LEFT);
break;
case RIGHT:
player.keyUp(player.RIGHT);
break;
case UP:
player.keyUp(player.UP);
break;
case DOWN:
player.keyUp(player.DOWN);
break;
case FIRE:
break;
}
}
//sobrecarga del método que detecta cuando una tecla es pulsada por el usuario
public void keyPressed(int keyCode) {
int action=getGameAction(keyCode);
switch (action) {
case LEFT:
player.keyPress(player.LEFT);
break;
case RIGHT:
player.keyPress(player.RIGHT);
break;
case UP:
player.keyPress(player.UP);
break;
case DOWN:
player.keyPress(player.DOWN);
break;
case FIRE:
break;
}
}
}
class Sprite{
//atributos privados
protected int x;
protected int y;
protected int width;
protected int height;
protected int incX,incY;
private boolean startX=false;
private boolean startY=false;
//declaracion de constantes
protected static final int LEFT = 1;
protected static final int RIGHT = 2;
protected static final int UP = 3;
protected static final int DOWN = 4;
protected static final int FIRE = 5;
//metodo constructor
public Sprite(int x,int y,int width,int height){
this.x=x;
this.y=y;
this.width=width;
this.height=height;
incX=3;
incY=3;
}
//metodo que actualiza la posición del sprite
public void compute(int screenW, int screenH){
if(x <= 0)incX=3;
else if(x+width >= screenW)incX=-3;
x+=incX;
}
//metodo que actualiza la posicion del sprite que controlamos por teclado
public void computePlayer(int screenW, int screenH) {
if(x + incX > 0 && (x + incX) < (screenW - width)){
x+=incX;
if(startX==false)incX=0;
}
if(y + incY > 0 && (y + incY) < (screenH - height)){
y+=incY;
if(startY==false)incY=0;
}
}
//metodo para detener el desplazamiento del sprite
public void keyUp(int keyCode) {
switch (keyCode) {
case LEFT:
startX=false;
break;
case RIGHT:
startX=false;
break;
case UP:
startY=false;
break;
case DOWN:
startY=false;
break;
}
}
//método para indicar la dirección del desplazamiento
public void keyPress(int keyCode) {
switch (keyCode) {
case LEFT:
incX=-5;
startX=true;
break;
case RIGHT:
incX=5;
startX=true;
break;
case UP:
incY=-5;
startY=true;
break;
case DOWN:
incY=5;
startY=true;
break;
case FIRE:
break;
}
}
//metodo que muestra en pantalla al sprite
public void draw(Graphics g){
g.setColor(250,0,0);
g.fillArc(x,y, width, height,0, 360);
}
}
No hay comentarios:
Publicar un comentario