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 - 在游戏地图上生成对象

暂停和重置游戏 Spritekit / Swift 之间的区别?

随着时间的推移移动游戏对象

基本的 swift/spritekit 游戏 - 麻烦重绘

随着时间的推移旋转游戏对象