LEDAnimation.java

package ch.ladestation.connectncharge.pui;

import ch.ladestation.connectncharge.model.game.gamelogic.Edge;
import com.github.mbelling.ws281x.Color;

public abstract class LEDAnimation {
    private Edge associatedEdge;
    private int progress;

    public LEDAnimation(Edge associatedEdge, boolean disappear) {
        this.associatedEdge = associatedEdge;
        if (disappear) {
            this.progress = endProgress(
                associatedEdge.getStartIndex(),
                associatedEdge.getEndIndex(),
                associatedEdge.getColor());
        }
    }

    public boolean tick(Color[] ledStates) {
        if (isReversing()) {
            return tickBackwards(ledStates, progress--, associatedEdge.getStartIndex(), associatedEdge.getEndIndex(),
                associatedEdge.getColor());
        } else {
            return tickForwards(ledStates, progress++, associatedEdge.getStartIndex(), associatedEdge.getEndIndex(),
                associatedEdge.getColor());
        }
    }

    abstract boolean tickForwards(Color[] ledStates, int progress, int from, int to, Color color);

    abstract boolean tickBackwards(Color[] ledStates, int progress, int from, int to, Color color);

    abstract int endProgress(int from, int to, Color color);

    public Edge getAssociatedEdge() {
        return associatedEdge;
    }

    public int getProgress() {
        return progress;
    }

    public boolean isReversing() {
        return !associatedEdge.isOn();
    }

}