La clase Player.java solo maneja diferentes tipos de naves y cada nave debe manejar los drones a su manera. El objeto Drone.java se inicia en la clase Player.java.
public final static int TOTAL_DRONES = 2;
private final Array<Drone> drones = new Array<>(false, TOTAL_DRONES);
También se encarga de dibujar los drones junto con la nave que este activa pero actualizar o manejar cada drone le toca a cada nave individual.
@Override
public void draw(Batch batch, float parentAlpha) {
activeShip.draw(batch);
for (Drone drone : drones) drone.draw(batch);
}
Cada nave recibe los drones en su constructor y es responsable de manejarlos.
orbitingShip = new OrbitingShip(projectilePool, drones);
travelingShip = new TravelingShip(this, gameMap, drones);
OrbitingShip.java
private static final float DRONE_RADIUS = 30;
private static final float DRONE_ANGLE = .04f;
private void dronesAct(float delta) {
float currentDroneAngle = DRONE_ANGLE;
for (int i = 0; i < drones.size; i++) {
Drone drone = drones.get(i);
drone.r = r;
drone.destiny.set(
(radius - radiusFlux - DRONE_RADIUS) * MathUtils.cos(currentAngle + currentDroneAngle),
(radius - radiusFlux - DRONE_RADIUS) * MathUtils.sin(currentAngle + currentDroneAngle));
currentDroneAngle = -DRONE_ANGLE;
drone.act(delta);
}
}
Este código solo funciona por el límite de 2 drones. La variable currentDroneAngle empieza en 0.04f ángulos radianes para el primer drone y en la línea 105 lo cambia a negativo (-0.04f) para acomodarlos de manera paralela.
TravelingShip.java
float offset = -30;
for (int i = 0; i < drones.size; i++) {
float droneX = getCenterX() + tmpB.x * offset;
float droneY = getCenterY() + tmpB.y * offset;
Drone drone = drones.get(i);
drone.destiny.set(droneX, droneY);
drone.r = r;
drone.act(delta);
}
Esta nave acomoda cada drone en columna adelante mientras navega. El movimiento no es instantáneo y detecta cuando está llegando a su destino para regresar los drones a la posición lista para OrbitingShip.
Y así se ve:


Deja una respuesta