diff options
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/ch/asynk/tankontank/game/hud/ActionButtons.java | 199 | 
1 files changed, 199 insertions, 0 deletions
| diff --git a/core/src/ch/asynk/tankontank/game/hud/ActionButtons.java b/core/src/ch/asynk/tankontank/game/hud/ActionButtons.java new file mode 100644 index 0000000..00249f6 --- /dev/null +++ b/core/src/ch/asynk/tankontank/game/hud/ActionButtons.java @@ -0,0 +1,199 @@ +package ch.asynk.tankontank.game.hud; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; + +import ch.asynk.tankontank.game.Ctrl; +import ch.asynk.tankontank.game.State.StateType; + +public class ActionButtons extends Bg +{ +    private final Ctrl ctrl; + +    public enum Buttons { +        NONE(-1, 0), +        MOVE(0, 1), +        ROTATE( 1, 2), +        PROMOTE(2, 4), +        ATTACK(3, 8), +        DONE(4, 16), +        ABORT(5, 32), +        LAST(6, 0); + +        Buttons(int i, int b) +        { +            this.i = i; +            this.b = b; +        } + +        public int i; +        public int b; +    } + +    public float padding; +    private int idx; +    private Button buttons []; +    private StateType states []; +    private Position position; + +    public ActionButtons(Ctrl ctrl, TextureRegion region, TextureAtlas atlas, float padding) +    { +        super(region); +        this.ctrl = ctrl; +        this.padding = padding; +        this.visible = false; +        this.position = Position.TOP_RIGHT; +        this.idx = Buttons.NONE.i; + +        this.buttons = new Button[Buttons.LAST.i]; +        this.buttons[Buttons.MOVE.i] = new Button(atlas, "btn-move"); +        this.buttons[Buttons.ROTATE.i] = new Button(atlas, "btn-rotate"); +        this.buttons[Buttons.PROMOTE.i] = new Button(atlas, "btn-promote"); +        this.buttons[Buttons.ATTACK.i] = new Button(atlas, "btn-attack"); +        this.buttons[Buttons.DONE.i] = new Button(atlas, "btn-check"); +        this.buttons[Buttons.ABORT.i] = new Button(atlas, "btn-cancel"); + +        this.states = new StateType[Buttons.LAST.i]; +        this.states[Buttons.MOVE.i] = StateType.MOVE; +        this.states[Buttons.ROTATE.i] = StateType.ROTATE; +        this.states[Buttons.PROMOTE.i] = StateType.PROMOTE; +        this.states[Buttons.ATTACK.i] = StateType.ATTACK; +        this.states[Buttons.DONE.i] = StateType.DONE; +        this.states[Buttons.ABORT.i] = StateType.ABORT; +    } + +    @Override +    public void dispose() +    { +        super.dispose(); +        for (int i = 0; i < Buttons.LAST.i; i++) +            buttons[i].dispose(); +    } + +    public void setPositon(Position position) +    { +        this.position = position; +    } + +    public void setUp(Buttons b) +    { +        buttons[b.i].setUp(); +    } + +    public void setDown(Buttons b) +    { +        buttons[b.i].setDown(); +    } + +    public void setOn(Buttons b) +    { +        buttons[b.i].setOn(); +    } + +    public void hide() +    { +        for (int i = 0; i < Buttons.LAST.i; i++) +            buttons[i].hide(); +        this.visible = false; +    } + +    private float setButton(Button btn, float x, float y) +    { +        btn.visible = true; +        btn.setPosition(x, y); +        return (y + btn.getHeight() + padding); +    } + +    public void show(int bits) +    { +        int b = bits; +        int count = 0; +        while (b > 0) { +            if ((b & 0x01) == 1) +                count += 1; +            b /= 2; +        } + +        if (count == 0) { +            this.visible = false; +            return; +        } + +        rect.width = (buttons[0].getWidth() + (2 * padding)); +        rect.height = ((buttons[0].getHeight() * count) + ((count + 1) * padding)); +        rect.x =  position.getX(rect.width); +        rect.y =  position.getY(rect.height); + +        float x = (rect.x + padding); +        float y = (rect.y + padding); + +        b = 1; +        for (int i = 0; i < Buttons.LAST.i; i++) { +            if ((bits & b) == b) +                y = setButton(buttons[i], x, y); +            else +                buttons[i].hide(); +            b *= 2; +        } + +        this.visible = true; +    } + +    public boolean touchDown(float x, float y) +    { +        idx = Buttons.NONE.i; + +        if (!super.hit(x,y)) +            return false; + +        for (int i = 0; i < Buttons.LAST.i; i++) { +            if (buttons[i].hit(x, y)) { +                idx = i; +                break; +            } +        } + +        if (idx != Buttons.NONE.i) +            buttons[idx].setDown(); + +        return (idx != Buttons.NONE.i); +    } + +    public boolean touchUp(float x, float y) +    { +        if (idx == Buttons.NONE.i) +            return false; + +        boolean ret = false; + +        if (super.hit(x,y) && buttons[idx].hit(x, y)) { +            ctrl.setState(states[idx]); +            ret = true; +        } else +            buttons[idx].setUp(); + +        idx = Buttons.NONE.i; + +        return ret; +    } + +    @Override +    public void draw(Batch batch) +    { +        if (!visible) return; +        super.draw(batch); +        for (int i = 0; i < Buttons.LAST.i; i++) +            buttons[i].draw(batch); +    } + +    @Override +    public void drawDebug(ShapeRenderer shapes) +    { +        if (!visible) return; +        super.drawDebug(shapes); +        for (int i = 0; i < Buttons.LAST.i; i++) +            buttons[i].drawDebug(shapes); +    } +} | 
