ピンボールゲームの2D衝突検出


9

これまでのゲームでは、ボックスとの単純な2D衝突を使用してから、ピクセルレベルで衝突をチェックしました。

ほぼ多数のフレームでピンボールゲームを作成する場合、ボールは壁または別の表面に接触するため、別のアプローチはありますか?

回答:


19

昔(1990年)、古いピンボールゲームは次のように作成されました。

プレイフィールドにはいくつかのレイヤーがあります(ゲームをプレイすると表示されるもの):

ここに画像の説明を入力してください

衝突のためのいくつかのレイヤー:

ここに画像の説明を入力してください ここに画像の説明を入力してください

左のグレースケールの画像はメインゲームのコリジョンマップ、右の画像は特別なエリアのピンボールランプのコリジョンマップです。

White =ボールの空き領域、カラーインデックスは255です。

Gray=ボールはこのゾーンから「押し出されます」。カラーインデックス=ボールの位置に追加するベクトルの角度。薄い灰色= 0度 濃い灰色= 360度

いくつかの擬似コード:

void do_ball_physics()
{
    while(1)
    {
         byte color = read_pixel_under_ball(ballx, bally); //one pixel read
         if(color == 255) //see remark below
            break;
         float vectorx = sin(color/255.0f * 2.0f * PI);
         float vectory = cos(color/255.0f * 2.0f * PI); 
         ballx += vectorx; //push ball away from one unit
         bally += vectory; //

    }
}

いくつかの特別なカラーインデックスはまた、衝突以外の何かのために使用することができ、カスタムカラーの範囲(例:240から255)は同様に特区を検出するために予約することができspinnerstriggersbumpersholes、...

ご覧のとおり、これは非常に簡単です。フレームごとに「読み取られる」ピクセルは数個しかありません。このため、物理シミュレーションを実際の高フレームレートで実行できます(例:200 fps)。高いフレームレートを使用すると、シミュレーションがスムーズになり、「トンネリング」が減少します(これは、ボールが速すぎてトラフエレメントを衝突せずに通過するときに発生します)。そのシンプルさはまた、386 computers286色の循環、VGAのスクロール、スプライトのマスキングなどの他のいくつかのトリックの中でも)昔もスムーズなピンボールゲームを可能にし(さらには高速に)しています。

今日、ほとんどのピンボールゲームは、このように作られていません。代わりに、プレイフィールドはポリゴンまたはスプライトを使用する2D / 3Dシーンであり、視覚的なプレイフィールドの単純化された形状を表すいくつかの単純化された線、ベジエ曲線、または球に対して衝突が行われます。

例(ビジュアルピンボールから):

ここに画像の説明を入力してください

一部のゲーム会社は独自の物理エンジンを使用していますが、Box2Dまたはのような物理エンジンを使用する方法も簡単Bulletです。私が目にしたほとんどのiPhoneピンボールゲームは、既存の物理エンジンといくつかの3Dアセットを使用していました。


...ここではJavaScriptとキャンバスについて話しているので、このフレームワークで可能な最も遅い操作は...ピクセルの描画と読み取りです...特に最も遅いデバイスで。したがって、この回答の4/5は単に履歴/無関係です。しかし、合理性は写真と競争することはできません。
GameAlchemist 2012年

1
衝突マップは配列に格納できますが、なぜキャンバスに格納したいのですか?答えの最初の部分は主に歴史に関するものですが、非常にローエンドのCPU(例:古いgsm)にピンボールを実装する必要がある場合でも、これは適用できます。現代では、jbox2dのような物理エンジンを使用することをお勧めします。または、線セグメントまたはベジエ曲線との衝突を使用して自分で物理学を行うことをお勧めします(そのようなことを記述できる場合)。
tigrou

最新のブラウザでは、画像のピクセルの読み取りも非常に高速です。最初の「omg JSはCより速い」デモの一部は、すべて画像処理カーネルでした。
Sean Middleditch、2012年

衝突マップのチグルについてどのようにして知りましたか?
Bemmu

1
このピンボールの夢のためにリメイク:pouet.net/prod.php?which=24499(私ではありません)。ソースを見て、私が話す衝突マップがそこにあります。
tigrou

1

ピンボールには、穴や壁だけでなく、反応要素(打撃)や不均一な表面など、非常に豊富な物理学のセットがあり、ボールの速度が低下して速度が戻ります。

良いピンボールを作成したい場合は、3D衝突検出を使用するか、すべての衝突可能なオブジェクトが距離と速度のパラメーターを持つメソッドを持ち、変更された速度を返すセルフテーラードシステムを使用します。


3D衝突検出で2Dに比べてどのような利点があるのですか?
ジョン

@ジョン私はランプなどを備えた3Dゲームとして良いピンボールを想像します。これらのランプを2Dでプログラムし、ランプを超えたときにボールをスケールアップし、自分自身にフォールバックしたときにボールをスケールダウンできますが、この場合はまだ3Dです。ゲーム、あなたは自分でZ次元を追加するだけです。
Markus von Broady、

1

少し前にピンボールゲームを作りました。ピクセルベースでもありました。衝突データを含む衝突マップがありました。おおよその衝突法線は簡単に見つけることができました。

ボールに重なる衝突マップの領域を取り、中心を見つけ、そのポイントからボールの中心へのベクトルを形成し、次に正規化します。

それがあなたにいくつかのアイデアを与えることを願っています:)


1

最初にピンボールゲームを作成する場合、バウンディングボックス1よりも多くのbounding-CIRCLE-collision-detectionが必要になる可能性が高いです:-)
本格的なピンボールに関係する物理の複雑さを考えると、既存の2D物理エンジン。Box2DはJavaScriptでかなりの評判があります。他にもあるかもしれませんが、私は良い(そして無料の)ものに出くわしませんでした。
Rq1:あなたは確かに(私がするように)ゲームの更新と描画の間の古典的な分割を使用します。そして、タイマー(setInterval / setTimeout)やRequestAnimationFrameを使用して、定期的にupdateを呼び出してから描画します。ピンボールは、1つのタイマーが更新を駆動し、もう1つがドローを駆動するタイプのゲームである可能性があります。そのため、それぞれのレートを個別に調整して、幅広いデバイスで作業できます。デバイスが遅すぎる場合は、単にドロップ(更新+描画)できないので、2つの更新の間の時間(dt)が長くなりすぎると、物理エンジンが衝突を見逃す可能性があります。


0

2Dと3Dの主題について、視覚的なピンボールと将来のピンボールを見てみるとよいでしょう。ビジュアルピンボール(すべては2dで行われます)をプレイし、その後、将来のピンボール、またはZenピンボールのようなものをプレイすると、プレイ方法の違いを感じます。私は個人的には3Dを好みますが、あなたのプロジェクトは2Dに適しているかもしれません。

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