改变一个具有物理体的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。
我在几种情况下遇到了这个问题,而且我还没有发现究竟是什么原因导致它有时会失败。