2016-12-07 89 views
1

我对swift相当陌生,并且一直致力于开发一款游戏以获得乐趣,并且我遇到了一些无法摆脱困境的东西。SpriteKit跳跃和移动问题

当按下运行按钮,字符用下面的函数

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))这个效果,但他似乎只是获得了越来越多的速度,而且你没有得到恒定的速度或“最大速度”这么说。

有人能跟我分享一些见解吗?我很想学习一些关于spritekit和游戏开发的知识。谢谢!

+2

从我所看到的,在使用力量的同时手动改变位置的方式从未奏效。尝试只使用力量或通过影响其位置属性来改变节点的位置。另外,在update:method,每一帧内都应该调用施加的力(与applyImpulse方法不同)。 – Whirlwind

+1

即使直接改变速度矢量,同时使用力量和冲动将会很好地发挥,所以也许你可以玩... – Whirlwind

+0

一直玩的物理bodyBody更多的所有对象。它似乎很挑剔,但我用'applyForce'和'applyImpluse'创造了一个更好的结果。 “直接改变速度矢量”是什么意思? –

回答

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依赖,但它应该降低。


试试吧,我还没有测试它尚未,但基本上我会怎么做。

2

有关平台游戏“物理学”的两种思想流派。

  1. 不要使用物理,所有的位置增量。
  2. 做物理学的一切,因为位置的变化搞乱了物理

由于您使用的物理跳跃和物理跳跃的乐趣:

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

  1. 根据需要设置速度。这是Crazyrems是在暗示
  2. 根据需要增加或减少运动的速度
  3. 施加力随着时间的推移增加或减少运动的速率

  4. 使用领域诱发运动(这个太复杂应用的冲动,和凌乱,但有趣)

你试图,你的physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))是随着时间的推移应用武力。上面列表中的数字3。你继续使用这个力量的时间越长,角色移动得越快。

可以使这些技术中的每一种都可以工作,但它们都需要补偿它们各种限制和仿真方法。

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

监控速度结合强制结束时间创造了有趣的加速特性可能性 - 就像非常强大的初始加速度,然后随着玩家接近其最大速度逐渐减小加速度。

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