【问题标题】:SKSpriteNode with physicsBody auto correct orientationSKSpriteNode 与physicsBody 自动正确方向
【发布时间】:2015-02-06 11:42:42
【问题描述】:

在 Swift SKSpriteNode 发生几次物理碰撞后,它现在不是默认方向后,自动更正其方向的最佳方法是什么?

例如,我有一个 2D 火柴人,他被另一个物体撞到一边,希望火柴人倾斜并重新定位到默认站立位置。

【问题讨论】:

  • 施加角冲量取决于他可能有力量的一侧,或者角色越靠越频繁地施加冲量

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


【解决方案1】:

我过去这样做的方法是等到物理主体静止,关闭火柴人的物理引擎,重新定位火柴人,再次打开物理引擎。

为自己编写一个名为 standupAction 的动作,它可以动画火柴人的重新定向,可能只是旋转或跳跃。然后执行以下操作。

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

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

这种方法的唯一缺点是有时可能需要整整一秒钟才能让火柴人停下来。 Box2d 需要很长时间才能安定下来。但是,如果您等待,它看起来非常现实。

或者,您可以只检查火柴人的方向,如果他偏离平衡 >45 度,然后用冲动重新调整他的方向。当你需要像这样精确的运动时,我发现很难知道要施加多大的力。

【讨论】:

  • 谢谢我没有想到休息的财产!在我的情况下,1 秒不应该是物质等待。
【解决方案2】:

只是为了更新,我无法将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))

            }
        }

【讨论】:

  • Apple's Adventure 不使用物理引擎来计算重力等。当物理体由物理引擎管理时,您手动更改旋转。当物理引擎与您争夺对角色运动的控制权时,这可能会产生故障。我会采用@LearnCocos2D 的原始建议,使用脉冲将其旋转回 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多