2018-02-26 游戲中狀態(tài)的切換

1. 在Types.swift中通過枚舉定義初始化、開始、游戲中、勝利、失敗、重新加載及暫停

enum GameState:Int {
    
    case initial = 0, start, play, win, lose, reload, pause
    
}

2. 本教程中的幾種狀態(tài)相對簡單,每種狀態(tài)都會包含一些label,所以我們在切換狀態(tài)時,只需先將原狀態(tài)的label移除,再添加新的label即可,移除原狀態(tài)的label及添加新狀態(tài)的label方法如下(移除的方法就是直接通過text查找到相應(yīng)的對象并予以移除):

    //移除對象
    private func remove(message:String) {
        
        childNode(withName: message)?.removeFromParent()
        
    }
    
    //移除原狀態(tài)的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
        }
    }
    
    //添加新狀態(tài)的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. 創(chuàng)建updateGameState的方法切換游戲狀態(tài)

    func updateGameState(from:GameState, to: GameState) {
        
        clearUI(gameState: from)
        
        updateUI(gameState: to)
        
    }

4. 在GameScene中新建成員變量gameState并初始化為.initial狀態(tài),然后建立監(jiān)聽機制:

    var gameState:GameState = .initial {
        
        didSet {
            hud.updateGameState(from: oldValue, to: gameState)
        }
        
    }

didSet是在屬性值改變以后執(zhí)行方法,willSet是在屬性值改變之前執(zhí)行方法

5. 在游戲開始后,游戲狀態(tài)為start,所以需要在didMove中將gameState設(shè)置為.start

gameState = .start

6. 本教程中需要完成以下需求:通過點擊屏幕,完成.start ->.play及.lose->.start的切換。倒計時結(jié)束后自動完成.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狀態(tài)時,點擊屏幕,1.游戲狀態(tài)切換為play 2. isPaused狀態(tài)變?yōu)椴粫和?,即false  3. startTime初始化為nil 4. elapsedTime初始化為0
        case .start:
            
            gameState = .play
            
            isPaused = false
            
            startTime = nil
            
            elapsedTime = 0
         
        //play狀態(tài)時,點擊屏幕,player可以移動
        case .play:
            
            player.move(target: touch.location(in: self))
        
        //lose狀態(tài)時,點擊屏幕,切換為start狀態(tài)
        case .lose:
            
            gameState = .start

            
        default:
            break
        }
        

    }

倒計時結(jié)束后自動完成.play->.lose的切換。

首先我們需要檢測什么時候狀態(tài)滿足lose的條件,即倒計時為0時
滿足條件后將gameSate = .lose即可

    func checkEndGame() {
//        if bugNode.children.count == 0 {
//            gameState = .win
//        }
        if timeLimit - elapsedTime <= 0 {
            gameState = .lose
        }
    }

因為檢測是實時的,所以將checkEndGame()添加到update方法中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,828評論 25 709
  • 每一個人來到你的身邊都是你前世的緣分,是你以前種下的因與果善與惡。珍惜遇到的每個人陪你走過的時光,當(dāng)你懷念青春的時...
    往事如夢之夢閱讀 229評論 0 0
  • 無濾鏡 的東北藍
    張多啦閱讀 278評論 0 0

友情鏈接更多精彩內(nèi)容