改变一个具有物理体的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并不平坦。 它需要在另一个位置上popup而没有动作。

我有同样的问题。 显然你不能明确地设置一个Sprite节点的位置,一旦它有一个PhysicsBody。 我通过暂时删除精灵节点的PhysicsBody来解决它。

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

是的你可以!

我不确定你到底在做什么,在哪里运行这个代码,观察到的效果是什么,你的意思是“无法改变位置”,但是改变一个节点的位置总是起作用的,无论节点是否有一个physicalBody或者不是,以及物理体是dynamic的还是静态的。 我在一个简单的testing项目中validation了这一点,dynamic设置为YES和NO,同时使用位置属性和移动动作。

您可以通过直接设置position属性或使用移动动作来更改节点的位置 – 这两个变体都可以工作。 如果您使用0持续时间进行移动动作,则实际上与设置位置属性相同。

所以,无论你观察的是什么问题,都不是因为一旦拥有一个物理体,你通常不能改变节点的位置。 情况绝非如此。

我猜你可能遇到以下问题之一:

  • 节点已经在运行一个不同的移动动作,覆盖你的位置变化
  • 您正在查看错误的节点(使用日志来validation有问题的节点的实际位置)
  • 您可以在其他位置更改位置,例如每帧设置节点的位置,从而使其他位置更改无效
  • 如果它不是上述之一,那么可能是别的我想不到的…

我有一个像这样的问题,我尝试更新didBeginContact: position didBeginContact: ,但没有任何效果,我认为,因为物理模拟会立即破坏价值。

我的解决scheme是caching我的场景中的一个属性中的新位置,然后更新下一次update:节点的位置update:在我的场景中调用。

[SKAction moveTo:newPosition duration:0.0]也为我工作,没有popup。 我还没有决定哪个更优雅。

我认为你遇到的问题是为了让你控制一个物理学的身体,你需要把它设置为dynamic的。

self.myStar.physicsBody.dynamic = NO;

如果dynamic属性设置为YES ,则物理引擎将控制其运动。

如评论中所述,将dynamic设置为“ NO不应该通过SKAction或position属性来限制移动。 但是,如果设置为YES ,物理引擎中的某些内容可能会影响您尝试移动节点。

如果你想让动作不能popup,那么你需要为你的SKAction设置一个高于零的持续时间,否则它会按照你所描述的那样popup。 将持续时间设置为0.0与仅改变位置相同。

例如 :

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

将在1秒内将节点移动到新的位置。

类似于SKSPriteNode的位置似乎更改为0,0没有任何理由

正如在这个问题的回答和评论中所说的那样,似乎你必须在设置physicsBody之前设置位置,并且/或者在将节点添加到场景之后设置physicsBody。

我在几种情况下遇到了这个问题,而且我还没有发现究竟是什么原因导致它有时会失败。