3.283 cursos gratis
6.261.122 alumnos
Publica tu curso gratis
Busca cursos gratis:
Estás aquí: mailxmail > Cursos de Informática > Programación > Programación de juegos para móviles con J2ME > Disparos y explosiones

Programación de juegos para móviles con J2ME

Autor: Alberto García Serrano
Curso:  4,52/5 4,52/5 (83 opiniones) |12480 alumnos|Fecha publicación: 07/09/2004

Capítulo 22:

 Disparos y explosiones

Ahora que conocemos una técnica para que nuestros aviones enemigos sean capaces de comportarse tal y como queremos que lo hagan, estamos muy cerca de poder completar nuestro juego. Lo siguiente que vamos a hacer es añadir la capacidad de disparar a nuestro avión. La gestión de los disparos y las explosiones va a ser muy similar a la de los aviones enemigos. Vamos a crear una clase a la que llamaremos Bullet, descendiente de la clase Sprite y que representará un disparo.


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);
    }
}

Añadimos un atributo llamado owner que indica a quien pertenece el disparo (a un enemigo o a nuestro avión). Para gestionar este atributo disponemos de los métodos getOwner() y setOwner().

Este atributo lo vamos a utilizar para decidir si movemos el disparo hacia arriba o hacia abajo y para comprobar las colisiones.

En cuanto a las explosiones, vamos a crear una clase llamada Explode, también descendiente de Sprite.


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);
    }
}

El único atributo que añadimos es state, que nos indicará el estado de la explosión. En la práctica, el estado de la explosión va a ser el frame actual de su animación interna, de hecho, su clase doMovement() lo único que hace es aumentar el frame para realizar la animación.

La inicialización y gestión de explosiones y disparos es idéntica a la de los aviones enemigos, por lo que no vamos a entrar en mucho más detalle.

Nos resta comprobar las colisiones entre los sprites del juego. Vamos a realizar tres comprobaciones.

Colisión héroe - enemigo
Colisión héroe - disparo
Colisión enemigo - disparo
Ten en cuenta que hay 6 posibles enemigos y 6 posibles disparos a la vez en pantalla, por lo que hay que realizar todas las combinaciones posibles.


// 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;
                }
            }
        }
    }
}

El resultado de nuestro juego puede verse en la siguiente figura. El listado fuente completo del juego puede consultarse en el apéndice A.

Disparos y explosiones

Capítulo siguiente - Sonidos
Capítulo anterior - Enemigos
Recibe nuestras novedades
Al presionar "Recibir" estás dándote de alta y aceptas las condiciones legales de mailxmail

Hay 83 opiniones. Opina sobre este curso.


Cursos similares a Programación de juegos para móviles con J2ME


Cursos Valoración Alumnos Vídeo
Funciones en C (primera parte)
Curso de programacíon informática sobre Funciones en C en el orden de los fundamentos de la programación. Comprende el desarrollo de un software utilizando funciones y a ... [17/10/08]
 4,50/5 2.816  
Procesos en C. Sincronización (primera parte)
Curso de informática sobre sincronización de procesos en C y señales en linux que te ofrece la posibilidad de comprender los mecanismos de comunicación entre procesos inf... [21/10/08]
5/5 993  
Java
Java nació con el deseo por parte de Sun de buscar un lenguaje de programación enfocado a electrodomésticos. Se necesitaba alg&uacu... [23/04/04]
 4,45/5 49.291  


Publicar en   del.icio.us    digg    meneame

¿Qué es mailxmail.com?|ISSN: 1699-4914|Recomiéndanos|Ayuda
Condiciones legales de mailxmail