Я пытаюсь определить, какой спрайт был затронут в массиве спрайтов, и когда его коснулось, чтобы запустить анимацию в спрайте, который был затронут. У меня есть все спрайты, размещенные на карте уже, но когда пользователь прикасается к любому другому спрайту, за исключением первого, анимация не запускается. Я использую cocos2dx 3.5. Любая помощь приветствуется.Пытается найти, какой спрайт был нажат в массиве спрайтов onTouchEnded
это мой 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++){
...
}
Я понял, я использовал auto tapped = touch-> getLocationInView(); когда я должен был использовать auto tapped = touch-> getLocation(); –