swift spritekit 随着游戏时间的推移增加重力?
Posted
技术标签:
【中文标题】swift spritekit 随着游戏时间的推移增加重力?【英文标题】:swift spritekit increase gravity as play time goes? 【发布时间】:2018-01-16 03:04:12 【问题描述】:我试图通过随着玩家得分的增加而增加重力来增加我的游戏难度。我不完全确定如何实现它,当我在这里尝试使用解决方案时:Any way to speed up gameplay gradually in Swift?
但是,我不确定如何在我的游戏中实现它,以便逐渐增加重力
这是我的代码:
override func update(_ currentTime: TimeInterval)
// Altered the gravity drastically
// self.physicsWorld.gravity = CGVector(dx: 0, dy: CGFloat(self.score))
【问题讨论】:
【参考方案1】:由于几个原因,我会远离Timer
这里...
如果游戏暂停(例如场景或视图暂停),该解决方案会发生什么情况?当发生不同的中断时(例如电话,或让应用程序因任何原因进入后台......),计时器是否会继续运行。在这些情况下,这个计时器会自动暂停吗?当应用程序返回前台时它会取消暂停(也自动)吗?
简短的回答是:“远离它并使用 SKAction :)”
长答案是:
计时器不会自动暂停/取消暂停。它不与SKAction
之类的游戏循环配对。当用户返回游戏时,不会像中断前那样具有重力,重力将具有意想不到的值,这可能会在您的游戏中造成一些混乱。因此,正如我所提到的,您需要一个 Timer 类的自定义暂停功能来处理这些情况。但是,与Timer
类不同,所有这些都由SKActions
自动处理。
您也可以使用 update 方法,但我更喜欢操作,因此您可以使用操作来做到这一点:
import SpriteKit
import GameplayKit
class GameScene: SKScene
let kStep:CGFloat = 0.01
let kIncreaseActionKey = "kIncreaseActionkey"
override func sceneDidLoad()
let increase = SKAction.run [unowned self] in
//Optionally, you can check here if you want to increase the gravity further
self.physicsWorld.gravity.dy -= self.kStep
print("Gravity is now \(self.physicsWorld.gravity)")
let wait = SKAction.wait(forDuration: 1)//wait one second before increasing gravity
let sequence = SKAction.sequence([wait, increase])
let loop = SKAction.repeatForever(sequence)
self.run(loop, withKey: kIncreaseActionKey)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
if self.action(forKey: kIncreaseActionKey) != nil
self.removeAction(forKey: kIncreaseActionKey)
【讨论】:
【参考方案2】:像这样定期安排计时器并增加重力
override func didMove(to view: SKView)
let increasingDifficultyPeriod = TimeInterval(60)
Timer.scheduledTimer(withTimeInterval: increasingDifficultyPeriod,
repeats: true)
_ in
// increase currentGravity property here
self.physicsWorld.gravity.dy -= CGFloat(0.1)
【讨论】:
您能向我解释一下 _ in 中发生了什么吗?或者也许是一个指向我可以查找以了解该部分代码的位置的指针?抱歉,我是 swift 新手 这是一个每次定时器触发时执行的块(在这种情况下每 60 秒)。这称为闭包,您可以阅读更多关于此here 的信息。不过,您应该使用SKAction
而不是Timer
来处理这些事情,就像他的回答中提到的@Whirlwind。【参考方案3】:
为什么不在分数变化的同时改变重力?最好是在分数变化时计算新的重力值,并将其分配给didFinishUpdate
中的世界。
【讨论】:
以上是关于swift spritekit 随着游戏时间的推移增加重力?的主要内容,如果未能解决你的问题,请参考以下文章
Swift,SpriteKit:释放游戏场景并重新分配新场景
SpriteKit, Swift 2.0 - 在游戏地图上生成对象