J2ME: Videojuegos con GameCanvas en un MIDLET

jueves, 22 de abril de 2010 15:22 Publicado por Joseph Gonza Chavez
Etiquetas:

 En esta MIDLET estaremos usando la clase "GameCanvas" para desarrollar un pequeño videojuego para el movimiento de un personaje en nuestro celular.


Tipo: Midlet
capa.java_________________


package frames.manager;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Capa extends MIDlet {
    JuegoGameCanvas3 juego;
    Display display;
    public void startApp() {
        display=Display.getDisplay(this);
        juego=new JuegoGameCanvas3(true);
        display.setCurrent(juego);
        Thread t=new Thread(juego);
        t.start(); //
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}
__________________________

Tipo: Clase Java
JuegoGameCanvas3.java_________________

 package frames.manager;
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.lang.*;

public class JuegoGameCanvas3 extends GameCanvas implements Runnable{
    //variables
    int width;
    int height;
    int coordX=0;
    int coordY=0;
    int coordXSprite;
    int coordYSprite;

    final static int WIDTH_VW=180;
    final static int HEIGHT_VW=177;

    Image tiled=null;
    Image sprited=null;
    LayerManager lm;
    TiledLayer tl;
    Sprite sprite;

    Graphics g;
    //constructor
    public JuegoGameCanvas3(boolean b){
        super(b);
        //Inicializacion de variables
        width=getWidth();
        height=getHeight();
        g=getGraphics();

        //Layer manager en el que colocar los distintos
        //elementos visuales que componen la aplicacion

        lm=new LayerManager();
        //inicializacion de tiledlayer
        try{
            tiled=Image.createImage("/frames/manager/tiledLayer.png");
        }catch(java.io.IOException e){

        }
        tl=new TiledLayer(20,11,tiled,16,16);
        try{
            sprited=Image.createImage("/frames/manager/imgSprite.png");
        }
        catch(java.io.IOException e){

        }
        int[]map={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,6,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,6,
        1,5,3,4,1,1,5,3,3,4,1,1,1,1,1,1,1,1,5,3,
        5,3,3,3,4,5,3,3,3,3,4,1,1,1,5,3,3,3,3,3,
        3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};

        for(int i=0;i
            int column=i%20;
            int row=(i-column)/20;
            tl.setCell(column, row, map[i]);
        }
        //hacemos visible el tiledLyer que dibuja el fondo
        tl.setVisible(true);
        //Sprite que representa la animacion
        sprite=new Sprite(sprited,15,25);
        int[]sequence={0,1,2,3};
        coordXSprite=width/2;
        coordYSprite=112;
        sprite.setFrameSequence(sequence);
        sprite.defineReferencePixel(0,25);
        sprite.setRefPixelPosition(coordXSprite, coordYSprite);
        sprite.setTransform(Sprite.TRANS_MIRROR);
        sprite.setVisible(true);

        //añadimos los distintos layers al LayerManager
        lm.append(sprite);
        lm.append(tl);

        //Definimos la ventana visible y la dibujamos
        lm.setViewWindow(0, 0,WIDTH_VW, HEIGHT_VW);
        lm.paint(g, 0, 0);
        flushGraphics();
    }
    public void run(){
        while(true){
            try{
                //Actualizar el estado del juego
                int keyState=this.getKeyStates();
                if(keyState!=0){
                    this.actualizaPosicion(keyState);
                    lm.setViewWindow(coordX, coordY, WIDTH_VW, HEIGHT_VW);
                    sprite.setRefPixelPosition(coordXSprite,coordYSprite);
                    //Responder a la pulsacion de teclas,
                    //repintando aqui por ejemplo
                    lm.paint(g, 0, 0);
                    flushGraphics();
                    //Esperemos
                    Thread.sleep(50);
                }
            }catch(Exception e){
                System.out.println(e);
            }
        }
    }

    //Actualiza la posicion del Sprite en funcion de la accion ejecutada
    public void actualizaPosicion(int key){
        switch(key){
            case 4:
                if(coordX > 3){
                    coordX -=4;
                    sprite.prevFrame();
                    coordXSprite-=4;
                }
                break;
            case 32:
                if(coordX
                    coordX +=4;
                    sprite.nextFrame();
                    coordXSprite+=4;
                }
                break;
            case 2:
                if(coordY
                    coordY -=4;
                    sprite.nextFrame();
                    coordYSprite-=4;
                }
                break;
             case 64:
                if(coordY
                    coordY +=4;
                    sprite.prevFrame();
                    coordYSprite+=4;
                }
                break;
          
        }
    }



}
______________________________________


Archivo Imagen que se usaron:

imgSprite.png



tiledLayer.png

Comments (3)

Muchas gracias por el codigo pero esta incompleto en unas partes

en un for:

for(int i=0;i //falta todo esto){
int row=(i-column)/20;
tl.setCell(column, row, map[i]);
}


y 3 if's

case 32:
if(coordX //falta todo esto){
coordX +=4;
sprite.nextFrame();
coordXSprite+=4;
}
break;
case 2:
if(coordY //falta todo esto){
coordY -=4;
sprite.nextFrame();
coordYSprite-=4;
}
break;
case 64:
if(coordY //falta todo esto){
coordY +=4;
sprite.prevFrame();
coordYSprite+=4;
}

de ante mano amigo y gran codigo es de mucha ayuda

Lo que falta del código no es mucho, estoy comenzando con esto de los juegos para moviles y creo que nada mejor que java para empezar...
Nunca habia usado antes ni un sprite ni tiles, la verdad muchas muchas gracias!!!

Publicar un comentario