spaceship.java

per admin darrera modificació 2020-03-25T16:34:36+02:00
/* Gasteroids v0.1 aplicación didáctica para dispositivos MIDP2.0 Copyright (C) 2006 Victor Carceler This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package gpl.gasteroids; import java.util.Vector; import javax.microedition.lcdui.Graphics; /** * Modela una nave y todos sus proyectiles.

* Las propiedades publicas de una nave son: *

    *
  • La posición (x,y) en la que se encuentra *
  • El área rectangular (x_min, y_min) y (x_max, y_max) en la que se puede mover *
  • La orientación (arg) en radianes *
  • La velocidad (speed_x, speed_y) *
  • La fuerza a la que está sometida (force_x, force_y) *
  • La masa de la nave (m) *
  • La capacidad de los impulsores (thrust) *
  • El tiempo parcial durante el que ha mantenido los impulsores encendidos (engine_time) *
  • La longitud (L) de la nave *
* *

Una nave es responsable de los proyectiles que lanza. Estos proyectiles se guardan * en una instancia de {@link Vector}. Cuando la nave dispara, el proyectil sale con una * velocidad inicial resultante de la velocidad instantánea de la nave más la proporcionada * por el cañón. * * @author Victor Carceler */ public class SpaceShip { public double x, y; // Posición X, Y public int x_min, x_max, y_min, y_max; // Límites a la posición de la nave public double arg; // Orientación de la nave (radianes) public double speed_x=0.0d, speed_y=0.0d; // Velocidad actual public double force_x=0.0d, force_y=0.0d; // Fuerza public double m = 0.75d; // Masa de la nave public double thrust = 1.0d; // Capacidad de los impulsores public double engine_time=0.0d; // Tiempo con los impulsores encendidos public final int L = 15; // Longitud de la nave private Vector bullets; // Proyectiles disparados (y activos) private double bulletIS = 2.0d; // Velocidad inicial de los disparos (además de la que proporciona la nave) /** * Constructor, inicializa la nave */ public SpaceShip() { bullets = new Vector(); } /** * Actualiza la velocidad de la nave. *

Para ello tiene en cuenta: *

    *
  • El tiempo que los motores han estado en marcha *
  • El empuje de los motores *
  • La orientación de la nave *
  • La velocidad a la que estaba viajando la nave *
*

Cuando se actualiza la velocidad de la nave, se supone que la maniobra concluye. * Por lo tanto el contador parcial de tiempo con los motores encendidos se pone a 0. * @param t tiempo transcurrido en segundos */ public void updateSpeed(double t) { // Actualizamos la fuerza según el tiempo que han estado activos los impulsores force_x = engine_time*thrust*Math.cos(arg); force_y = engine_time*thrust*Math.sin(arg); engine_time = 0.0d; // Actualizamos la velocidad speed_x += t*force_x/m; speed_y += t*force_y/m; } /** * Actualiza la posición de la nave suponiendo que han transcurrido t segundos.

* Para ello: *

    *
  • Se calcula la nueva posición que ha de ocupar la nave *
  • Si la nave choca con un límite no lo rebasa y la componente de velocidad que la impele a rebasarlo se pone a 0 *
  • Se calcula la nueva posición que ha de ocupar cada uno de los proyectiles de la nave *
  • Se decrementa en 1 el ttl de cada proyectil *
  • Se descartan los proyectiles con ttl no superior a 0 *
*

Si se pretende que la nave rebote, o bien salga por un borde para entrar por otro (espacio continuo * como el Asteroids original) este es el método en el que picar código. * * @param t tiempo transcurrido en segundos */ public void updatePosition(double t) { // Actualizamos posición de la nave x += speed_x * t; y += speed_y * t; if(x<=x_min) {x=x_min; speed_x = 0;} if(x>=x_max) {x=x_max; speed_x = 0;} if(y<=y_min) {y=y_min; speed_y = 0;} if(y>=y_max) {y=y_max; speed_y = 0;} // Actualizamos posición de los proyectiles for(int i=bullets.size()-1; i>=0; i--) { Bullet b = (Bullet)bullets.elementAt(i); b.x += b.speed_x * t; b.y += b.speed_y * t; b.ttl--; if(b.ttl <= 0) bullets.removeElementAt(i); } } /** * Dibuja la nave y cada uno de los proyectiles. * * @param g Objeto {@link Graphics} en el que dibujar */ public void paint(Graphics g) { // Dibujamos la nave g.setColor(0,0,0); g.drawArc((int)(x-L/2), (int)(y-L/2), L, L, 0, 360); g.drawLine((int)x, (int)y, (int)(x+L/2*Math.cos(arg)), (int)(y+L/2*Math.sin(arg))); // Dibujamos los proyectiles que ha lanzado for(int i=0; i Pos(" + x + "," + y + ") Speed(" + speed_x + "," + speed_y + ") Force(" + force_x + "," + force_y + ")"; } /** * Pide a la nave que abra fuego. *

Cada vez que se invoca a este método, la nave lanza un nuevo proyectil. *

El proyectil tiene una posición determinada por la posición en la que la nave disparó. *

La velocidad del proyectil está determinada por la velocidad instantánea de la nave en el * momento del disparo más la velocidad proporcionada por su cañon. Se tiene en cuenta la * orientación de la nave en el momento del disparo. * */ public void fire() { Bullet b = new Bullet(); b.x = x; b.y = y; b.speed_x = bulletIS*Math.cos(arg)+speed_x; b.speed_y = bulletIS*Math.sin(arg)+speed_y; b.ttl = 80; // TTL por defecto para el proyectil bullets.addElement(b); } /** * Retorna un {@link Vector} con los proyectiles controlados por la nave * @return Vector con los proyectiles controlados por la nave */ public Vector getBullets() { return bullets; } }