Single Tech Games

juego en java 2D – 6to dia

Actualizando el 03/05/2012… Agregue el código fuente que ya desapareció de la web aquí
Capitulo 18
Este capitulo no hace mas que agregar mas funciones controladas por el usuario, no agrega casi nada nuevo a no ser porque ahora la clase Actor maneja un poco la funcionalidad de Bullet, igual de lo mas rescatable es el remove.

public void addActor(Actor a);// nueva funcion para agregar un actor
protected boolean markedForRemoval;//booleano que cambia a true si se tiene que borrar
public void addActor(Actor a) {
    actors.add(a);//funciona igual que en la funcion initworld
}
for (int i = 0; i < actors.size(); i++) {
    Actor m = (Actor)actors.get(i);
    if (m.isMarkedForRemoval()) {
        actors.remove(i);// borra de la lista de actores
    } else {
        m.act();
    }
}
public void fire() {
    Bullet b = new Bullet(stage);//nueva instancia de bullet
    b.setX(x);// recoge X de actor (posicion horizontal)
    b.setY(y - b.getHeight());//Lo hace aparecer en la punta de la nave
    stage.addActor(b);//agrega el actor
}

La clase bullet no aporta nada interesante
Capitulo 19
Arrancamos con bomb.java

switch (heading) {//como el misil pero mas complicado
    case UP_LEFT : vx = -BOMB_SPEED; vy = -BOMB_SPEED; sprite="bombUL.gif";break;
    case UP : vx = 0; vy = -BOMB_SPEED; sprite="bombU.gif";break;
    case UP_RIGHT: vx = BOMB_SPEED; vy = -BOMB_SPEED; sprite="bombUR.gif";break;
    case LEFT : vx = -BOMB_SPEED; vy = 0; sprite = "bombL.gif";break;
    case RIGHT : vx = BOMB_SPEED; vy = 0; sprite = "bombR.gif";break;
    case DOWN_LEFT : vx = -BOMB_SPEED; vy = BOMB_SPEED; sprite="bombDL.gif";break;
    case DOWN : vx = 0; vy = BOMB_SPEED; sprite = "bombD.gif";break;
    case DOWN_RIGHT : vx = BOMB_SPEED; vy = BOMB_SPEED; sprite = "bombDR.gif";break;
}

Player.java

private int clusterBombs; //nro de bombas
clusterBombs = 5; // no deberia estar aqui
clusterBombs--;//quita una bomba
stage.addActor( new Bomb(stage, Bomb.UP_LEFT, x,y));// le dice a invaders que agregue un actor mas al array

Quiero detenerme acá un momento para tratar de entender algunas cosas que me han quedado un poco difusas. Primero como funciona la posición, ejemplo:

En la imagen que les acabo de poner mas o menos retrata donde esta la bomba UL, con respecto a la nave, para llegar a esa posición el constructor de bomb recibe 4 valores
Stage stage, int heading, int x, int y
los importantes son X y Y porque son mandados por la clase Player, pero ni siquera viene de ellos, sino que los hereda de la clase Actor, bueno según la figura, la nave esta en la posición 290,180 bueno pues, bomb recibe estas variables y hace lo siguiente:
case UP_LEFT : vx = -BOMB_SPEED; vy = -BOMB_SPEED; sprite=”bombUL.gif”;break;
ahora vx=-5 y vy=-5, hasta ahora no pasa nada, porque las variables a cambiar son X y Y pero hay encontramos a la función act(), lo que pasa es que cada que creamos un nuevo objeto Bomb, updateworld() de invaders.java ejecuta la función de act() y en act existe una suma de X – vx , igual para Y, ahora tenemos la nueva posición de la bomba, seguimos agregando bombas y al terminar invaders pasa a utilizar la función de pintado paintWorld(), pero como sigue siendo visible las funciones se vuelven a ejecutar y así la bomba sera puesta en una nueva posición y otra vez pintada, acaba todo cuando act recibe variables que salen fuera del tamaño de la pantalla (en el caso de la bomba)
Capitulo 20
Este capitulo ya tiene que ver con la matanza, por ahora solo la muerte de nuestros enemigos
Actor.java

public Rectangle getBounds() {
    return new Rectangle(x,y,width,height);//crea un nuevo rectangulo con el lugar y las dimensiones del actor(por fin las usamos)
}

Monster.java

public void collision(Actor a) {
    if (a instanceof Bullet || a instanceof Bomb)//su muerte, si a es un objeto de tipo bullet o bomb
        remove();
}

invader.java

public void checkCollisions() {
    Rectangle playerBounds = player.getBounds();//recibimos el rectangulo hecho con la info de player (su herencia)
    // se podria haber implementado un mejor algoritmo de busqueda y comparacion
    for (int i = 0; i < actors.size(); i++) {
        Actor a1 = (Actor)actors.get(i);
        Rectangle r1 = a1.getBounds();
        if (r1.intersects(playerBounds)) {//si el player choca con otro actor
            player.collision(a1);//no hace nada...
            a1.collision(player);//y el actor... tampoco xD
        }
        for (int j = i+1; j < actors.size(); j++) {//ahora a preguntar entre actores
            Actor a2 = (Actor)actors.get(j);
            Rectangle r2 = a2.getBounds();
            if (r1.intersects(r2)) {// si el actor de arriba se intersecta con otro actor
                a1.collision(a2);//reacciona el actor de arriba
                a2.collision(a1);//reaccionan el otro actor
            }
        }
    }
}

Bueno hasta ahí lo mas interesante, falta poco para terminar el cursillo ^_^
Buena Suerte!

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments