带有physicsBody的SKSpriteNode自动正确方向

时间:2015-02-06 11:42:43

标签: swift sprite-kit game-physics skspritenode skphysicsbody

什么是使Swift SKSpriteNode在有几次物理实体敲击并且现在不处于默认方向后自动纠正其方向的最佳方法?

例如,我有一个2D棍子男子被另一个物体撞到一边,并希望棍子人倾斜并重新定位到默认的站立姿势。

2 个答案:

答案 0 :(得分:1)

我过去这样做的方法是等到物理机构停下来,为火柴人关闭物理引擎,重新调整火柴人,重新打开物理引擎。

给自己写一个名为standupAction的动作,它可以激活火柴人的重定向,也许只是旋转或跳跃。然后执行以下操作。

对不起,这个Objective-C不是Swift,不太懂,但应该很容易翻译。

if (stickman.physicsBody.resting) {
    stickman.physicsBody.dynamic = NO;
    [stickman runAction:[SKAction sequence:@[
              standupAction,
              [SKAction runBlock:^{ stickman.physicsBody.dynamic = YES;}]
              ]]];
}

这种方法唯一的缺点是,有时它可能需要一整秒,直到火柴人来休息。 Box2d需要相当长的时间才能安定下来。但是如果你等待它看起来很现实。

或者,你可以检查一下火柴人的方向,如果他是> 45度失去平衡,那么用冲动重新定位他。当你需要这样的精确运动时,我发现冲动很难知道要施加多大的力。

答案 1 :(得分:0)

为了更新,我无法承受将physicsBody设置为不动态。

我的场景更新每个节点,类似于Apple的冒险游戏,因此我在子类SKSpriteNode的更新方法中实现了旋转:

if (isTouchingGround) {
            if self.zRotation != 0 && !rotating {
                let actions = [
                    SKAction.runBlock {
                        self.rotating = true
                    },
                    SKAction.rotateToAngle(0, duration: 1.0),
                    SKAction.runBlock {
                        self.rotating = false
                    }]
                runAction(SKAction.sequence(actions))

            }
        }