Bonus.java

/*
 * Copyright © 2012 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */
package com.nokia.example.battletank.game.entities;

import com.nokia.example.battletank.game.Resources;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.lcdui.game.Sprite;

public class Bonus
    extends Entity {

    public static final int AMMO = 0;
    public static final int CLOCK = 1;
    public static final int SHOVEL = 2;
    public static final int LIFE = 3;
    public static final int GRENADE = 4;
    public static final int STAR = 5;
    private volatile int type = AMMO;
    private volatile boolean updateSpriteType = true;
    private volatile boolean visible = false;
    private volatile boolean updateSpriteVisibility = true;
    private final Listener listener;

    public Bonus(Resources r, Listener listener) {
        super(r.gridSizeInPixels * 4, r.gridSizeInPixels * 4, r);
        this.listener = listener;
    }

    protected Sprite createSprite() {
        return new Sprite(resources.ammo, width, height);
    }

    public void refresh() {
        if (updateSpriteType) {
            updateSpriteType = false;
            switch (type) {
                case AMMO:
                    sprite.setImage(resources.ammo, width, height);
                    break;
                case CLOCK:
                    sprite.setImage(resources.clock, width, height);
                    break;
                case SHOVEL:
                    sprite.setImage(resources.shovel, width, height);
                    break;
                case LIFE:
                    sprite.setImage(resources.life, width, height);
                    break;
                case GRENADE:
                    sprite.setImage(resources.grenade, width, height);
                    break;
                case STAR:
                    sprite.setImage(resources.star, width, height);
                    break;
            }
        }
        if (updateSpriteVisibility) {
            updateSpriteVisibility = false;
            sprite.setVisible(visible);
        }
        super.refresh();
    }

    public void update() {
        if (!visible) {
            return;
        }
        if (listener.collidesWithPlayer(this)) {
            visible = false;
            updateSpriteVisibility = true;
        }
    }

    public int getType() {
        return type;
    }

    public void spawn(int type, int x, int y) {
        this.type = type;
        updateSpriteType = true;
        visible = true;
        updateSpriteVisibility = true;
        setPosition(x, y);
    }

    public interface Listener {

        boolean collidesWithPlayer(Bonus bonus);
    }

    public void writeTo(DataOutputStream dout)
        throws IOException {
        super.writeTo(dout);
        dout.writeInt(type);
        dout.writeBoolean(visible);
    }

    public void readFrom(DataInputStream din)
        throws IOException {
        super.readFrom(din);
        type = din.readInt();
        visible = din.readBoolean();
    }
}