试图找到在onTouchEnded上的sprite数组中点击了哪个Sprite

时间:2015-08-01 03:17:56

标签: ios animation cocos2d-x ontouchevent

我正在尝试检测在精灵数组中触摸了哪个精灵,以及何时触摸它以在被触摸的精灵上运行动画。我已经将所有精灵放置在地图中,但是当用户触摸除第一个精灵之外的任何其他精灵时,动画都不会运行。我正在使用cocos2dx 3.5。感谢您的任何帮助。

这是我的onTouchesEnded

void BattleScreen::onTouchesEnded(const std::vector<cocos2d::Touch *> &touches, cocos2d::Event *event)
{

for (auto touch : touches)
{
    auto tapped = touch->getLocationInView();

    for (int i = 0; i < defenseSpots.size(); i++) {

        if(defenseSpot[i]->getBoundingBox().containsPoint(tapped))
        {

            sealAnimationSprite = Sprite::create("sealanimation5.png");
            sealAnimationSprite->setPosition(Point(defenseSpot[i]->getPosition().x, defenseSpot[i]->getPosition().y));
            this->addChild(sealAnimationSprite,20);

            // now lets create animation frames
            Vector<SpriteFrame*> sealAnimationFrames;
            sealAnimationFrames.reserve(5);
            sealAnimationFrames.pushBack(SpriteFrame::create("sealanimation5.png", Rect(0,0,100,100)));
            sealAnimationFrames.pushBack(SpriteFrame::create("sealanimation4.png", Rect(0,0,100,100)));
            sealAnimationFrames.pushBack(SpriteFrame::create("sealanimation3.png", Rect(0,0,100,100)));
            sealAnimationFrames.pushBack(SpriteFrame::create("sealanimation2.png", Rect(0,0,100,100)));
            sealAnimationFrames.pushBack(SpriteFrame::create("sealanimation.png",  Rect(0,0,100,100)));


            // create the animation out of the frames
            Animation* sealAnimation = Animation::createWithSpriteFrames(sealAnimationFrames, 0.01f);
            animateSeal = Animate::create(sealAnimation);

            // run it and repeat it forever
            sealAnimationSprite->runAction((animateSeal)); 
        }   
    }   
}
}

这是我的方法,我创建精灵并放置它们

void BattleScreen::createDefenseSpots()
{
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();

for (int i = 0; i < 4;i++)
{
    defenseSpot[i] = Sprite::create("placement.png");
    if(i == 0)
        defenseSpot[i]->setPosition(Point(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
    if (i == 1)
        defenseSpot[i]->setPosition(Point(visibleSize.width / 1.4 + origin.x, visibleSize.height / 3+ origin.y));
    if (i == 2)
        defenseSpot[i]->setPosition(Point(visibleSize.width / 3.5 + origin.x, visibleSize.height / 1.5 + origin.y));
    if (i == 3)
        defenseSpot[i]->setPosition(Point(visibleSize.width / 2.5 + origin.x, visibleSize.height / 4+ origin.y));
    this->addChild(defenseSpot[i]);
    defenseSpots.push_back(defenseSpot[i]);

}
}

所有东西都正确地添加到场景中,但是唯一一个将运行动画的精灵是第一个。我猜测循环没有正确执行,但我不确定如何解决它?

我也试过像这样循环

for(int i = 0;i < 4; i++){
...
}

1 个答案:

答案 0 :(得分:0)

我想通了,我正在使用

auto tapped = touch->getLocationInView(); 

当我应该使用

auto tapped = touch->getLocation();

以防万一有人犯同样的错误。