だから私は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();
}
}
}
だから私の質問は:私のメソッドが一度呼び出されるように、どうすればこの問題を解決できますか?
私はすべての助けに感謝します!ありがとう