タワーの防衛ゲームで動きを継続的に更新する効果的な方法は?


8

私たちは大学の1年生のプロジェクトとしてタワーディフェンスゲームを作っている4人の男です。ゲームは本当にシンプルになるでしょう!

  • 3つの異なる塔
  • 3つの異なるモンスター
  • 1つのマップ(時間があれば、さらに追加する可能性があります)

ゲームはオブジェクト指向でなければなりません。

クラス構造は以下の通りです

  • ゲーム -グラフィックの描画など
  • レベル -すべてのレベルはこのクラスのオブジェクトです。各レベルには、有限数のウェーブオブジェクト(リスト内)があります。
  • Wave-モンスターオブジェクトのリストが含まれています。
  • モンスター -これはスーパークラスです。モンスターの種類ごとにサブクラスを作成します
  • タワー - タワーのスーパークラス。タワーのタイプごとにサブクラスがあります。

多くのオブジェクトが同時に何かをしなければならないという問題を解決する方法を考えています。たとえば、1ピクセルを1方向に移動します。

私たちが思いついたのは、オブジェクトがいつ動作するかを制御するために、avクラスTimerを実装するという考えです。これが最善の方法かどうかはわかりません。誰かが継続的な更新ケースを解決する方法についていくつかの良いアイデアを与えることができますか?

回答:


12

Game Coding Completeは、更新ループを詳しく説明しています。これは、メインクラスで実行されるwhileループであり、以下のことを行います(多かれ少なかれ)。

while( game.isRunning )  
{  
  GetInput();
  Update( dt );
  Render();
}

固定または可変のフレームレートでゲームを実行するかどうかに応じて、dt(デルタタイム)を渡します。固定フレームレートの場合、これは必要ありません。

次に、非常に簡単に実行したいことを行うには、2Dベクトルの概念を使用します。1つのベクトルはモンスターの位置(x、y)を表し、速度ベクトルはモンスターが移動する方向(単位/秒)を表します。 )。

したがって、さまざまな速度でモンスターを作成するには、速度ベクトルを好きなように変更し、monster.update()関数で処理するだけです。

例えば:

Monster monster = new Monster();
monster.position = new Vector2( 0, 0 );
monster.velocity = new Vector2( 1, 0 );   // Every frame I want the monster 
                                          // to move 1 unit to the right

そして、更新メソッドは次のようになります(60フレーム/秒の固定フレームレートの場合)。

monster.position += monster.velocity * ( 1.0f / 60.0f ); // The ( 1.0f / 60.0f ) would  
                                                         // be dt if it was passed into the Update() method

これはオイラー更新法と呼ばれ、運動方程式を実装する非常に簡単で簡単な方法です。

お役に立てれば。


すばらしい説明は+1。「可変時間」は更新ループのタイミングへの唯一のアプローチではない(私の個人的なお気に入りですが)アプローチではありません。可変時間と固定時間は、このような場所でしばしば議論され、価値があります。検索:)
Zaky German

3

基本的に、私はイベントベースのシステムではなく、更新ループを使用します。

モンスターを更新するには、モンスターのリストを反復して、更新ループでそれらを更新できます。 monster.update()

モンスターが歩く必要がある場合、その位置を更新する必要があります。したがって、更新メソッドでは、経過時間に基づいて新しい位置を計算します。これは、別の「タイマー」クラスに格納されます。

それはすべての「ウォーキング」のものでなければなりません;)


モンスターを動かす方法があります。それはとても簡単です。問題は、モンスターが異なる「速度」を持っているときに、モンスターを動かし、タワーを撃つ方法です。
ØyvindApr

1
@Øyvind:経過時間をパラメーターとしてupdateメソッドに渡すだけです。次に、モンスターは移動することで新しい位置を計算できますelapsedTime * movementPerSecond。それとも、撮影タワーのクールダウンかもしれない:if(cooldown > 0){ cooldown -= elapsedTime } else { cooldown = X, shoot(); }など
bummzack

2

私はそれがユニプロジェクトの目的を十分に満たすと思いますが、実際のゲームでは具体的なモンスタークラスを持ち、タイプのサブクラス化の代わりに、データファイルに異なるタイプのモンスターを記述します。速度、ヘルスポイント、さまざまな種類のダメージとスプライトへの耐性をファイルに完全に記述できるため、新しい種類のモンスターをゲームに簡単に追加でき、毎回コンパイルする必要はありませんそうしたいです。

とにかく、動きについて。すべての「可動」オブジェクトに異なる速度変数を与えます。ゲームロジックの各フレームでは、これらすべての移動可能なオブジェクトをループして、次のようなことを行います

object.x += Math.cos(object.angle) * object.speed * timeSinceLastIteration;
object.y += Math.sin(object.angle) * object.speed * timeSinceLastIteration;

これはモンスター、タワーからのミサイルなどに適用されます...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.