1

cocos2d-x アプリケーションを作成しています。その上にいくつかの子スプライトがあるスプライトがあります。これらのスプライトは、オブジェクト全体として変換される画面上の 1 つの論理オブジェクトを表します。ここで、オブジェクトがタッチされたときに、どの子スプライトがタッチされたかを検出する必要があります。

問題は、親スプライトが現在のようにすべての情報 (バウンディング ボックス、スケール、回転など) を提供する一方で、子スプライトは親と一緒に変換されているにもかかわらず、元の番号のままであり、私には理解できないことです。子の「実際の」寸法を計算する正しい方法。

私には、2 つの事実がすべての問題を引き起こしているように見えます。

  1. 子境界ボックスには、親の初期境界ボックスに関連して報告される初期寸法があります。
  2. 親が回転した後、親の初期バウンディング ボックスを計算できません (下の図を参照)。そのため、子の変換の関係点として必要な親スプライトの左下隅がどこにあるかを計算できません。

このような状況を図にすると、次のようになります。

回転後のスプライト バウンディング ボックス

要約すると、タッチが子スプライトに当たったかどうかを確認するには、親の変換に基づいて、子の現在のバウンディング ボックスを計算する必要があります。子のスケーリングと回転を計算できますが、親のバウンディング ボックスが最初とは大きく異なるため、親に対してどこに配置する必要があるかわかりません。奇妙なアンカー ポイントをストーリーに追加すると、さらに複雑になります。完璧な解決策は、バウンディング ボックスではなく、元のスプライトの頂点を取得することです。出来ますか?

何か案は?何か不足していますか?

4

3 に答える 3

1

boundingBox() のソースコードが役立つかもしれません。nodeToParentTransform() によって affinetransform を取得し、CCPointApplyAffineTransform を使用して 4 つのポイントの新しい位置を取得できます。次に、タッチが新しい四角形にあるかどうかを確認する新しいメソッドを作成できます。

于 2012-10-24T08:44:14.447 に答える
0

誰かが回転したラベルの文字境界ボックスを見つけたい場合:

int maxIdx = label->getStringLength() -1;
Mat4 trans = label->getNodeToParentTransform();
for(int idx = 0; idx<=maxIdx; idx++) {
    Sprite* letter = label->getLetter(idx);
    Rect letterRect = letter->getBoundingBox();
    Point p = PointApplyTransform(letterRect.origin, trans);
    Rect rect = Rect(p.x, p.y, 10, 10); // Letter Approximation rect
}
于 2014-07-30T09:59:49.707 に答える
0

親がいると仮定します

CCSprite* parent;

そして子供、

CCSprite* child; //child Tag is 100

touch メソッドで試してみることができます。

YOUR_CLASS::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent){
    CCPoint touchLocation = parent->convertTouchToNodeSpace(pTouch);
    if (CCRect::CCRectContainsPoint(parent->getChildByTag(100)->boundingBox(),touchLocation)){
        //do something
        CCLOG("touch on child");
    }
}
于 2012-09-22T00:28:49.913 に答える