Изменить позицию SKSpriteNode с физическим

Я не могу изменить положение SKSpriteNode, изменив

self.position = newPosition;

Это больше не работает, если у него есть физическое устройство.

Обходной путь, который я получил, это:

    self.myStar.physicsBody = nil;

    [self.myStar changePosition];

    self.myStar.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.myStar.size.width/2];

или

    [self runAction:[SKAction moveTo:newPosiion duration:0.0]];

Но # 2 не является гладким. Он должен появиться на другой позиции без движущегося действия.

Ответ 1

У меня была та же проблема. По-видимому, вы не можете явно задать позицию спрайта node после того, как у него есть PhysicalBody. Я решил его, временно удалив спрайт node PhysicsBody.

CGFloat yPosition = 400.f;
SKPhysicsBody* goldfishPhysicsBody = _goldfish.physicsBody;
_goldfish.physicsBody = nil;
_goldfish.position = CGPointMake(_goldfish.position.x, yPosition);
_goldfish.physicsBody = goldfishPhysicsBody;

Ответ 2

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

self.myStar.physicsBody.dynamic = NO;

Если для свойства dynamic установлено значение YES, то физический движок контролирует его перемещение.

Как отмечено в комментариях, установка dynamic в NO не должна ограничивать перемещение через свойство SKAction или position. Однако, если он установлен на YES, возможно, что что-то в механизме физики влияет на вашу попытку перемещения node.

Если вы хотите, чтобы движение не появилось, вам нужно установить длительность выше нуля на ваш SKAction или он появится, как вы описали. Длительность установки до 0.0 такая же, как только изменение положения.

Например:

[self runAction:[SKAction moveTo:newPosition duration:1.0]];

переместит node в новую позицию за 1 секунду.

Ответ 3

Да, вы можете!

Я не уверен, что именно вы делаете, и где именно вы запускаете этот код и что наблюдаемый эффект означает, что вы подразумеваете под "не может изменить положение", но изменение позиции node всегда работает, независимо от того, node имеет физическое тело или нет, и является ли физическое тело динамическим или статическим. Я проверил это в простом тестовом проекте с динамическим набором как YES, так и NO, с типами тела круга и края, используя как свойство position, так и действия перемещения.

Вы можете изменить позицию node либо путем установки свойства position напрямую, либо с помощью действия перемещения - оба варианта работают. Если для действия перемещения используется длительность 0, она фактически становится такой же, как установка свойства position.

Итак, независимо от того, что вы наблюдаете, это не потому, что вы обычно не можете изменить позицию node, если у нее есть физика. Это абсолютно не так.

Я предполагаю, что вы столкнулись с одной из следующих проблем:

  • node уже запускает другое действие перемещения, переопределяя ваши изменения позиции
  • Вы искали неправильный node (используйте журналы, чтобы проверить фактическое положение рассматриваемого node)
  • вы меняете положение в другом месте, например, устанавливая позицию node для каждого кадра, тем самым аннулируя любое другое изменение позиции
  • Если это не одно из вышеуказанных, то, возможно, что-то еще, о чем я не мог думать...

Ответ 4

У меня возникла такая проблема, когда я попытался обновить position внутри didBeginContact:, но это не имело никакого эффекта, я думаю, потому что физическое моделирование сразу же захватывает значение.

Моим решением было кэшировать новую позицию в свойстве на моей сцене, а затем обновить позицию node в следующий раз, когда на моей сцене вызывается update:.

[SKAction moveTo:newPosition duration:0.0] работал у меня тоже, и не было никакого выскакивания. Я еще не решил, что более элегантно.

Ответ 5

Похоже на Позиция SKSPriteNode изменяется на 0,0 без причины

Как указано в ответе и комментариях к этому вопросу, кажется, вы должны либо установить позицию, прежде чем устанавливать физическое устройство и/или установить физическое устройство после добавления node в свою сцену.

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