无法用物理体设置位置

时间:2016-02-18 14:50:45

标签: ios objective-c sprite-kit

我现在已经习惯了这个话题大约三个月了。我认为这只是Apple很快就会解决的一个临时错误,并将其推迟到开发结束。现在我的游戏几乎完成了,我仍然找不到一个好的解决方法:

如果我有一个SKShapeNode并添加一个物理实体,我就不能再使用setPosition:(CGPoint)方法来改变位置了。我的对象始终位于其父视图的(0,0)

我尝试在didSimulatePhysics方法中设置位置,以确保完成所有物理计算。

我尝试使用SKAction移动similar questions here中的节点和其他建议。没有按预期工作。

对我来说,唯一的(种类)工作解决方案是使用此解决方法:

- (void)setPositionWorkaround:(CGPoint)p {
    CGVector vel = self.physicsBody.velocity;
    CGFloat angVel = self.physicsBody.angularVelocity;
    SKPhysicsBody *temp = self.physicsBody;
    self.physicsBody = nil;

    [self setPosition:p];
    [self setPhysicsBody:temp];
    [self.physicsBody setVelocity:vel];
    [self.physicsBody setAngularVelocity:angVel];
}

奇怪的是,这种方法只能工作一次。每次调用此方法时,即使初始调用中没有数据,也会将位置设置为第一个调用参数。我无数次地检查了参数和坐标系。

是否有人遇到同样的问题并找到了可行的解决方案?

1 个答案:

答案 0 :(得分:1)

经过很长一段时间摆弄这个问题,我终于找到了解决方案。

因此,由于SpriteKit上的一个相对较新的更新(3-4个月前),我无法移动任何附加SKNode的{​​{1}}子类。 SKPhysicsBodysetPosition:(CGPoint)position都不起作用。

在我的情况下删除[SKAction move…]并设置位置不起作用,因为出于性能原因我使用的是回收SKPhysicsBody的池。该池虽然没有删除附加的SKShapeNode

所以:如果您遇到此问题,请确保从节点和子节点中删除所有SKPhysicBodies个对象。