Bullet.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 javax.microedition.lcdui.game.Sprite;

public class Bullet
    extends Entity {

    private volatile boolean visible = false;
    private volatile boolean updateSpriteVisibility = true;
    private Listener listener;
    private int range = 0;
    private int speed = 0;
    public Tank firedBy;

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

    protected Sprite createSprite() {
        return new Sprite(resources.bullet);
    }

    public void spawn(int centerX, int centerY, int direction, int range,
        int speed, Tank firedBy) {
        if (visible) {
            return;
        }
        setPosition(centerX - width / 2, centerY - height / 2);
        changeDirection(direction);
        setVisible(true);
        this.range = range;
        this.speed = speed;
        this.firedBy = firedBy;
        update();
    }

    public void update() {
        for (int i = 0; i < speed; i++) {
            updateOnce();
        }
    }

    private void updateOnce() {
        if (!visible) {
            return;
        }
        range--;
        if (listener.collide(this) || range < 0) {
            setVisible(false);
            return;
        }
        move(resources.gridSizeInPixels);
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
        updateSpriteVisibility = true;
    }

    public boolean isVisible() {
        return visible;
    }

    public void refresh() {
        super.refresh();
        if (updateSpriteVisibility) {
            updateSpriteVisibility = false;
            sprite.setVisible(visible);
        }
    }

    public static interface Listener {

        boolean collide(Bullet bullet);
    }
}