�M1945.java
package mygame; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*; import java.io.*; public class M1945 extends MIDlet implements CommandListener { private Command exitCommand, playCommand, endCommand; private Display display; private SSCanvas screen; public M1945() { display=Display.getDisplay(this); exitCommand = new Command("Salir",Command.SCREEN,2); playCommand = new Command("Jugar",Command.CANCEL,2); endCommand = new Command("Salir",Command.SCREEN,2); screen=new SSCanvas(); screen.addCommand(playCommand); screen.addCommand(exitCommand); screen.setCommandListener(this); } public void startApp() throws MIDletStateChangeException { display.setCurrent(screen); } public void pauseApp() {} public void destroyApp(boolean unconditional) {} public void commandAction(Command c, Displayable s) { if (c == exitCommand) { if (screen.isPlaying()) { screen.quitGame(); } else { destroyApp(false); notifyDestroyed(); } } if (c == playCommand && !screen.isPlaying()) { // Play!!! new Thread(screen).start(); } } } class SSCanvas extends Canvas implements Runnable { private int score,sleepTime,cicle,lives,shield; private int indice_in, indice, xTiles, yTiles; private boolean playing,fireOn=false; private boolean done; private int deltaX,deltaY; private Hero hero=new Hero(1); private Enemy[] enemies=new Enemy[7]; private Bullet[] aBullet=new Bullet[7]; private Sprite intro=new Sprite(1); private Explode[] explode=new Explode[7]; private Sprite[] tile=new Sprite[5]; // Mapa del juego int map[] ={ 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,2,1,1,1,1,1, 1,1,1,4,1,1,1, 1,1,1,1,1,1,1, 1,1,3,1,2,1,1, 1,1,1,1,1,1,1, 1,4,1,1,1,1,1, 1,1,1,1,3,1,1, 1,1,1,1,1,1,1, 1,4,1,1,1,1,1, 1,1,1,3,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,2,1,1,1,1,1, 1,1,1,4,1,1,1, 1,1,1,1,1,1,1, 1,1,3,1,2,1,1, 1,1,1,1,1,1,1, 1,4,1,1,1,1,1}; public SSCanvas() { // Cargamos los sprites hero.addFrame(1,"/hero.png"); intro.addFrame(1,"/intro.png"); // Iniciamos los Sprites hero.on(); intro.on(); } void start() { int i; playing = true; sleepTime = 50; hero.setX(getWidth()/2); hero.setY(getHeight()-20); deltaX=0; deltaY=0; cicle=0; xTiles=7; yTiles=8; indice=map.length-(xTiles*yTiles); indice_in=0; score=0; lives=3; shield=0; // Inicializar enemigos for (i=1 ; i<=6 ; i++) { enemies[i]=new Enemy(2); enemies[i].addFrame(1,"/enemy1.png"); enemies[i].addFrame(2,"/enemy2.png"); enemies[i].off(); } // Inicializar balas for (i=1 ; i<=6 ; i++) { aBullet[i]=new Bullet(2); aBullet[i].addFrame(1,"/mybullet.png"); aBullet[i].addFrame(2,"/enemybullet.png"); aBullet[i].off(); } // Inicializamos los tiles for (i=1 ; i<=4 ; i++) { tile[i]=new Sprite(1); tile[i].on(); } tile[1].addFrame(1,"/tile1.png"); tile[2].addFrame(1,"/tile2.png"); tile[3].addFrame(1,"/tile3.png"); tile[4].addFrame(1,"/tile4.png"); // Inicializamos explosiones for (i=1 ; i<=6 ; i++) { explode[i]=new Explode(6); explode[i].addFrame(1,"/explode1.png"); explode[i].addFrame(2,"/explode2.png"); explode[i].addFrame(3,"/explode3.png"); explode[i].addFrame(4,"/explode4.png"); explode[i].addFrame(5,"/explode5.png"); explode[i].addFrame(6,"/explode6.png"); } } void computeEnemies() { int freeEnemy,i; Random random = new java.util.Random(); // Creamos un enemigo cada 20 ciclos if (cicle%20 == 0) { freeEnemy=0; // Buscar un enemigo libre for (i=1 ; i<=6 ; i++) { if (!enemies[i].isActive()) { freeEnemy=i; } } // Asignar enemigo si hay una posici�n libre // en el array de enemigos if (freeEnemy != 0) { enemies[freeEnemy].on(); enemies[freeEnemy].setX((Math.abs(random.nextInt()) % getWidth()) + 1); enemies[freeEnemy].setY(0); enemies[freeEnemy].setState(1); enemies[freeEnemy].setType((Math.abs(random.nextInt()) % 2) + 1); enemies[freeEnemy].init(hero.getX()); } } // Mover los enemigos for (i=1 ; i<=6 ; i++) { if (enemies[i].isActive()) { enemies[i].doMovement(); } // Mirar si la nave sali� de la pantalla if ((enemies[i].getY() > getHeight()) || (enemies[i].getY() < 0)) { enemies[i].off(); } } } void computeBullets() { int freeBullet,theEnemy,i,j; // Crear disparo del jugador freeBullet=0; if (fireOn) { // Buscar un disparo libre for (i=1 ; i<=6 ; i++) { if (!aBullet[i].isActive()) { freeBullet=i; } } if (freeBullet !=0) { aBullet[freeBullet].on(); aBullet[freeBullet].setX(hero.getX()); aBullet[freeBullet].setY(hero.getY()-10); aBullet[freeBullet].setOwner(1); } } // Crear disparo de enemigos freeBullet=0; theEnemy=0; for (i=1 ; i<=6 ; i++) { if (enemies[i].getType() == 1 && enemies[i].isActive() && enemies[i].getY() > getHeight()/2 && enemies[i].getY() < (getHeight()/2)+5) { // Buscar un disparo libre for (j=1 ; j<=6 ; j++) { if (!aBullet[j].isActive()) { freeBullet=j; theEnemy=i; } } if (freeBullet !=0) { aBullet[freeBullet].on(); aBullet[freeBullet].setX(enemies[theEnemy].getX()); aBullet[freeBullet].setY(enemies[theEnemy].getY()+10); aBullet[freeBullet].setOwner(2); } } } // Mover los disparos for (i=1 ; i<=6 ; i++) { if (aBullet[i].isActive()) { aBullet[i].doMovement(); } // Mirar si el disparo sali� de la pantalla if ((aBullet[i].getY() > getHeight()) || (aBullet[i].getY() <= 0)) { aBullet[i].off(); } } } void computeExplodes() { int i; for (i=1 ; i<=6 ; i++) { explode[i].doMovement(); } } void doScroll() { // movimiento del scenario (scroll) indice_in+=2; if (indice_in>=32) { indice_in=0; indice-=xTiles; } if (indice <= 0) { // si llegamos al final, empezamos de nuevo. indice=map.length-(xTiles*yTiles); indice_in=0; } } void createExplode(int posx, int posy) { int freeExplode,i; freeExplode=0; // Buscar una explosi�n libre for (i=1 ; i<=6 ; i++) { if (!explode[i].isActive()) { freeExplode=i; } } if (freeExplode !=0) { explode[freeExplode].setState(1); explode[freeExplode].on(); explode[freeExplode].setX(posx); explode[freeExplode].setY(posy); } } void checkCollide() { int i,j; boolean collision; collision=false; // Colisi�n heroe-enemigo for (i=1 ; i<=6 ; i++) { if (hero.collide(enemies[i]) && enemies[i].isActive() && shield == 0) { createExplode(hero.getX(),hero.getY()); createExplode(enemies[i].getX(),enemies[i].getY()); enemies[i].off(); collision=true; } } // Colisi�n heroe-disparo for (i=1 ; i<=6 ; i++) { if (aBullet[i].isActive() && hero.collide(aBullet[i]) && aBullet[i].getOwner() != 1 && shield == 0) { createExplode(hero.getX(),hero.getY()); aBullet[i].off(); collision=true; } } // colisi�n enemigo-disparo for (i=1 ; i<=6 ; i++) { if (aBullet[i].getOwner() == 1 && aBullet[i].isActive()) { for (j=1 ; j<=6 ; j++) { if (enemies[j].isActive()) { if (aBullet[i].collide(enemies[j])) { createExplode(enemies[j].getX(),enemies[j].getY()); enemies[j].off(); aBullet[i].off(); score+=10; } } } } } if (collision == true) { lives--; // poner heroe al estado inicial hero.setX(getWidth()/2); hero.setY(getHeight()-20); // Durante 20 ciclos nuestra nave ser� inmune shield=20; if (lives <= 0) { playing=false; } } if (shield > 0) shield--; } void computePlayer() { // actualizar posici�n del avi�n if (hero.getX()+deltaX>0 && hero.getX()+deltaX<getWidth() && hero.getY()+deltaY>0 && hero.getY()+deltaY<getHeight()) { hero.setX(hero.getX()+deltaX); hero.setY(hero.getY()+deltaY); } } void quitGame() { playing = false; } boolean isPlaying() { return playing; } public void run() { start(); while (playing) { // Actualizar fondo de pantalla doScroll(); // Actualizar posici�n del jugador computePlayer(); // Actualizar posici�n de los enemigos computeEnemies(); // Actualizar balas computeBullets(); // Actualizar explosiones computeExplodes(); // Comprobar colisiones checkCollide(); // Contador de ciclos cicle++; // Actualizar pantalla repaint(); serviceRepaints(); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { System.out.println(e.toString()); } } // Repintamos la pantalla // para mostrar pantalla de presentaci�n repaint(); serviceRepaints(); } public void keyReleased(int keyCode) { int action=getGameAction(keyCode); switch (action) { case FIRE: fireOn=false; break; case LEFT: deltaX=0; break; case RIGHT: deltaX=0; break; case UP: deltaY=0; break; case DOWN: deltaY=0; break; } } public void keyPressed(int keyCode) { int action=getGameAction(keyCode); switch (action) { case FIRE: fireOn=true; break; case LEFT: deltaX=-5; break; case RIGHT: deltaX=5; break; case UP: deltaY=-5; break; case DOWN: deltaY=5; break; } } public void paint(Graphics g) { int x=0,y=0,t=0; int i,j; g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(200,200,0); g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_MEDIUM)); if (playing == false) { intro.setX(getWidth()/2); intro.setY(getHeight()/2); intro.draw(g); } else { // Dibujar fondo for (i=0 ; i<yTiles ; i++) { for (j=0 ; j<xTiles ; j++) { t=map[indice+(i*xTiles+j)]; // calculo de la posici�n del tile x=j*32; y=(i-1)*32+indice_in; // dibujamos el tile tile[t].setX(x); tile[t].setY(y); tile[t].draw(g); } } // Dibujar enemigos for (i=1 ; i<=6 ; i++) { if (enemies[i].isActive()) { enemies[i].setX(enemies[i].getX()); enemies[i].setY(enemies[i].getY()); enemies[i].draw(g); } } // Dibujar el jugador if (shield == 0 || shield%2 == 0) { hero.setX(hero.getX()); hero.setY(hero.getY()); hero.draw(g); } // Dibujar disparos for (i=1 ; i<=6 ; i++) { if (aBullet[i].isActive()) { aBullet[i].setX(aBullet[i].getX()); aBullet[i].setY(aBullet[i].getY()); aBullet[i].draw(g); } } // Dibujar explosiones for (i=1 ; i<=6 ; i++) { if (explode[i].isActive()) explode[i].draw(g); } g.drawString(" "+score,getWidth()-20,20,Graphics.HCENTER|Graphics.BOTTOM); g.drawString(" "+lives,20,20,Graphics.HCENTER|Graphics.BOTTOM); } } }
�Sprite.java
package mygame; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.*; import java.io.*; class Sprite { private int posx,posy; private boolean active; private int frame,nframes; private Image[] sprites; // constructor. 'nframes' es el n�mero de frames del Sprite. public Sprite(int nframes) { // El Sprite no est� activo por defecto. active=false; frame=1; this.nframes=nframes; sprites=new Image[nframes+1]; } public void setX(int x) { posx=x; } public void setY(int y) { posy=y; } int getX() { return posx; } int getY() { return posy; } int getW() { return sprites[nframes].getWidth(); } int getH() { return sprites[nframes].getHeight(); } public void on() { active=true; } public void off() { active=false; } public boolean isActive() { return active; } public void selFrame(int frameno) { frame=frameno; } public int frames() { return nframes; } // Carga un archivo tipo .PNG y lo a�ade al sprite en // el frame indicado por 'frameno' public void addFrame(int frameno, String path) { try { sprites[frameno]=Image.createImage(path); } catch (IOException e) { System.err.println("Can`t load the image " + path + ": " + e.toString()); } } boolean collide(Sprite sp) { int w1,h1,w2,h2,x1,y1,x2,y2; w1=getW(); // ancho del sprite1 h1=getH(); // altura del sprite1 w2=sp.getW(); // ancho del sprite2 h2=sp.getH(); // alto del sprite2 x1=getX(); // pos. X del sprite1 y1=getY(); // pos. Y del sprite1 x2=sp.getX(); // pos. X del sprite2 y2=sp.getY(); // pos. Y del sprite2 if (((x1+w1)>x2)&&((y1+h1)>y2)&&((x2+w2)>x1)&&((y2+h2)>y1)) { return true; } else { return false; } } // Dibujamos el Sprite public void draw(Graphics g) { g.drawImage(sprites[frame],posx,posy,Graphics.HCENTER|Graphics.VCENTER); } }
�Enemy.java
package mygame; import java.util.*; class Enemy extends Sprite { private int type,state,deltaX,deltaY; public void setState(int state) { this.state=state; } public int getState(int state) { return state; } public void setType(int type) { this.type=type; } public int getType() { return type; } public void doMovement() { Random random = new java.util.Random(); // Los enemigos de tipo 2 cambiaran su trayectoria // al alcanzar una posici�n determinada (pos. 50) if (type == 2 && getY() > 50 && state != 2) { // paso al estado 2 (movimiento diagonal) state = 2; if ((Math.abs(random.nextInt()) % 2) + 1 == 1) { deltaX=2; } else { deltaX=-2; } } // movemos la nave setX(getX()+deltaX); setY(getY()+deltaY); } public void init(int xhero) { deltaY=3; deltaX=0; if (type == 1) { if (xhero > getX()) { deltaX=2; } else { deltaX=-2; } } } // Sobrecarga del m�todo draw de la clase Sprite public void draw (javax.microedition.lcdui.Graphics g) { selFrame(type); // llamamos al m�todo 'draw' de la clase padre (Sprite) super.draw(g); } public Enemy(int nFrames) { super(nFrames); } }
�Bullet.java
package mygame; class Bullet extends Sprite { private int owner; public Bullet(int nFrames) { super(nFrames); } public void setOwner(int owner) { this.owner=owner; } public int getOwner() { return owner; } public void doMovement() { // si owner = 1 el disparo es nuestro // si no, es del enemigo if (owner == 1) { setY(getY()-6); } else { setY(getY()+6); } } // Sobrecarga del m�todo draw de la clase Sprite public void draw (javax.microedition.lcdui.Graphics g) { selFrame(owner); // llamamos al m�todo 'draw' de la clase padre (Sprite) super.draw(g); } }
�Explode.java
package mygame; class Explode extends Sprite { private int state; public Explode(int nFrames) { super(nFrames); state=1; } public void setState(int state) { this.state=state; } public int getState() { return state; } public void doMovement() { state++; if (state > super.frames()) super.off(); } // Sobrecarga del m�todo draw de la clase Sprite public void draw (javax.microedition.lcdui.Graphics g) { selFrame(state); // llamamos al m�todo 'draw' de la clase padre (Sprite) super.draw(g); } }
�Hero.java
package mygame; class Hero extends Sprite { private int state; public void setState(int state) { this.state=state; } public int getState(int state) { return state; } public Hero(int nFrames) { super(nFrames); } }