0

私はタワー ディフェンス ゲームを書いています。メイン コンポーネントは 40x40 フィールド (クラス フィールドのオブジェクト) に分割されたグリッドです。ゲームが開始すると、最も近い基地への最も近い方法がスポーンごとに検出され (特殊な種類のフィールド)、そのフィールドint[] pathに保存されます。これは、モンスターが基地に到達するためにたどらなければならない一連の方向を表します。

distanceすべてのモンスターを 1px 前方に移動し、各パスでそのフィールドを増加させるループを持つスレッドを作成しました。モンスターが移動するたびに、フィールドの中央を踏んでいないかどうかもチェックします。私はそれを使用してそれを行います:

if ((monster.getDistance() % FIELD_SIZE /*which is 40*/) == 0)

そして、それが 0 を返すと、モンスターはその方向を変更します (スポーン フィールド パスから到達する次のフィールドの位置を読み取ります)。

これは、すべての敵がパスごとに 1 ピクセル移動する場合に機能します。でも違う速さで動かしてほしい。私は2つの解決策を見つけました:

  1. すべての敵を別のスレッドに移動します。速度が速いほど、Thread.sleep() の期間は短くなります。
  2. 異なる距離でループして移動します。

私は 2. ソリューションを好みますが、実装方法がわかりません。私の問題は、ほとんどのモンスターがフィールドの中央に足を踏み入れることがないため、方向を変えないことです。モンスターが 0.33 の速度で移動する場合、移動距離は 0.33、0.66、0.99 (...) 39.63 (...) 40.13 になります。したがって、40に達することはありません。ceil、round、またはfloorを使用すると、40に達しますが、アプリで例外が発生する原因が複数回あります。だから私の質問は、フロート値を距離として移動を実装し、毎回40の倍数に達するようにする方法ですが、チェックごとに1回だけですか?

4

2 に答える 2

1

ピタゴラスの定理を使用して衝突検出を行うことができます

Math.sqrt(Math.pow((monster.getX() - field.getX()), 2)
 + Math.pow((monster.getY() - field.getY()), 2)) <= field.getRadius()
于 2013-01-29T13:52:51.790 に答える
0

新しいスレッドにモンスターをフィードし、実行メソッドで必要なことを行うことができます。

public class MoveThread extends Thread{
private Monster myMonster;
public MoveThread(Monster m){
myMonster = m;
}

public void run(){
//do your stuff here
}

}
于 2013-01-29T13:45:45.837 に答える