[Swift]捉皮丘Catch Pichu遊戲 #1 Timer, Alert Controller, AVFoundation

[Swift]捉皮丘Catch Pichu遊戲 #1 Timer, Alert Controller, AVFoundation

View ControllerMainVC 首頁GameVC 遊戲頁LeaderboardVC 排名、上次遊戲紀錄Model我先在model設定了每種神奇寶貝應有名稱、點擊得到的分數、及每次出現的時間。

這兩個struct需要conform Equatable之後使用時才可以拿來比較相等或不相等。

官方文件說明:

Types that conform to the Equatable protocol can be compared for equality using the equal-to operator (==) or inequality using the not-equal-to operator (!=)Game Starts遊戲開始會啟動2個timer,都使用scheduledTimer(withTimeInterval interval: TimeInterval, repeats: Bool, block: @escaping (Timer) -> Void) -> Timer

第1個timer用來倒數計時遊戲的時間。時間結束的時候,timer和音樂會停止,也會跳出時間結束的alert。

第2個timer控制畫面顯示神奇寶貝的節奏,並且在時間結束時,所有的神奇寶貝要消失在畫面上,button也無法再點選。

Show Pokemon這是整個結構中最複雜的function。

一次出現幾個神奇寶貝、在哪些空格:我先將所有沒顯示神奇寶貝圖片的button列成array,設定3種神奇寶貝出現的機率,之後用shuffle()重新排序array,隨機決定1到3個空button會顯示神奇寶貝,並使用for in loop來實現顯示神奇寶貝。如果沒有用shuffle(),神奇寶貝永遠都會從第一排開始(按照index的順序)來出現神奇寶貝。

超過7個空格才會出現:這裡有特別設定當空格超過6個時才會出現新的神奇寶貝,避免版面爆滿。如果沒有正確的設定這項條件,可能會出現只有1個空格,卻隨機決定出現3個圖片out of index而crash。

每種神奇寶貝出現的時間長度:使用不repeat的timer,設置個別神奇寶貝多久後要消失。

這邊學到的是,要更改button的image及text要用button.setImage(nil, for: .normal)和button.setTitle(nil, for: .normal),不能像更改imageView的image一樣button.imageView?.image = UIImage(named: )。

Alert Controller在時間倒數完畢的那刻會跳出這個alert,告知使用者遊戲時間結束,並顯示使用者的得分。

按下這個alert的See Result按鈕時,會將最新的遊戲結果及排名儲存到UserDefault,並performSegue進入到排行榜。

Music這裡參考彼得潘的文章,使用AVFoundation來撥放音樂。在遊戲開始時會呼喚這個func。

如果要進階改版,可以讓使用者自行調整音樂的音量、是否播放音樂,並搭配UserDefault來儲存資訊。