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 36 suscriptores

Deja una respuesta

Anuncios


Consola en pantalla 

Algo que siempre he querido tener es la consola visual en pantalla. Lo encuentro útil porque puedo ver el evento directo sin tener que desviar la mirada hacia la consola.

Continua Leyendo…
Anuncios