2009-05-09 8 views
3

私は焦土やiPhoneのiShootのようなゲームで見られる2D地形破壊を実装する方法の例を探しています。iphoneやJavaでScorched Earthゲームのような地形破壊を実装する

破壊可能な地形を実行し、OpenGL(Javaの場合はLWJGL)を使用して、iPhoneでOpenGL ESを使用してレンダリングする必要のあるゲームを実装しようとしています。

alt text http://www.vintagecomputing.com/wp-content/images/shareware/scorch_3_large.png

+1

ちょうど2Dなら、それは画像操作で終わり、地形として使用されるビットマップの一部を消去するだけです。 –

+0

@ LasseV.Karlsen 3D地形破壊に関するリンクを提供できますか?ありがとうございます。 – zionpi

+0

いいえ、できません。ごめんなさい。 –

答えて

7

私は、彼らは2枚の画像を使用ワームで、思い出したよう。色のついた「きれいな」地形と、純粋な白黒のマスクの地形です。ヒット検出は常にマスク上で行われます。

Tank Warsのように実際に地形を崩壊させたい場合は、画像の各列を繰り返して、地形と競技場の底面との間のギャップを検索する必要があります。ギャップが検出された場合は、ギャップの上にある地形を列内の可能な最も低い地点に移動します。

この単純な例は、配列が1の場合は地形が固まり、0の場合は空白を表します。

[1,1,1,1,1,1,0,0,0,0] 

は地形が側面から打たれ、穴が作られていると仮定しましょう:この場合、私は地面の上にあることになる要素[0]に、グランドレベルとして配列の左側を設定しました:

[1,1,0,0,1,1,0,0,0,0] 

別の地形の上に浮遊している地形が残っています。浮動小数点を崩壊させるには、配列全体を繰り返し、0(空白)が見つかる最初の位置を追跡します。次に、繰り返し続けるにつれて、1(地形)を発見すると、1を0の位置にシフトするだけです。古い0の位置+ 1を反復してプロセスを繰り返します。

[1,1,1,0,0,1,0,0,0,0] 

[1,1,1,1,0,0,0,0,0,0] 

これは基本的なアプローチであり、最も効率的なものではありません。移動するほうがはるかに速くなるすべてたとえば、ギャップの上にある地形のインデックスが同時に表示されます。

EDIT:最初のコメントの状態として

、リストの並べ替えがさらに簡単です。私は元の応答をそのまま維持しているので、崩壊している地形の背後にある実際の原理を説明するのに役立ちます。

+0

倒壊している地形では、マスクは地形(1)と非地形(0)ビットしか含まない場合、「崩壊する」ための並べ替えを使用できます(この場合、一定時間アルゴリズム)。 – fishlips

2

ソビエトの答えは素晴らしいです!私はScorched Earth for iPhoneの破壊的な地形の特徴に同様のアルゴリズムを使用します。私はオリジナルに忠実になり、地形が即座に解決することを決めましたが、アニメーション地形が定着していると考えているうちに、いくつかのパフォーマンス上の問題が発生しました。 iShootはゆっくりと静かに動く地形を使用しているので、iShootでもこれの証拠を見ることができます。次のプレイヤーが武器を発射したときに、地面がまだ1つのプレイヤーのターンから落ち着いている状況があります。これはショットに干渉することがあり、干渉は次のプレーヤーがどのくらい速く発砲するかによって変わることがあります。 Scorched Earthはターンベースのゲームなので、次のプレイヤーに切り替えるまで地面が落ち着くまで待つことをお勧めします。地形をレンダリングする

は、私はこのように、各水平スクリーン位置に頂点の1つの対を有するポリゴンを描画するためにOpenGLを使用した:

1 3 5 7 9 
0 2 4 6 8 

ポイント偶数との下部に画素の行を表しますスクリーン。奇数の点は、地形の垂直ピクセル位置を表します。この情報は、このように、三角形ストリップとして、glVertexPointer、glColorPointer、及びglDrawArraysでレンダリングされたポイントアレイにコピーされる:

// prepare vertex buffer 
for (int i=0,j,k=0,K=480;k<=K;k++) { 
    j = (k-(int)offsetX+480)%480; 
    vGroundLevel[i++] = k; 
    vGroundLevel[i++] = offsetY>0 ? 0 : offsetY; 
    vGroundLevel[i++] = k; 
    vGroundLevel[i++] = [env groundLevelAtIndex:j]+offsetY; 
} 
.... 
// render vertex buffer 
glVertexPointer(2, GL_FLOAT, 0, vGroundLevel); 
glEnableClientState(GL_VERTEX_ARRAY); 
glColorPointer(4, GL_UNSIGNED_BYTE, 0, cGround); 
glEnableClientState(GL_COLOR_ARRAY); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 2*480); 

offsetXとoffsetYパラメータは地形が画面に対して再配置されることを可能にしますラップアラウンド連続体としてゲーム環境を維持しながら、プレイヤが環境をインタラクティブに移動することを可能にする。

関連する問題