Comienzo con la enumeración «enum» de los posibles estados del objeto. Esto sigue aumentando dependiendo de la función necesaria.
public enum EnemyState {
BERTHING, // Comenzando.
BERTHING_ANGLE, // Moviéndose al ángulo.
BERTHING_RADIUS, // Moviéndose al radio.
BERTH, // Está anclado.
DROPPING, // Bajando a la siguiente posición.
ATTACKING,
FLEEING,
FLED
}
«Dropping» lo uso para mover el objeto cuando el espacio de abajo está disponible con este código:
if (berth.column != 0) {
Berth lowerBerth = spacedock.berth[berth.row][berth.column - 1];
if (!lowerBerth.reserved) {
lowerBerth.reserved = true;
berth.reserved = false;
berth = lowerBerth;
state = EnemyState.DROPPING;
}
}
130: Si no estoy en el ultimo espacio, busco el espacio de abajo en la linea 131.
132: Verifica si ese espacio de abajo esta ocupado. Si está libre, desocupo el actual y ocupo el nuevo en las lineas 133-134.
Esto hace que todos los objetos que ocupan esa columna bajen en el momento que un espacio mas bajo se hace disponible.
Desprende y ataca.
El estado de «Attacking» puede ocurrir de dos maneras. Un enemigo puede comenzar atacando («Berthing» -> «Attacking») o puede cambiar de anclado a atacar («Berth» -> «Attacking»).
Para comenzar el ataque solo llamo el método de attack() del objeto:
public void attack() {
if (berth != null) berth.reserved = false;
state = EnemyState.ATTACKING;
attackRadius = spacedock.attackRadius;
attackAngle = normalizeAngle(MathUtils.random(MathUtils.PI2));
}
205: Aseguro cancelar la reserva del espacio en la formación.
207: «AttackRadius» es más bajo o cercano al jugador que todos los espacios en la formación.
208: El ángulo de ataque se escoge al azar alrededor del planeta.
Y así se ve:


Deja una respuesta