1

画面の片側に CCSprite で満たされたスクロールビューがあり、そのうちの 1 つを画面のメイン領域にドラッグできるようにしたいと考えています。ユーザーがドラッグを開始したスプライトを見つけるだけです。

タッチ位置を各スプライト座標空間に移動しようとしましたが、数字があちこちにあります。

位置はTouch->getStartLocationInView()

ScrollViewItems はVector<Sprite*>

string HelloWorld::SpriteNameForPosition(cocos2d::Vec2* position)
{

for(Vector<Sprite*>::iterator iter = scrollViewItems.begin() ;iter !=  scrollViewItems.end();iter++)
{
    Sprite* sprite = *iter;
    Vec2 spriteTouchPos = sprite->convertToNodeSpace(*position);
    Rect bounds = Rect(0, 0, sprite->getBoundingBox().size.width, sprite->getBoundingBox().size.height);

    if(bounds.containsPoint(spriteTouchPos))
    {
        return names[sprite->getTag()];
    }
}
return "";
}
4

1 に答える 1

0

最初の質問は、なぜ境界ボックスの位置を変更するのですか? 位置を(0、0)に設定する代わりに、boundingBoxを取得して、ポイントがその中に含まれているかどうかを確認してください。

オフセットがすべての子に適用されると、スクロール ビューは content/boundingBox の実際の位置に更新されるため、画面に表示されているように、境界ボックスは常に正しい位置を反映します。これは、drawNode を使用してスプライトの周りに長方形を描画することで確認できます。私は通常、これをデバッグの方法として使用して、正しい寸法と位置で作業していることを確認します。

各scrollViewItemから返されるboundingBoxを使用するだけで問題を解決できます。

auto bounds = sprite->getBoundingBox();

if(bounds.containsPoint(position))
{
   return sprite->getName();
}
于 2015-10-05T08:34:06.383 に答える