2016-09-29 68 views
1

我在Sprite Kit和Swift中创建了一个应用程序,并且想要创建一个在屏幕被按下时向上跳跃的Sprite,因此在屏幕被按下时弹跳得更高。我已经达到了这个效果,但物理引擎中的重力直到屏幕释放后才会被应用。因此,跳跃是无限的(按指数规律增长),而不是在某个点上平稳(如二次方程/抛物线)。使用Sprite Kit和Swift跳转

在精灵的运动过程中,人们如何主动应用重力?

这里是我的基本动作代码:

override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 
    // touched is true while screen is touched 
    if touched { 
     nodeLeft.physicsBody?.applyImpulse(CGVector(dx: -5, dy: 0)) 
    } 
} 

注:对象是跳跃的左右而不是上下

回答

3

的比重应不断努力,而且很可能是。然而,当你在每个滴答声上施加一个冲动时,这个力比重力强得多。

你需要做的是减少脉冲随时间的影响。 这可以通过多种方式实现,例如通过使用精灵的位置作为脉冲的基础:精灵位置越高,脉冲越低。

if touched { 
    let minX: CGFloat = 200 // some suitable value 
    let multiplier: CGFloat = 10 
    let force = max(0, (nodeLeft.position.x/minX - 1) * multiplier) 
    nodeLeft.physicsBody?.applyImpulse(CGVector(dx: -force, dy: 0)) 
} 

上述示例中的minX值可能没有意义。但我相信这个逻辑很合理。你显然需要试验和调整这个(和乘数)来满足你的需求。

+0

如果我能吻你,我会的。谢谢你的工作很好 –

+0

哈哈,把你的嘴唇留给自己吧。 :-D很高兴它为你解决,但! –

+1

你也可以在冲动I.e.之间插入时间线。冲动仅适用于屏幕被触摸并且自上次触摸以来经过了一段时间(1秒,5秒,10秒等)。由于update()在被调用时传递当前时间,所以这很容易实现。 –