2

スプライトに三角形のグラフィックを含むプロジェクトを作成します。これらのスプライトをグリッドに配置して、それらの長方形がすべて重なるようにします。スプライトが触れられると、z オーダーが (私によって) 変更され、zOrder の一番上に配置されます。

私は Cocos 0.8.1 とタッチ ディスパッチャ メソッドを使用しています。タッチは機能していますが、明らかに、他のスプライトが重なっている「隠された」スプライトには触れることができません。

問題は、「Is the touch in my rect」メソッドがスプライトの長方形に基づいていることですが、画像は三角形であり、画像自体が打たれています。

これは当時ヒット テストの一般的な方法だったことを覚えているようですが、Cocos/iPhone Land でどのように行われるかについての言及は見つかりません。

目標は、スプライトを含む rect だけでなく、画像ピクセルがタッチされたときにのみタッチに応答することです。

4

3 に答える 3

4

ボックスに対してテストする代わりに、もちろん、任意の形状に対してテストできます。

私は最初にNSBezierPathを使用できると投稿しましたが、iPhoneキットでは使用できず、Macでのみ使用できるようです。代わりに、iPhone では CGPath を使用できます。

を使用して新しいパスを作成します。CGPathCreateMutable()これは、パスを作成する ためにまたはconst CGPath *としても知られています。ポイントが形状内にあるかどうかをテストします。CHPathRef
CGPathAddRectCGPathAddLines
CGPathContainsPoint

または、(三角形を使用しているため)ポイントが三角形の内側にあるかどうかを確認するための簡単な計算を行う顧客関数を作成できます。ちょっとした計算でうまくいくはずです(ただし、形状を回転させると、少し複雑になります。形状の原点に対してタッチポイントを回転させてヒット検出を行うことができるので、少し書きます)

三角形の場合:

   C
  /\
 /__\
A    B
point of touch is P

次のアルゴリズムを使用すると、タッチを見つけることができるはずです。

/* first test against a box, for performance */
if( P.y > C.y || P.y < A.y || P.x < A.x || P.X > B.x )
    return false; // false if P falls outside "the box"

/* then check if its within the shape */
/* split the triangle into 2 parts, around the axle of point C */
if( P.x < C.x ) // if the x value of point P is on the left of point C
    if( P.y > ((C.y -A.y) / (C.x - A.x)) * P.x )
        return false; // the point is above the triangle's side AC
else // if the x value of point P is greater than or equal to point C
    if( P.y > C.y - ((C.y - B.y) / ( B.x - C.x )) * ( P.x - C.x ) )
        return false; // the point is above the triangle's side BC

return true; // the point must be in the triangle, so return true.

上記はドライコーディングですが、正しいはずです。

上記は、私が描いた形状の三角形に対してのみ機能します (ここで、Cx は Ax と Bx の間にあり、A と B は同じ高さですが、C の下にあります)。もちろん、これを変更して任意の形状に対してテストすることはできますが、使用可能なCGPath.

わからなかったり、間違っていたら教えてください!

于 2009-11-18T19:16:55.327 に答える
1

Cocos2d および Box2d と一緒に 2 つの素晴らしく不可欠なユーティリティを使用して衝突を検出する方法を説明するこの素晴らしいチュートリアルを見つけました (同様に Chipmunk を使用することもできます)。それらを使用して、衝突を検出するのと同じ方法でタッチを検出するようにプログラムをセットアップできます。

http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

Zwoptexapp へのリンクは次のとおりです。スプライト/スプライトシートの plist ファイルをセットアップするのに役立ちます。

http://www.zwoptexapp.com/

VertexHelper へのリンクは次のとおりです - スプライトのアウトラインをトレースし、そのアウトラインをコードに変換して、プロジェクトに貼り付けて Box2d や Chipmunk などで使用できるようにします。

http://www.springenwerk.com/2010/02/introducing-vertexhelper-for-box2d.html

私はまだ自分で Cocos2d と Box2d を学んでおり、Ray のチュートリアルは非常に役に立ちました。彼らもあなたを助けてくれることを願っています!

于 2010-10-31T02:08:02.393 に答える
0

Cocos2D の開発者が提供するベジェ曲線を使用して正確な画像と四角形の輪郭を直接描くことができるものなど、いくつかのタイル エディター ツールを目にしました。Box2D Physics で使用する場合、Cocos2D サイトと youtube で見たビデオ チュートリアルと例によると、これは非常に簡単に思えます。YouTube の Google タイルまたはマップ エディターと Cocos2d を使用すると、使用できるいくつかのツールが表示され、複雑な幾何学的衝突をプログラムする必要はありません。WYSIWYG である必要があります。

乾杯、

マシュー

于 2009-11-17T15:54:26.627 に答える