iPhone用のcocos2dでシューティングゲームをプログラミングしています。私と私は、スプライトのアルファから衝突検出を除外したいと考えています。単一ピクセルの RGBA 値を読み取るにはどうすればよいですか。助けてくれてありがとう。
2 に答える
最初に、本当にこれを行う必要があるかどうかを考えてみてください。他の衝突検出方法 (バウンディング ボックス、円衝突など) よりもはるかに計算コストがかかりますが、これは正確ではないかもしれませんが、ほとんどの目的では十分に機能します。
本当にこれを行いたい場合は、衝突を検出するスプライトごとにマスクを生成する必要があります。このマスクは、スプライトの単純な 1 ビット表現であることが理想的です。
次に、衝突をチェックするスプライトごとに、いくつかの手順を実行する必要があります。
ピクセル単位の正確なコリジョンには時間がかかるため、最初に 2 つのスプライト間でバウンディング ボックスのコリジョンを実行して、ピクセル レベルのコリジョンをチェックする必要があるかどうかを確認します。
スプライトが境界で衝突したことがわかっている場合は、衝突の矩形を計算します。この段階で、それらが X% を超えてオーバーラップしている場合に衝突したことを示す最適化を実行することをお勧めします。特に、スプライトのアルファ領域が外側のエッジに沿っている場合。
衝突の rect 領域を使用して、各スプライトのマスクを調べます (両方のピクセルが 1 の場合、衝突があります)。ループを終了し、それらを衝突としてマークするために必要なことを行います。
ご覧のとおり、これは他の方法に比べて非常に CPU 負荷が高いため、最初は使用しないことをお勧めしました。システムがピクセルの正確な衝突をハードウェアでサポートしていない限り (Atari 2600 には実際にこれがありました)、ほとんどのゲームは衝突にピクセル値を使用しません。
バウンディング ボックス アプローチを使用することにした場合は、衝突に使用されるバウンディング ボックスを縮小して、2 つのスプライトがコーナーで互いに接触したときの誤検知を防ぐことができます。
幸運を!
Cocos2dに固有ではありませんが、どのiPhoneプロジェクトでも機能するはずです-この質問と回答を確認してください