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))
}
3 respuestas
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)
}
}
}
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)
}
}
¿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
.
Nuevas preguntas
ios
iOS es el sistema operativo móvil que se ejecuta en el iPhone, iPod touch y iPad de Apple. Use esta etiqueta [ios] para preguntas relacionadas con la programación en la plataforma iOS. Use las etiquetas relacionadas [Objective-C] y [Swift] para problemas específicos de esos lenguajes de programación.