2018-02-26 游戲中狀態的切換

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方法中。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,841評論 25 708
  • 每一個人來到你的身邊都是你前世的緣分,是你以前種下的因與果善與惡。珍惜遇到的每個人陪你走過的時光,當你懷念青春的時...
    往事如夢之夢閱讀 211評論 0 0
  • 無濾鏡 的東北藍
    張多啦閱讀 249評論 0 0