我试图通过在玩家的分数上升时增加重力来增加游戏的难度。我不确定如何实现这一点,因为我尝试在此处使用解决方案: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))
}
答案 0 :(得分:1)
由于一些原因,我会远离Timer
。
如果游戏暂停(例如场景或视图暂停),该解决方案会发生什么?当不同的中断发生时,定时器会继续运行(例如,电话呼叫,或者应用程序因任何原因进入后台......)。在这种情况下,此计时器是否会自动暂停,并且当应用程序返回到前台时它是否会(也会自动)取消暂停?
简短的回答是:"只要远离它并使用SKAction:)"
答案很长:
计时器不会自动暂停/取消暂停。它不与像SKAction
这样的游戏循环配对。当用户返回游戏时,重力将具有意想不到的价值,而不是像在中断之前那样具有重力,这可能会使游戏中出现一些混乱。因此,正如我所提到的,您需要Timer类的自定义暂停功能来处理这些情况。但是,与Timer
类的情况不同,所有这些都是SKActions
自动处理的。
您也可以使用更新方法,但我更喜欢操作,因此您可以通过以下操作执行此操作:
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)
}
}
}
答案 1 :(得分:0)
安排计时器,并像这样定期增加重力
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)
}
}
答案 2 :(得分:0)
为什么不在分数改变的同时改变引力?最好是在分数变化时计算新的重力值,并在didFinishUpdate
中将其分配给世界。