iOS遊戲開發沒有你想的那麼難–Hardest

發表於2016-06-19

和大家聊聊天

有段日子沒有釋出過任何文字和程式碼了,之前的文章下很多網友留言也沒有回覆,其實每條評論我都有認真看.只是最近整個人有點迷茫,望大家理解.其實我很期盼大家和我聊聊天,但不要總是聊技術…

關於專案(程式碼下載地址在文章最下面點選GitHub連結)

專案說明:考慮到許多不會使用Cocos2D-X和Swift的朋友,此次專案採用Objective-C並且基於UIKit框架實現的.意思就是你會使用UIView,就可以嘗試開發遊戲了,嘿嘿!

原生專案是採用Cocos2D-X開發的,所以在對圖片的動畫處理時,有些地方會沒有原生顯得那麼流暢(如切割圖片,對圖片的變形處理,圖片快速替換等),並且在效能上來說,UIKit也不如Cocos2D-X流暢,畢竟術業有專攻.如果是要開發遊戲來上架的話,最好採用專門的遊戲引擎來搭建專案(Cocos-2D,Unity3D,Sprite Kit等).

開發語言:Objective-C

開發工具:Xcode7.1

編譯環境:大於Xcode7.0

輔助工具:Photoshop CS6

專案講解: 把整個專案用文字帶著大家過一遍有點不現實.這裡我將專案的大體結構和一些主要邏輯,以及主要物件提供的介面功能下面列舉出來.建議同學們先看程式碼,配合程式碼再來看這篇文章,順著程式碼和文字搞懂專案主體邏輯.當需要學習具體功能如何實現時,在看.m檔案下的實現程式碼學習如何實現功能,如果有哪些地方不清楚,在簡書下面留言或者微博留言.

學習建議:最好使用真機來進行執行除錯,有些關卡需要使用加速計與陀螺儀等功能,模擬器是沒有的.當遇到實在無法過去的關卡時,點選首頁的有些手柄按鈕,點選解鎖下一關或者在程式碼啟動時,手動寫入關卡得分資訊即可.

11

Hardest

主體架構

音效和背景音樂

音效和背景音樂採用了AVFoundation框架封裝了一個WNXSoundToolManager的單利物件,背景音樂採用AVAudioPlayer,背景音效採用AudioServicesPlaySystemSound.

提供以下方法和屬性供全域性呼叫或修改,通過修改bgMusicTypesoundType可以控制背景音樂和音效聲音的大小,通過playSoundWithSoundName:方法根據音效名稱設定播放不同的音效.

儲存和讀取玩家關卡記錄(WNXStageInfoManager)

如何持久化儲存玩家過關資訊和每關的得分記錄.本專案採用歸檔和解檔的方案.
拿到WNXStageInfoManager的單例物件,通過呼叫Save和Read方法儲存或讀取關卡資訊,當遊戲關卡進入結算得分控制器後,判斷新記錄是否需要儲存,如果需要呼叫儲存介面.具體實現程式碼請參照WNXStageInfoManager.m檔案

啟動頁動畫

啟動頁動畫是目前App比較常見的功能(順豐優選,順手付,順豐海淘等都有).其實這裡有一種假象,在AppDelegate的didFinishLaunchingWithOptions()方法中,新增一個與啟動圖片完全一樣的AnimVC,將AnimVC設定為keyWindow的rootViewController,在AnimVC的viewDidApper()方法中執行動畫,當動畫完成後通過Block切換keyWindow的rootViewController為首頁VC就OK了.

關於動畫這裡我就不講什麼了,有興趣的朋友可以自己參考工程程式碼研究下.

iOS遊戲開發沒有你想的那麼難–Hardest

啟動頁動畫

首頁(WNXRootViewController)

首頁其實就是一張圖片,通過判斷當前裝置螢幕尺寸,讀取當前裝置尺寸對應按鈕的Plist檔案,拿到首頁6個按鈕位置的Frame,在touchesBegan()方法中,通過CGRectContainsPoint方法判斷當前點選位置時候在指定的Frame內,符合條件時做出對應 的操作,具體程式碼

關卡選擇控制器(WNXSelectStageViewController)

關卡選擇控制器採用UIScrollView實現,在scrollView放入24個WNXStageListView(當然這裡也可以自己建立快取池複用,個人覺得沒必要),每個WNXStageListView都有對應的一個關卡資訊模型stageModel,模型屬性從工程->Resources->Plist->stages.plist檔案中讀取,根據model裡的成員變數,載入關卡對應的資訊,如關卡圖片,是否解鎖,玩家歷史得分以及Rank標記等.

每個WNXStageListView,根據ID設定不同的Tag,並且提供單擊手勢,在stageView的點選事件中.呼叫導航控制器,Push到WNXPrepareViewController控制器,並將選擇關卡的stageModel作為引數傳過去,WNXPrepareViewController做出相應的展示即可.
選擇關卡效果如下圖所示

 

選擇關卡效果圖

關卡準備開始控制器(WNXPrepareViewController)

每個關卡開始遊戲前,都會以動畫的形式出現本關遊戲名稱,過關規則,以及歷史得分等一系列功能.都是由這個控制器完成的.通過選擇關卡時傳入的stageModel,展示model內對應的資料,當使用者點選Play按鈕時,使用WNXGameControllerViewManager單例物件,根據傳入的stageModel,返回對應的關卡ViewController,然後Push到返回的ViewController遊戲關卡即可.

iOS遊戲開發沒有你想的那麼難–Hardest

準備開始控制器效果圖

關卡控制器

24關,每關都有很多重複的功能,這裡我們按照不同關卡的屬性抽取出幾種公共的父類,每個關卡根據自己的需求選擇繼承相應的控制器,並且在ViewDidLoad函式中初始化每個關卡不同的屬性,具體分類效果如下圖所示

14

邏輯圖

WNXBaseGameViewController –> UIViewController

WNXBaseGameViewController是所有關卡ViewController的基類控制器,提供每個遊戲關卡的基本屬性設定,並且每個關卡的初始化操作都封裝在了這裡,每個關卡只需要在自己的ViewDidLoad方法中呼叫buildStageInfo()函式,新增構建自己的UI即可,重寫父類的方法,完成每關不同的操作.

公有屬性

  • WNXGameGuideType guideType每關第一次進入關卡,本關遊戲手勢提示樣式
    • WNXGameGuideTypeNone無提示
    • WNXGameGuideTypeOneFingerClick單個手指頭點選
    • WNXGameGuideTypeReplaceClick左右按鈕交替點選
    • WNXGameGuideTypeMultiPointClick多個手指同時點選

iOS遊戲開發沒有你想的那麼難–Hardest

單個手指頭點選效果

iOS遊戲開發沒有你想的那麼難–Hardest

左右按鈕交替點選效果

iOS遊戲開發沒有你想的那麼難–Hardest

多個手指同時點選效果樣式
  • WNXStage *stage每關關卡資訊model(model詳情)
  • WNXScoreboardType每關計分板樣式
    • WNXScoreboardTypeNone無計分板
    • WNXScoreboardTypeCountPTS
      WNXScoreboardTypeCountPTS
    • WNXScoreboardTypeTimeMS
      WNXScoreboardTypeTimeMS
    • WNXScoreboardTypeSecondAndMS
      WNXScoreboardTypeSecondAndMS

18

WNXScoreboardTypeCountPTS計分板樣式

19

WNXScoreboardTypeTimeMS計分板樣式

20

WNXScoreboardTypeSecondAndMS計分板樣式
  • UIView *countScoreView計分板(考慮有多種樣式,使用了UIView,每個關卡在用的時候根據自己型別進行強制轉換)
  • WNXStateView *stateView關卡提示狀態View
  • UIButton *playAgainButton 重新開始遊戲按鈕
  • UIButton *pauseButton暫停按鈕

公有方法

WNXRYBViewController –> WNXBaseGameViewController

WNXRYBViewController,繼承至WNXBaseGameViewController,底部擁有三個按鈕,並且預設有三條紅黃藍背景條(擁有高亮時圖片),底部按鈕預設Tag為0,1,2,遊戲大部分關卡為這種樣式

公有屬性

公有方法

WNXTwoButtonViewController –> WNXBaseGameViewController

WNXTwoButtonViewController,底部擁有倆個按鈕關卡,並且預設帶有背景ImageView.

公有屬性

公有方法

WNXBackgroundViewController –> WNXBaseGameViewController

只帶有背景圖關卡,專案中有些關卡是採用陀螺儀和加速計的關卡.

關於每一關如何實現,我這裡就不一一列舉了,有點太多了,但是都並不複雜,寫個2~3關基本就能掌握套路了,就個別關卡使用了加速計和陀螺儀,具體實現的程式碼我都在工程中寫的很明白了,在Stage資料夾下,大家自行參考即可.

分數結算控制器(WNXResultViewController)

當每個關卡遊戲結束後,都會進入分數結算控制器,這裡通過在WNXBaseGameViewController中封裝了一個方法以保證每個關卡控制器都可以直接呼叫計算得分,當關卡遊戲結束後,呼叫當前關卡的下面函式即可,這裡小熊偷了個懶,只實現了相加的功能,不過相信通過參考相加的功能,大家實現相減的功能也是小csae啦~

說明下isAddScore的作用

  • 有些關卡是得分越高越好.這總關卡在顯示結果的時候分數是從0一點點網上加的,這種情況isAddScore傳入YES
  • 有些關卡是得分越少越好,這總卡在顯示結果的時候分數是從大網小一點點減少的,這種情況isAddScore傳入NO

當結算分數完成後,會出現以下幾種情況,跟據不同的得分情況執行不同的邏輯即可,具體邏輯如下所示

狀態一: 遊戲失敗(當得分小於等於F,不儲存得分),出現下圖

iOS遊戲開發沒有你想的那麼難–Hardest

得分不夠,顯示失敗

狀態二: 遊戲成功

  • 當前關卡無得分記錄,並且得分大於F,儲存玩家得分,正常顯示得分結果,並且解鎖下一關.

    iOS遊戲開發沒有你想的那麼難–Hardest

    成功狀態1
  • 當前關卡有記錄,但是本次遊戲得分沒有超越歷史記錄,正常顯示得分結果,不儲存本次遊戲得分.

    iOS遊戲開發沒有你想的那麼難–Hardest

    成功狀態2
  • 當前關卡有記錄,並且本次遊戲得分超越歷史記錄,顯示超越歷史得分動畫,並且講本次得分替換掉上一次得分.

    iOS遊戲開發沒有你想的那麼難–Hardest

    成功狀態3

失敗(WNXFailViewController)

部分關卡會有在遊戲中失敗的情況,如下圖

iOS遊戲開發沒有你想的那麼難–Hardest

遊戲失敗

這裡也是在WNXBaseGameViewController中封裝了一個方法,當關卡失敗後,直接呼叫showGameFail()方法,Push到失敗控制器即可.

如果需要失敗時執行一些操作,如停止計時,停止動畫等,在當前關卡重寫showGameFail()方法,在呼叫父類方法前呼叫需要執行的相應程式碼即可,如下

暫停控制器(WNXPauseViewController)

每個遊戲關卡都有暫停的功能,所以將暫停的功能封裝到WNXBaseGameViewController中,並且提供兩個介面供子控制器呼叫,分別為

  • (void)pauseGame; 暫停遊戲
  • (void)continueGame; 繼續遊戲

在每個遊戲關卡重寫上面兩個方法,當玩家點選暫停按鈕時,回撥用暫停方法,點選返回時,會呼叫繼續方法,具體實現如下

iOS遊戲開發沒有你想的那麼難–Hardest

暫停控制器效果圖

專案總結

專案寫的比較匆忙,基本每天晚上抽空寫點,寫完也沒有回頭CodeReview,說實話,這是一個非常非常不好的習慣,大家一定要養成定期回頭看看自己寫過程式碼的習慣.隨著越網後寫,發現前面有很多地方可以修改,我吧有點懶,So你懂的…

感覺光靠文字來講述一個專案實在是太困難.希望大家還是參考工程程式碼,當遇到無法看懂或者不理解的時候參考下我寫的Blog應該會更好一些.這個遊戲專案說實話還是比較簡單的,相信大家仔細研究下都可以實現的.遊戲還有24關,有興趣的同學可以嘗試自己將剩下的24關自己實現下~

有段日子沒使用OC寫專案了,如果有任何建議可在簡書留言,或者私信,或者在微博留言都可以,我都會看的.

這個專案完事後,可能會很長一段時間,不再寫這種大型的開源專案了,因為我個人準備開發一款遊戲上架到AppStore,從設計到UI設計以及需求實現都是我一人完成,工作量比較大.PS(現在連做什麼都不知道呢…).

以後我會分享一些有意思的小功能,小動畫等給大家.希望朋友繼續關注維尼的小熊.

程式碼下載地址(如果覺得有幫助,請點選Star★)

程式碼下載地址,記得Star★和Follow

小熊的技術部落格

點選連結我的部落格,歡迎關注

小熊的新浪微博

我的新浪微博,歡迎關注

本文為作者原著,轉載請註明作者出處,僅供學習交流,嚴禁用於商業用途

相關文章