タワーディフェンス+ Box2D

タワーディフェンスゲームを書いている場合、 Box2Dのような物理エンジンを使用することを考えたでしょうか? ユニットの移動、タワーの動作をどのように実装しますか? そのようなゲームで物理エンジンから他に何を学びますか?



私はこれらの問題や他の問題について数ヶ月前に考え始めました。その結果、かなり興味深いゲームが生まれました。



私はタワーディフェンスゲームの大ファンです。 それはすべて、Green TD、Warcraft 3のマップでかなり前に始まりました。その後、 flashtowerdefense.comで多くのゲームを試しました。



アイデア



自分でそのようなゲームを書くのがいいだろうと思ったら。 私は何か変わったものを思いつきたかったのですが、私の友人の一人が言うように、「ロボットはすでにそれにうんざりしています」。 主にこのカテゴリの市場で、ロボット、ゾンビ、神話上の生き物のほぼどこでも、彼に反対することは困難です。 もっと明るく平和なものが欲しかった。 また、ゲームで物理エンジンを使用することに執着しました。まず衝突を処理しやすくし、次に非標準で面白いものを追加しました。







その結果、次のプロットが考案されました。マップ上を歩くモンスターやゾンビの代わりに、ロボットの塔や動物の塔ではなく、木から落ちる果物がありました。 果実の落下軌道は、木と重力で成長する枝によって設定されました。 果物は途中で枝から数回跳ね返り、速度と方向が変わりましたが、動物の塔は倒れたときにそれらを粉砕しなければなりませんでした。



5種類のタワーを作成しました。



リス。 果物、普通の塔、良い攻撃速度とダメージにナッツを投げます。 タワーには特別な能力はありませんが、レベルなしでレベルを渡すことは非常に難しく、ゲームの最初と最後の両方で役立ちます。



白いキツネ。 凍結する渦を果物に送り込み、それにより落下速度を遅くします。 この塔がなければ、簡単以外の難易度でレベルを渡すことはほとんど不可能です。 それでも、私は魔法なしでは完全に行うことはできませんでした。私のゲームでは、凍結塔が本当に必要でした。



キツネ。 タマネギから矢を放ち、そのパスにあるすべての果物を飛ばします。 このタワーは、一発で最大数の果物に当たるように賢明に設定する必要があります。 いくつかのレベルでは、この塔の下に重要な場所があり、プレイヤーの仕事はそれらを確認することです。



ハリネズミ。 すべての方向に針を撃ちます。 攻撃半径とダメージは小さいですが、針の数が多いため、果物の大きなクラスターが形成される場所や円で回転する場所で非常に役立ちます。



くま 石を投げます。ヒットすると、果物の弾道を撃退し、変更します。 いくつかのレベルでは、生き残った果物を投げ捨てて、残りの塔がそれらを仕上げることができるように、それを下に置くことができます。 レベルの最初に置くと、多くのfireを壊す可能性があります。



Box2d



認めざるを得ない、Box2Dエンジンは私の人生をずっと楽にしてくれた。 彼のおかげで、私はゲーム内で果物の美しい落下、それらの塔による検出、その他の衝突チェックを行いました。 Box2Dがなければ、クマはいません。 物理エンジンを使用した新しいタワーのアイデアがいくつかあります。たとえば、矢印でキツネを枝につなぎ、そのような矢印が果物に当たると、他のタワーが壊れるまでロープにぶら下がっています。 あなたは多くの興味深いことを思いつくことができます。



次に、Box2Dを使用した特定のオブジェクトと、設定する必要があるプロパティについて説明します。

役職 Box2Dプロパティ 画像
フルーツ b2CircleShape

b2_dynamicBody

groupIndex = -1




支店 b2_staticBody

b2PolygonShape




タワー b2_staticBody

b2CircleShape

isSensor = true




矢印 b2_dynamicBody

b2PolygonShape

isSensor = true




ストーン b2_dynamicBody

b2CircleShape





壁、床、

天井
b2_staticBody

b2PolygonShape







b2_staticBodyは、オブジェクトが動かず、重力やその他の力の影響を受けないことを意味します。 これは、塔、枝、および境界線に適用されます。



b2_dynamicBodyは、他のオブジェクトを移動および跳ね返すことができる可動オブジェクトを定義します。 すべての果物と弾丸はb2_dynamicBodyです。



isSensor = trueは、オブジェクトが衝突せず、他のオブジェクトはバウンスせずに通過するため、オブジェクトが存在しないことを意味します。 このようなイベントが発生すると、ライブラリは、果物がタワーの範囲内に収まるか、矢印がリンゴを通過するときに状況に必要なものを知らせます。 すべての果物は同じ負の値groupIndexを持っているので、お互いに衝突することはありませんが、枝や境界でうまく跳ね返ります。



b2CircleShapeオブジェクトは丸く、 b2PolygonShapeは多角形です。私の場合、そのようなオブジェクトはすべて長方形です。



タワーディフェンスにBox2Dを導入することは簡単なことではないことを認めなければなりません。たとえば、Box2Dを使用して凍結タワーを実装する方法を推測する人はいますか? (実際、この質問に対する答えは、物理学の9年生の問題を解決することを必要とし、別の投稿に値します)。 すべてのオブジェクトに適切な物理パラメーターを選択するには、かなりの時間が必要でした。 しかし、最終的にはすべてがうまくいき、自信を持って言うことができます。「タワーディフェンス+ Box2D =はい!」



結果



私は自分のゲームにForest Tower Defenseという名前をつけてアンドロイドマーケットに出しました 。 ご希望の方は無料でダウンロードできます。 ここで、ゲームのスクリーンショットとビデオを見ることができます。 グラフィックスは漫画的であることが判明したため、子供たちもゲームが好きかもしれません。



タワーディフェンスゲームのすべてのファンに試してみることをお勧めします。これは、このジャンルの同様のメカニズムを持つ唯一のゲームだからです。



あなたの意見、改善のヒント、新機能のアイデアを聞いてとても興味があります。



UPD:ゲームの開発はこの記事で説明た原則に従って行われたため、Qtを使用するWindows用のバージョンがあります



All Articles