Как получить позицию CCSprite, добавленную в CCParallaxNode?

У меня есть CCparallaxNodeExtras, который прокручивает бесконечно (после учебника космической игры). В детстве я добавил CCSprite из другого CCSprite, например:

_backgroundNode = CCParallaxNodeExtras::node();
this->addChild(_backgroundNode,-2);

float acum = 0.0;
back1 = CCSprite::create();
for(int i = 0; i < num_repeats; ++i) {
CCSprite *back = CCSprite::createWithSpriteFrameName("rock.png");
back->setPosition(ccp(acum, 0));
back1->addChild(back);
acum+= back->getContentSize().width+150.0;
}

_backgroundNode->addChild(back1,  1 , ccp(0.1,0.1), ccp(0, winSize.height * 0.64));

Теперь в моем обновлении у меня есть это:

CCPoint backgroundScrollVert = ccp(-1024, 0);
_backgroundNode->setPosition(ccpAdd(_backgroundNode->getPosition(), ccpMult(backgroundScrollVert, dt)));

идеально, фон перемещается и исчезает (это то, что я сейчас хочу), но мне нужно получить столкновение между спрайтами на этом фоне и фиксированным спрайтом как дочерним элементом основного узла.

Проблема в том, что всякий раз, когда я пытаюсь получить столкновение простым способом (пересекая ограничивающие рамки), оно не работает, поэтому я пытался просто получить положение спрайтов, и все, что я получаю, это положение, зафиксированное в CCSprite ( back1) состоит из спрайтов (back).

Теперь, есть ли возможный способ получить положение любого отдельного спрайта, расположенного в этом узле параллакса? Если я попробую что-то вроде:

CCSprite *tempsprite = (CCSprite*)_backgroundNode->getChildren()->objectAtIndex(0);
printf("%f\n", tempsprite->getChildren()->objectAtIndex(0)->getPositionX());

он всегда печатает одно и то же значение, как будто на положение не влияет преобразование родителя в фоновом узле … так, как мне получить его правильно? как получить положение относительно экрана, а не по отношению к родителю?

2

Решение

Используйте функцию convertToWorldSpace, чтобы получить позицию в родительском. Если ваши узлы вложены, то вам нужно запросить один за другим.

    CGPoint pos1 = [back1 convertToWorldSpace: back.position];
CGPoint pos2 = [_backgroundNode convertToWorldSpace: pos1];
2

Другие решения

Мне понравилось, и это работает.

float xPosition = _backgroundNode->convertToWorldSpace(sprite->getPosition()).x;

float widthSize = sprite->getContentSize().width;

float heightSize = sprite->getContentSize().height;
1