Cocos2d-x: convertToWorldSpace дает неправильное положение узла

у меня тут путаница у меня такая иерархия спрайтов

MasterSprite
           | -------- SpriteContainer 
                               | ---------------------SpriteNode1

Мне нравится преобразовывать позицию SpriteNode1 в мировую позицию (не уверен в этом), то есть позиция SpriteNode1 будет такой, какой она была, если бы она была дочерним элементом MasterSprite (это мировая позиция?).
я пробовал:

Vec2 newPos = MasterSprite->convertToNodeSpace(SpriteNode1->getPosition());
Vec2 newPos2 = MasterSprite->convertToWorldSpace(SpriteNode1->getPosition());
Vec2 newPos3 = MasterSprite->convertToNodeSpaceAR(SpriteNode1->getPosition());
Vec2 newPos4 = MasterSprite->convertToWorldSpaceAR(SpriteNode1->getPosition());

но никто не дал мне правильное положение. что я делаю неправильно здесь?


person user63898    schedule 16.07.2014    source источник
comment
MasterSprite.позиция? convertToWorldSpace должен работать, но это даст вам не позицию мастер-спрайта, а позицию мастер-спрайта плюс позицию контейнера спрайтов плюс позицию spritenode1. Непонятно, что вы подразумеваете под правильной позицией.   -  person LearnCocos2D    schedule 16.07.2014
comment
Решение, если кто-то ищет: не нашел никакого объяснения логики, но вот как это делается SpriteContainer->convertToWorldSpace(SpriteNode1->getPosition());   -  person user63898    schedule 16.07.2014


Ответы (2)


Как я понимаю это прямо сейчас, так это то, что пространство узла является локальным для этого узла, а мировое пространство является глобальным пространством (но не обязательно пространством экрана из-за 3D-камер или чего-то еще).

Поэтому, если вы хотите получить положение позиции одного узла относительно другого, вы сначала преобразуете положение этого узла в мировое пространство, используя его родителя, а затем используя convertToNodeSpace другого целевого родителя.

Итак, если вам нужна глобализированная позиция узла,

Vec2 node_space_pos = my_node->getPosition(); //this is the node's node-space position
Vec2 world_space_pos = my_node->getParent()->convertToWorldSpace(node_space);

затем в корневой сцене или в том, что имеет отношение к вам, вы должны взять мировое пространство/универсальные координаты и преобразовать их в локальное пространство корневого узла:

Vec2 root_local_pos = root_scene->convertToNodeSpace(world_space_pos);
my_node->removeFromParent();
root_scene->addChild(my_node);
my_node->setPosition(root_local_pos);

Теперь my_node все еще находится в той же самой позиции на экране, но теперь это дочерний элемент корневой сцены, а не где-то еще на графике, где он был раньше.

person TankorSmash    schedule 20.01.2018

Как правило, вы можете получить позицию узла в WorldSpace, используя

auto pos = node->getParent()->convertToWorldSpace(node->getPosition());

person GaloisPlusPlus    schedule 29.12.2015