Cocos2Dでは、ユーザーが描画した任意の形状との衝突をチェックするにはどうすればよいですか?


10

スプライトとユーザーが生成したある種の形状との衝突を検出したいのですが。

例えば。画面には3つのオブジェクトがあります。ユーザーは指を取り、2つのオブジェクトの周りに異常な形状を描きます。これら2つのオブジェクトを検出する必要があります。

紫のユーザーシェイプ、緑と赤のゲームオブジェクト

Cocos2Dを使用してこれに効率的にアプローチするにはどうすればよいですか?

回答:


10

その特定の例には非常に簡単な解決策があります。

私はあなたの任意の形状が単なる一連の点であると想定しています。

各オブジェクトから任意の方向に光線を描画します。図形の線分と交差する回数が偶数(0を含む)の場合、図形の外にいます。

交差する回数が奇数の場合、オブジェクトの内部にいます。

レイ/ラインセグメントの衝突は、検索/実装が非常に簡単なアルゴリズムです。


3

確かに、私は私のゲームスターキャッチのためにそれを理解しなければなりませんでした。それを行うにはもっと良い方法があるかもしれませんが、これは私がそれをした方法です。実際にアルゴリズムをオンラインで見つけました(ソースを思い出せません)ポリゴン内のポイントを検出するために検索を行いました。

私は自分のポイントを保持するためにNSMutableArrayを作成しました。タッチイベントにポイントを追加します。

- (BOOL) testNodeInLoop:(CCNode *)node {

    CGPoint prev;

    // This is more accurate point for the node
    CGPoint absPoint = [node convertToWorldSpace:CGPointZero];

    float x = absPoint.x;
    float y = absPoint.y;

    BOOL isIn = NO;

    CGPoint cp;

    for(int i = 0, j = [points count] - 1; i < [points count]; j = i++) {
        [[points objectAtIndex:i] getValue:&cp];
        [[points objectAtIndex:j] getValue:&prev];

        if( ((cp.y > y) != (prev.y > y)) && (x < (prev.x -cp.x) * (y - cp.y) / (prev.y - cp.y) + cp.x)) {
            isIn = !isIn;
        }
    }
    return isIn;
}

これが役に立ったかどうかをお知らせください。



0

ピクセル単位の衝突チェックについては、XNA開発者サイトに素晴らしいチュートリアルシリーズがあります。
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

これらのチュートリアルで使用されなかった(奇妙なことに)使用できる最適化の1つは、ほとんどの場合、アウトラインのみをチェックする必要があるため、貴重なサイクルを節約できます。 。

追加するために編集:厄介な答え、質問を誤解。ピクセル単位のコールデットについて読みたい場合は、チュートリアルはかなりまともです。

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