1. 在Types.swift中通過枚舉定義初始化、開始、游戲中、勝利、失敗、重新加載及暫停
enum GameState:Int {
case initial = 0, start, play, win, lose, reload, pause
}
2. 本教程中的幾種狀態相對簡單,每種狀態都會包含一些label,所以我們在切換狀態時,只需先將原狀態的label移除,再添加新的label即可,移除原狀態的label及添加新狀態的label方法如下(移除的方法就是直接通過text查找到相應的對象并予以移除):
//移除對象
private func remove(message:String) {
childNode(withName: message)?.removeFromParent()
}
//移除原狀態的label
private func clearUI(gameState:GameState){
switch gameState {
case .start:
remove(message: HUDMessages.tapToStart)
case .win:
remove(message: HUDMessages.win)
remove(message: HUDMessages.nextLevel)
case .lose:
remove(message: HUDMessages.lose)
remove(message: HUDMessages.playAgain)
default:
break
}
}
//添加新狀態的label
private func updateUI(gameState:GameState) {
switch gameState {
case .start:
add(message: HUDMessages.tapToStart, position: .zero)
case .win:
add(message: HUDMessages.win, position: .zero)
add(message: HUDMessages.nextLevel,
position: CGPoint(x: 0, y: -100))
case .lose:
add(message: HUDMessages.lose, position: .zero)
add(message: HUDMessages.playAgain, position: CGPoint(x: 0, y: -100))
default:
break
}
}
3. 創建updateGameState的方法切換游戲狀態
func updateGameState(from:GameState, to: GameState) {
clearUI(gameState: from)
updateUI(gameState: to)
}
4. 在GameScene中新建成員變量gameState并初始化為.initial狀態,然后建立監聽機制:
var gameState:GameState = .initial {
didSet {
hud.updateGameState(from: oldValue, to: gameState)
}
}
didSet是在屬性值改變以后執行方法,willSet是在屬性值改變之前執行方法
5. 在游戲開始后,游戲狀態為start,所以需要在didMove中將gameState設置為.start
gameState = .start
6. 本教程中需要完成以下需求:通過點擊屏幕,完成.start ->.play及.lose->.start的切換。倒計時結束后自動完成.play->.lose的切換。
通過點擊屏幕,完成.start ->.play及.lose->.start的切換。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {
return
}
switch gameState {
//start狀態時,點擊屏幕,1.游戲狀態切換為play 2. isPaused狀態變為不暫停,即false 3. startTime初始化為nil 4. elapsedTime初始化為0
case .start:
gameState = .play
isPaused = false
startTime = nil
elapsedTime = 0
//play狀態時,點擊屏幕,player可以移動
case .play:
player.move(target: touch.location(in: self))
//lose狀態時,點擊屏幕,切換為start狀態
case .lose:
gameState = .start
default:
break
}
}
倒計時結束后自動完成.play->.lose的切換。
首先我們需要檢測什么時候狀態滿足lose的條件,即倒計時為0時
滿足條件后將gameSate = .lose即可
func checkEndGame() {
// if bugNode.children.count == 0 {
// gameState = .win
// }
if timeLimit - elapsedTime <= 0 {
gameState = .lose
}
}
因為檢測是實時的,所以將checkEndGame()添加到update方法中。