2D ゲームでの発射体の動きに関する例はたくさんあります。
- しかし、2D のトップダウン ビュー ゲームで発射体の動きを実装するための方程式は何ですか? たとえば、ボールを蹴ってその高さを上げたいとします (賢明なサッカーのように)。
ボール用とその影用の 2 つのスプライトが存在する可能性があることを読みました。
- しかし、ボールがポストに当たったときの衝突検出と応答をどのように実装すればよいのでしょうか? z 座標も使用する必要がありますか?
2D ゲームでの発射体の動きに関する例はたくさんあります。
ボール用とその影用の 2 つのスプライトが存在する可能性があることを読みました。
あなたが直面している問題は、グラフィックスとロジックの重要な違いを示しています。つまり、ユーザーが見ていることと、その画像が反映する基礎となる仮想世界との違いです。
2Dと3Dの世界の次元は必ずしも一致する必要はありません。実際、基本的に、PongからSkyrimまで、すべてのグラフィックは2Dです。ゲーム開発者が次元に関して下さなければならない唯一の決定は次のとおりです。
あなたの場合、最初の質問に対する答えは、ボールが空中で蹴り上げられる可能性があることを考えると、「はい」のようです。これは、本格的な「3D」グラフィックスの領域で、そのようなグラフィックスが存在する可能性がある範囲で作業していることを意味します。「2Dトップダウン」ゲームとは、おそらく「深みのない3Dトップダウンゲーム」を意味します。これは、直交投影または等角投影のいずれかを使用して実現されます。興味がある場合は、これをグーグルで検索できます。
非常に単純な手がかりがプレーヤーの空間の視覚的知覚に大いに役立つ可能性があるため、シャドウ効果はそのような投影を実現するための優れた選択です。ハローの3Dグラフィックスが幻想である以上、それは幻想ではないことを忘れないでください。画面はフラットで、網膜はフラットで、グラフィックもフラットである必要があります。それは、仮想的であれ物理的であれ、世界を3Dにするものではありません。
2番目の質問については、おそらく完全にトップダウンで投影することはないでしょう。もしそうなら、影は常にボールによって隠され、サッカー選手の頭のてっぺんしか見えません。あなたはおそらく45度の角度のダウンプロジェクションについて話していると思います。これははるかに自然に見え、最初からゲームで使用されてきました。ポケモンはその代表的な例です。ここですべてが実行されています:
class SoccerBall extends GameObject3D {
voic draw() {
translate(x, y / 2); // the camera is at an angle, so we foreshorten in the y direction
drawShadow();
translate(0, z / 2);
drawBall();
// cleanup the changes we made to the graphics state
translate(-x, -y / 2 - z / 2);
}
}
さて、元の質問に戻りましょう。これは主にゲームロジックに関するものでした。ボールの位置に高さを導入することで、間違いなくz次元が導入されました。あなたの場合、このz次元はめったに使用されないかもしれません。オブジェクトをGameObject
sとGameObject3D
sに分割し、前者はとx
をy
持ち、後者は追加z
(またはheight
、もう少し有益な場合があります)を持ちます。
投射物の動きは本当に簡単です。必要に応じて高さを増減するだけです
class SoccerBall extends GameObject3D {
float vel_x;
float vel_y;
float vel_z;
// most of the soccer ball class...
void kick(angle direction, angle inclination, float force) {
// calculate based on direction
vel_x = force * cos(direction);
vel_y = force * sin(direction);
// take into account inclination
vel_z = force * sin(inclination);
vel_x *= cos(inclination);
vel_y *= cos(inclination);
}
void movement_update(float delta_time) {
// this function assumes our location
// units are in meters
// and our velocity units
// are in meters/second
// apply gravity
vel_z -= 9.8 * delta_time; // EDIT: switched from += to -=. += could be useful if you're playing soccer with a balloon for a ball!
// move
x += vel_x * delta_time;
y += vel_y * delta_time;
z += vel_z * delta_time;
}
}
衝突検出の場合、地面との衝突のみを気にする場合は、簡単なif (z < 0) {z = 0; vel_z = 0}
チェックを行うことができます。より複雑な場合は、オブジェクトのグリッドスクエアの計算が安価であり(floor(x), floor(y)
)、スクエア内の他のオブジェクトと照合するだけでよいため、グリッドベースのシステムは常に衝突検出に適しています。これは2Dと同じように3Dでも簡単で、インターネット上の他の場所にも多くの良い説明があります。
ゲームを楽しんでください:)