spaceship.java
* 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; } }