2010-12-27 6 views
0

glReadPixelsを使用してオブジェクトに触れることを検出する方法を考案しましたが、オブジェクトが別のオブジェクト(例:箇条書きなど)iPhone OpenGL ES:箇条書きを発射し、オブジェクトにヒットしたかどうかを検出する

色を検出することはできません。

+0

ゲーム内の通常の操作シーケンスの一部としてglReadPixelsを使用しないでください。その機能はうまくいきますが、GPUリソ​​ースとバスの束がロックされ、速度が遅くなります。それをあなたのコードにすることは、スクリーンショットのような特殊な状況を除いて黄色の旗です。 –

答えて

3

他の人が言っているように、グラフィックスではなくオブジェクトモデルでこれを実行します。

単純なモデルの場合は、弾丸以外の各オブジェクトにサイズを与えます。その後、箇条書きの位置がその目盛りごとにそのオブジェクトの半径内にあるかどうかをチェックします。擬似コード:

for each bullet 
    for each hittableObjectInWorld 
    if ([hittableObject isTouchedBy:bullet]) {/*handle collision*/} 
    endFor 
endFor 

hittableObject::isTouchedBy:(Sprite *)otherObject { 
    xDistance = [self x] - otherObject.x; 
    yDistance = [self y] - otherObject.y; 
    totalDistance = sqrt((xDistance*xDistance) + (yDistance*yDistance)); 
    if (totalDistance <= [self size]) return YES; 
    else return NO; 
} 

これで、単純な衝突検出システムが実現しました。ここではいくつかの抽象概念があります。ヒット可能なすべてのオブジェクトを、「サイズ」を半径とする球のように扱います。弾丸はピンポイントは小さいですが、弾丸の半径をヒット可能なオブジェクトの半径に加えて補正することができ、このようにして数学の実行を少し早くすることができます。

これは、可能な限り最も単純な衝突検出システムです。ここには改善の余地があります。大きなことは、ヒット可能なオブジェクトの数が各ティックをチェックする回数を弾いていることです。あなたが世界に多くの弾とたくさんの物体を持っているなら、それは多くのプロセッサ時間になる可能性があります。あなたがしなければならない小切手の数を減らすためのあらゆる種類のハックがあります。このバージョンでスピードの問題に遭遇した場合は、次にそれをチューニングしてください。

幸運を祈る!

+0

P.S.上記の衝突システムは、2D世界向けです。 3Dでは、距離計算にZを追加する必要があります。 – baudot

+0

P.P.S.グラフィックスではなく、これを行うことによって意味するものについての明確化:あなたの世界の各物について、グラフィックスオブジェクトだけでなく、それを表すオブジェクトを持たなければなりません。オブジェクトの速度、ライフポイントなどを保存するには、すでにこれを実行しています。 OpenGLグラフィックスオブジェクトではなく、これらのオブジェクトで衝突計算を行います。 – baudot

+0

P.P.P.S. 3D世界で2次元の薄い壁に衝突する小さな弾丸を見る場合、オブジェクトからの半径よりも高度なヒットテストが必要になります。代わりに、前のダニの反対側にあったときに1つのティックでポリの一方の側にある弾丸を探し、その場合は、最後のダニと現在のポリの境界内を通過したかどうかを確認しますティック座標。 – baudot

1

あなたのオブジェクトモデルではなく、グラフィックスコードで行います。 OpenGLは、衝突検出にのみ接線方向に関連しています。

+0

もう少し説明できますか?グラフィック衝突ではなくコードで行うことを意味しますか? – Burf2000

1

OpenGLは、ゲームオブジェクトのグラフィック表示のみを扱います。ゲーム内のオブジェクトの動作に関するロジックは、OpenGLグラフィックスコード以外のオブジェクトの状態を管理するコードで行う必要があります。

お探しのものはcollision detectionです。これはかなり深い話題です。衝突を検出すると(例:オブジェクトに当たる弾丸など)、OpenGLコードを実行してユーザに衝突の反応を表示することはありますが、実際の衝突の検出はOpenGL内で行われるべきではありませんレルム。

最後に、このすべてが圧倒的であることがわかったら、cocos2dまたはUnityのようなゲームエンジンの使用をお勧めします。

関連する問題