ios - SpriteKit 跳跃和移动问题

标签 ios swift sprite-kit

我对 swift 还很陌生,并且一直在开发一个有趣的游戏,但我遇到了一些我无法完全理解的事情。

当按下运行按钮时,角色向前移动,具有以下功能

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

并且当按下跳跃按钮时,角色用下面的函数跳跃

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

两者都很好,但请考虑一下这个 senario。玩家正在奔跑,然后他们在移动的同时跳跃。在空中时,玩家松开移动按钮,玩家的 x 位置停止不动。这显然感觉很不自然,我希望玩家的 x 位置缓和一些。

现在我也玩过用 physicsBody?.applyForce(CGVector(dx: 1000, dy: 0)) 移动角色,这会产生那种效果,但他似乎只是获得了更多和速度更快,可以这么说,您不会获得恒定速率或“最大速度”。

有人可以与我分享一些见解吗?我很乐意学习有关 spritekit 和一般游戏开发的任何知识。谢谢!

最佳答案

您应该尝试设置速度而不是设置 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,但应该降低它。


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

关于ios - SpriteKit 跳跃和移动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41010268/

相关文章:

swift - 更改作为 SKSpriteNode 的 SKNode 的纹理

swift - 在 Swift 中终止应用程序时调用函数

ios - 在 iOS 应用程序启动序列中显示/删除启动图像的位置

ios - 使用 UIReferenceLibraryViewController 是否存在内存泄漏?

ios - 如何在 NSUserDefaults 中保存任何类

ios - Coreplot iOS-图形栏之间的自定义空间

c++ - 我可以在同一个 Xcode 项目中拥有 Swift、Objective-C、C 和 C++ 文件吗?

ios - 如何公开提供动态数据但在编译时可访问的 API?

ios - CLLocationManager requestWhenInUseAuthorization() 无法使用 swift 2.0 在 ios7 上工作

ios - 为什么我无法在 Xcode 的连接检查器中删除 UITableViewController 的 'view' 导出?