SpriteKit跳跃和移动问题

时间:2016-12-07 05:48:08

标签: ios swift sprite-kit

我是一个相当新鲜的人,并且一直在玩游戏以获得乐趣,而且我遇到了一些我无法理解的事情。

按下运行按钮时,角色会使用以下功能向前移动

func move(dt: CGFloat) {
  position.x += moveRate * dt
}

按下跳转按钮时,角色会跳转到以下功能

func jump() {
  physicsBody?.applyImpulse(CGVector(dx: 0, dy: jumpRate))
  run(jumpAnimation!)
}

两者都很好,但考虑一下这个情况。玩家正在跑步,然后他们在移动的同时跳跃。在空中,玩家释放移动按钮,玩家的x位置停止。这显然感觉非常不自然,我希望玩家的x位置能够缓和。

现在我也用physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))移动了角色,这会产生这种效果,但他似乎只是获得了越来越多的速度,你不会得到一个恒定的速率或者#34;最高速度"可以这么说。

有人可以与我分享一些见解吗?我一般都喜欢学习关于spritekit和游戏开发的任何东西。谢谢!

2 个答案:

答案 0 :(得分:3)

您应该尝试设置速度而不是设置X位置。设置位置时,您可以绕过所有物理行为 您还应该尝试仅在实际按下按钮时进行设置。

func move(dt: CGFloat) {
    if Math.abs(moveRate) > 0.1 { // If player initiates movement. You can increase the value 0.1 if you want to filter move values
        velocity = CGVector(dx: moveRate, dy: veloxity.dy)
    }
}

你的角色在太空中无限移动,linearDamping会很有用。它用于模拟空气摩擦,因此接近1的值意味着更多的摩擦,接近0的值意味着更小的摩擦。

linearDamping = 0.85

另外,这种方式moveRate不依赖dt,但应该降低。

尝试一下,我还没有测试过它,但这基本上就是我的做法。

答案 1 :(得分:2)

平台游戏和物理学有两种思想流派。

  1. 不要使用物理,用位置递增做所有事情。
  2. 用物理学做所有事情,因为位置变化搞乱了物理学
  3. 既然您正在使用物理跳跃,物理跳跃很有趣:

    在物理系统中创建运动有三种方法:

    1. 根据需要设置速度。这就是Crazyrems的建议
    2. 根据需要施加冲动以增加和减少移动速度
    3. 随着时间的推移施加力量,增加或减少移动速度

    4. 使用字段来诱导动作(对此太复杂,而且很麻烦,但很有趣)

    5. 您尝试的是physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))随着时间的推移而施加的力量。上面列表中的第3个。你继续施加这个力的时间越长,角色移动得越快。

      这些技术中的每一种都可以发挥作用,但它们都需要对其各种限制和模拟方法进行补偿。

      对于您的方法,您需要监控速度并设置最大速度。达到最大速度后,如果玩家仍然按住按钮,则仅提供足够的力来保持速度(假设您使用某种形式的恒定阻力来减慢角色)。

      监控速度与强制超时相结合创造了有趣的加速特性 - 例如非常强的初始加速度,然后随着玩家接近最大速度逐渐减小加速度。

      当玩家释放按钮时减速是下一个焦点。在所有这些方法中,你需要一些能够减慢玩家速度的东西。这可以是物理引擎提供的反向力的应用,或摩擦或阻尼的使用。