4

だから私はRPG Javaゲームを書いていて、カスタムイベントを使って2つのクラス間のコミュニケーションをより簡単にすることに決めました. 最初に、敵が死亡したかどうかをプレイヤーに知らせる「enemyDeathEvent」を書きました。

まず、EnemyListener を作成しました。

public interface EnemyListener {

    public void playerDeathEvent(EnemyEvent e);
}

その後、私は EnemyEvent クラスを作成しました:

public class EnemyEvent {

    private Enemy enemy;

    public EnemyEvent(Enemy enemy) {
        this.enemy = enemy;
    }

    public Enemy getSource() {
        return enemy;
    }
}

次に、敵クラスをセットアップします。

public class Enemy {

    //......
    private boolean dead;

    private Set<EnemyListener> listeners;

    public Enemy() {
        listeners = new HashSet<EnemyListener>();
    }

    //checks if the enemy is dead
    public void update() {
        if(health <= 0) dead = true;

        if(dead) fireDeathEvent();
    }

    //fires the death event
    protecd synchronized void fireDeathEvent() {
        EnemyEvent e = new EnemyEvent(this);
        for(EnemyListener listener : listeners) {
            listeners.enemyDeathEvent(e);
        }
    }

    public void addEnemyListener(EnemyListener listener) {
        listeners.add(listener);
    }  
}

最後に、プレイヤーに EnemyListener を実装します。

public class Player implements EnemyListener {

    @Override
    public void enemyDeathEvent(EnemyEvent e) {
        System.out.println(e.getSource().getName() + " died!");
    }
}

したがって、敵が死ぬと、私のプレーヤー クラスのenemyDeathEvent()メソッドが呼び出されます。すべて正常に動作しますが、実際の問題は、ゲームがこのメソッドを複数回呼び出すことです。その理由は、私のupdate()メソッドが、ゲームの物理などを毎秒 30 回更新するスレッドに接続されているためです。

@Override
public void run() {
    while(gameRunning) {
        update();
        render();
        try {
            Thread.sleep(1000/30);  //30FPS
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }
}

だから私の質問は:私のメソッドが一度呼び出されるように、どうすればこの問題を解決できますか?

私はすべての助けに感謝します!ありがとう

4

3 に答える 3

0

インスタンスが停止したら、インスタンスの更新を停止する必要がありますEnemy

何かのようなもの:

void update() {
    if (dead) return;
    ...
}

より汎用的なソリューションとして、すべてのゲーム インスタンスは基本クラス (例: EntityBase) から継承する必要があります。基本クラスには、名前付きフィールドisEnabledと基本的な更新メソッドを含めることができます。

void update() {
    if (!isEnabled) return;
    updateImpl();
}
abstract void updateImpl();

クラスを継承するすべてのクラスは、メソッドEntityBaseを実装する必要があります。updateImpl()インスタンスの更新を停止するには、isEnabledフラグをに設定するだけですfalse

void updateImpl() {
    if(health <= 0) {
        dead = true;
        isEnabled = false;
    }
    if(dead) fireDeathEvent();
}
于 2015-06-08T10:48:53.230 に答える