git @ Cat's Eye Technologies yoob / master src / OverlayPlayfield.java
master

Tree @master (Download .tar.gz)

OverlayPlayfield.java @masterraw · history · blame

/*
 * An OverlayPlayfield is a "view" into another Playfield at
 * a given x,y offset.  In some respects it is similar to a Cursor.
 *
 * Unlike a regular Playfield, the extent of an OverlayPlayfield
 * is fixed.  Attempts to access outside the bounds will return
 * the default element always.
 *
 * The source code in this file has been placed into the public domain.
 */
package tc.catseye.yoob;

public class OverlayPlayfield<E extends Element> implements Playfield<E> {
    private Playfield<E> p;
    private IntegerElement offsetX = IntegerElement.ZERO;
    private IntegerElement offsetY = IntegerElement.ZERO;
    private IntegerElement width = IntegerElement.ZERO;
    private IntegerElement height = IntegerElement.ZERO;

    public OverlayPlayfield(Playfield<E> p) {
        this.p = p;
    }

    public OverlayPlayfield(Playfield<E> p, IntegerElement x, IntegerElement y, IntegerElement width, IntegerElement height) {
        this.p = p;
        this.offsetX = x;
        this.offsetY = y;
        this.width = width;
        this.height = height;
    }

    public void setPlayfield(Playfield<E> p) {
        this.p = p;
    }

    public void setOffsetX(IntegerElement x) {
        this.offsetX = x;
    }

    public void setOffsetY(IntegerElement y) {
        this.offsetY = y;
    }

    public void setWidth(IntegerElement width) {
        this.width = width;
    }

    public void setHeight(IntegerElement height) {
        this.height = height;
    }

    public Playfield<E> getPlayfield() {
        return p;
    }

    public IntegerElement getOffsetX() {
        return offsetX;
    }

    public IntegerElement getOffsetY() {
        return offsetY;
    }

    public IntegerElement getWidth() {
        return width;
    }

    public IntegerElement getHeight() {
        return height;
    }

    public void set(IntegerElement x, IntegerElement y, E e) {
        if (x.compareTo(IntegerElement.ZERO) < 0 ||
            x.compareTo(width) >= 0 ||
            y.compareTo(IntegerElement.ZERO) < 0 ||
            y.compareTo(height) >= 0) {
            return;
        }
        p.set(x.add(offsetX), y.add(offsetY), e);
    }

    public E get(IntegerElement x, IntegerElement y) {
        if (x.compareTo(IntegerElement.ZERO) < 0 ||
            x.compareTo(width) >= 0 ||
            y.compareTo(IntegerElement.ZERO) < 0 ||
            y.compareTo(height) >= 0) {
            return p.getDefault();
        }
        return p.get(x.add(offsetX), y.add(offsetY));
    }

    public E getDefault() {
        return p.getDefault();
    }

    /*
     * Note that clone() only clones the OverlayPlayfield,
     * *not* the underlying Playfield into which it views.
     */
    public OverlayPlayfield<E> clone() {
        OverlayPlayfield<E> c = new OverlayPlayfield<E>(
            p, offsetX, offsetY, width, height
        );
        return c;
    }

    public IntegerElement getMinX() {
        return IntegerElement.ZERO;
    }

    public IntegerElement getMinY() {
        return IntegerElement.ZERO;
    }

    public IntegerElement getMaxX() {
        return width.subtract(IntegerElement.ONE);
    }

    public IntegerElement getMaxY() {
        return height.subtract(IntegerElement.ONE);
    }

    public int numCursors() {
        return 0;
    }

    public Cursor getCursor(int index) {
        return null;
    }
}