Estoy tratando de aumentar la dificultad de mi juego aumentando la gravedad a medida que aumenta la puntuación del jugador. No estoy exactamente seguro de cómo implementar eso y como intenté usar la solución aquí: ¿Alguna forma de acelerar el juego gradualmente en Swift?

Sin embargo, no estoy seguro de cómo implementarlo en mi juego para que aumente gradualmente la gravedad

Aquí está mi código:

override func update(_ currentTime: TimeInterval) {
    // Altered the gravity drastically
    // self.physicsWorld.gravity = CGVector(dx: 0, dy: CGFloat(self.score))
}
1
porkchopbento 16 ene. 2018 a las 06:04

3 respuestas

La mejor respuesta

Me mantendría alejado de Timer aquí por algunas razones ... ¿Qué sucede con esa solución si el juego está en pausa (por ejemplo, la escena o la vista está en pausa)? El temporizador continuará ejecutándose cuando ocurran diferentes interrupciones (por ejemplo, una llamada telefónica o que la aplicación esté en segundo plano por cualquier motivo ...). ¿Se detendrá este temporizador automáticamente en esos casos y se reanudará (también automáticamente) cuando la aplicación regrese al primer plano?

La respuesta corta es: "Solo mantente alejado de él y usa SKAction :)"

La respuesta larga es:

El temporizador no hará una pausa / pausa automáticamente. No está emparejado con un bucle de juego como SKAction. Cuando el usuario regrese al juego, en lugar de tener una gravedad como la que tenía antes de la interrupción, la gravedad tendrá un valor inesperado que probablemente creará algunos problemas en su juego. Entonces, como mencioné, necesita una función de pausa personalizada para que una clase Timer maneje estas situaciones. Pero, a diferencia del caso de la clase Timer, todo esto se maneja con SKActions automáticamente.

También puedes usar el método de actualización, pero prefiero las acciones, así que aquí es cómo puedes hacerlo con acciones:

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
Whirlwind 16 ene. 2018 a las 22:24

Programe el temporizador y aumente la gravedad periódicamente de esta manera

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)
    } 
}
1
Yakiv Kovalsky 16 ene. 2018 a las 17:10

¿Por qué no cambiar la gravedad al mismo tiempo que cambia la puntuación? Lo mejor es calcular el nuevo valor de gravedad cuando cambia la puntuación y asignarlo al mundo en didFinishUpdate.

0
Jean-Baptiste Yunès 17 ene. 2018 a las 08:49