Objective C Sprite Kit - невозможно анимировать дочерний узел независимо от родительского узла

Могу ли я в любом случае анимировать дочерний узел независимо от его родителя?

Например

//create parent node
SKNode* parent = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(100,100)];
[myScene addChild:parent];

//create child node (add to parent)
SKNode* child = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(50,50)];
child.position = CGPointMake(0,0);
[parent addChild:child];

//attempt to run action on child
[child runAction:[SKAction moveByX:25 y:25 duration:1.0f]];

Ничего не произошло. Однако, если я запускаю одно и то же действие для родителя, оно работает так, как ожидалось.

Как я могу запустить действие на дочерних узлах независимо от родителя? Это должно быть возможно (например, взмах крыльев у птицы, вращение шин на автомобиле, выпуск шасси самолета и т. д.).

Если это ограничение набора спрайтов, можете ли вы порекомендовать другой фреймворк игрового движка, который не имеет этих ограничений?

ЕДИНСТВЕННЫЙ способ, которым я могу изменить положение узла, - это добавить его непосредственно в сцену. Дочерние узлы не могут быть перемещены. Это огромное ограничение в этой структуре. Очень разочаровывает наверняка.

ОБНОВИТЬ:

Я обнаружил, что если я удалю физическое тело (child.physicsBody = nil), я могу изменить положение (child.position = newPosition), но я не могу запустить действие, которое изменяет положение ([child runAction: [SKAction moveByX:25 y: 25 продолжительность: 1.0f]).

Спасибо!!


person user3335999    schedule 15.12.2014    source источник
comment
Попробуйте установить другой цвет для дочернего узла, чтобы убедиться в этом.   -  person ZeMoon    schedule 15.12.2014
comment
Да, я могу установить дочернему узлу другой цвет. Кроме того, такие действия, как [SKAction hide], работают нормально.   -  person user3335999    schedule 15.12.2014
comment
Итак, вы видели, как действие работает после изменения цвета дочернего узла?   -  person ZeMoon    schedule 15.12.2014
comment
Нет, это не сработало. Я могу изменить цвет, скрыть узел и т. д. Однако я не могу переместить узел, ни установив его положение, ни выполнив действие для перемещения узла. Этот дочерний узел не может быть перемещен. Никаких ошибок, никаких исключений. Любая попытка изменить положение этого дочернего узла приводит к неработоспособности.   -  person user3335999    schedule 15.12.2014
comment
Ваш код не будет компилироваться, потому что вы 1) смешиваете SKNode и SKSpriteNode и 2) отсутствуете ] в ваших вызовах метода UIColor. SpriteKit полностью поддерживает выполнение действий на дочерних узлах. Ваш родительский узел является дочерним элементом сцены.   -  person 0x141E    schedule 15.12.2014
comment
Я исправил опечатку в методе UIColor. Смешение SKNode и SKSpriteNode, что это значит? SKSpriteNode — это SKNode (производный от SKNode). Я согласен с тем, что SpriteKit поддерживает выполнение действий на дочерних узлах. Например, как я уже упоминал, [SKAction hide] отлично работает. Однако я не могу каким-либо образом изменить положение дочернего узла. Например, childNode.position = newPosition; или [childNode runAction:[SKAction moveTo...]. Однако я могу без проблем переместить родительский узел.   -  person user3335999    schedule 16.12.2014
comment
Почему вы назначаете SKSpriteNode SKNode? Если вы это сделаете, у вас не будет доступа к свойствам спрайтов, таким как size и texture. Кстати, я проверил ваш код, и он работает. Дочерний узел перемещается из центра в правый верхний угол своего родителя.   -  person 0x141E    schedule 16.12.2014
comment
Если мне нужна специфическая функциональность узла спрайта, я получу к ней доступ как таковой. Приведенный выше пример был на самом деле просто для того, чтобы дать читателю представление о том, что я делаю. Вы правы, это определенно должно работать. Должно быть, я выявил ошибку в наборе спрайтов, поскольку мой обходной путь ниже не имеет смысла, но заставляет его работать.   -  person user3335999    schedule 17.12.2014


Ответы (1)


Решение:

Если я запускаю ЛЮБОЕ действие с дочерним узлом до того, как добавлю его к родительскому, я могу впоследствии выполнять действия, которые изменяют положение дочернего узла.

Например:

[child runAction:[SKAction waitForDuration:0.0]];

[parent addChild:child];

//some time later...
[child runAction:[SKAction moveByX:25 y:25 duration:1.0f]];

Я понятия не имею, почему это работает, но это работает. Если я НЕ выполняю действие на дочернем узле до того, как добавлю его к родительскому, последующие действия, пытающиеся переместить узел, не будут работать.

person user3335999    schedule 16.12.2014