Curva Bézier

Bézier definitivamente es la curva más atractiva disponible en programación porque su forma suave y fluida permite crear movimientos elegantes en la animación.

Como planeo utilizar curvas Bézier para el movimiento de enemigos, aprovecho y empiezo a codificarlo en el menú. Primero tengo que definir una clase para representar un punto Bézier “BezierPoint.java”.

private final Vector2 point;
private final Vector2 handle;

private BezierPoint linkPoint;

public BezierPoint() {

    point   = new Vector2();
    handle  = new Vector2();

    linkPoint = null;
}

Cada punto Bézier tiene un vector de coordenada en pantalla (point), otro vector que representa la manecilla que afecta la curva (handle) y una referencia a otro punto Bézier que sería el próximo segmento (linkPoint).

También añadí estos métodos básicos:

public Vector2 getPoint()
public Vector2 getHandle()
public void setPoint(float x, float y)
public void setHandle(float x, float y)
public void setLinkPoint(BezierPoint bezierPoint)

En vez de calcular posiciones cada ciclo, voy a almacenar los resultados de la curva en memoria para mejorar el rendimiento. Para eso, necesito una clase que guarde cada punto (TrailMarker.java).

public class TrailMarker implements Pool.Poolable{

    public float x;
    public float y;
    public float a;

    public TrailMarker() {
        reset();
    }

    public void set(float x, float y, float a) {
        this.x = x;
        this.y = y;
        this.a = a;
    }

    @Override
    public void reset() {
        this.x = 0;
        this.y = 0;
        this.a = 0;
    }
}

Y por último, codifico una clase para mi implementación de la curva Bézier (BezierPath.java) que incluye arreglos de “TrailMarker”, “BezierPoint” y una instancia de la curva Bézier de LibGDX.

private final Bezier<Vector2> bezier;

public final  Array<TrailMarker> trails;
private final Array<BezierPoint> bezierPoints;

public BezierPath() {
    bezier = new Bezier<>();
    trails = new Array<>();
    bezierPoints = new Array<>();
}

Los métodos de la clase incluyen:

public void addSegment(float x, float y)
private void generatePath()
public Array<BezierPoint> getPoints()

«AddSegments” es lo que uso para añadir puntos a la curva. “GeneratePath” es cuando genero la curva y guardo cada punto en el arreglo de “TrailMarkers”.

Ahora solo tengo que calcular los puntos en la pantalla donde quiero que comience, navegue y termine la curva para insertarlos en el método “addSegment” de la clase “BezierPath” y luego generarlo para tener un arreglo de puntos por donde mover las imágenes.

Y asi se ve:

Únete a otros 35 suscriptores

Deja una respuesta

Anuncios


Anuncios