Continuando con el concepto de imitar clásicos como «Galaga» y «Space Invaders», codifiqué un muelle espacial que permite el movimiento de enemigos en formación de arco concéntrico.
Empiezo creando un arreglo de dos dimensiones limitado a 81 espacios. La clase Berth() representa una coordenada polar y una variable booleana que indica si ese espacio está ocupado.
public final int rows = 9;
public final int cols = 9;
public final Berth[][] berth = new Berth[rows][cols];
Ahora solo tengo que mantener y actualizar una sola coordenada polar representada por un ángulo y un radio en la que todas las demás se derivan.
private float angle = MathUtils.random(MathUtils.PI2);
private float radius = 600;
Inicio el ángulo al azar usando la función de MathUtils.random() de LibGDX y 600 es el radio mínimo. Dentro del método act(float delta) actualizo esas dos variables que representan la coordenada polar principal.
angle += speed * delta;
angle %= MathUtils.PI2;
if (angle < 0) angle += MathUtils.PI2;
- Añade al ángulo para moverlo.
- Normaliza dentro del rango PI2.
- Asegura que no entre en ángulos negativos.
Esto es altamente eficiente y es la forma estándar e idiomática de manejar la rotación continua y normalizada en bucles de juegos en tiempo real.
Basando en ese ángulo y radio, calculo las 81 coordenadas.
float angleFlux = angle;
float radiusFlux = radius;
float angleSpaceFlux = spacing / radius;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
Berth thisBerth = berth[r][c];
thisBerth.angle = angleFlux;
thisBerth.radius = radiusFlux;
radiusFlux += spacing;
}
radiusFlux = radius;
angleFlux += angleSpaceFlux;
}
Las variables con el sufijo «Flux» (angleFlux, radiusFlux, angleSpaceFlux) son variables de iterador utilizadas para calcular la posición de cada objeto.
Con este código, calculo y asigno coordenadas angulares y radiales a una cuadrícula en un patrón de arco concéntrico.
Y asi se ve:


Deja una respuesta