前言
分享:心誠求之斤程,雖上中,上遠(yuǎn)矣菩混,未有學(xué)養(yǎng)子而后嫁者也暖释。
時(shí)鐘動(dòng)畫:
又稱逐幀動(dòng)畫袭厂,開發(fā)者需要逐幀計(jì)算每次屏幕刷新時(shí)的圖像位置,相對(duì)性能較低球匕,但是能夠精確控制纹磺。iOS開發(fā)中時(shí)鐘動(dòng)畫實(shí)現(xiàn)通常使用CADisplayLink。本飛機(jī)大戰(zhàn)示例程序參考劉凡的演練實(shí)現(xiàn)亮曹。
飛機(jī)大戰(zhàn)-效果演示
開發(fā)筆記
1. 開發(fā)之前橄杨,要確保開發(fā)代碼的獨(dú)立完整性,可以通過xcode提供的group的方式來實(shí)現(xiàn)照卦,具體請(qǐng)看示例程序
2. 新建項(xiàng)目
1)新建 AirPlayGame 分組式矫,保存游戲相關(guān)的所有代碼和素材
2)新建images.bundle,將其拖拽至分組役耕,并添加啟動(dòng)圖片
3)設(shè)置游戲運(yùn)行方向?yàn)榭v向采转,取消狀態(tài)欄
3. 加載資源視圖和標(biāo)題視圖
1) 創(chuàng)建LoadingView
2) 創(chuàng)建TitleView
1> 使用游戲背景圖片作為標(biāo)題視圖的背景
2> 在屏幕的中心位置顯示Logo圖片
3) 使用后臺(tái)線程加載資源
4) 新建游戲視圖控制器,在顯示標(biāo)題視圖后一秒瞬痘,自動(dòng)進(jìn)入游戲
4. 顯示背景視圖
1) 加載圖片資源
2) 游戲模型對(duì)象故慈,來管理背景圖片的滾動(dòng)位置
增加方法,向下移動(dòng)游戲背景圖片
3) 背景視圖->背景圖片
4) 實(shí)例化游戲模型和背景視圖
5. 英雄戰(zhàn)機(jī)
1) 加載圖片資源
2) 游戲模型對(duì)象框全,管理英雄的位置以及其他...
3) 將英雄添加到游戲視圖
4) 監(jiān)聽視圖的touchMoved事件察绷,更新英雄的模型數(shù)據(jù)中的位置
5) 在step方法中,更新英雄位置
6. 發(fā)射子彈
1) 加載圖片資源
2) 游戲模型對(duì)象津辩,部分存儲(chǔ)在英雄模型中
3) 發(fā)射子彈fire拆撼,每次發(fā)射三顆,添加到bulletSet中
4) 控制器調(diào)用fire方法喘沿,真正發(fā)射子彈闸度,每一顆子彈要建立一個(gè)UIImageView并添加到視圖中
7. 子彈的后續(xù)處理
1) 每次時(shí)鐘觸發(fā)時(shí),更新屏幕上所有子彈的位置蚜印,向屏幕上方移動(dòng)
屏幕上的子彈數(shù)量與hero中的bulletSet中的子彈對(duì)象數(shù)量是上一致的
2) 如果子彈飛出屏幕筋岛,將子彈視圖移除屏幕,從視圖中刪除(需要借助臨時(shí)的set)
3) 如果hero中的bulletSet中包含子彈數(shù)據(jù)晒哄,新建UIImageView添加到視圖中
關(guān)于集合數(shù)據(jù)的處理,需要注意:
在遍歷集合的過程中肪获,不能直接刪除集合中的任何內(nèi)容寝凌,要用臨時(shí)集合處理。
8. 敵機(jī)出動(dòng)
1) 加載敵機(jī)資源孝赫,三類敵機(jī)的大小较木、動(dòng)畫上完全相同
2) 建立敵機(jī)模型,傳入敵機(jī)尺寸青柄,以便計(jì)算敵機(jī)出現(xiàn)的隨機(jī)位置
3) 建立敵機(jī)視圖伐债,傳入enemy對(duì)象和imageRes(單例)簡(jiǎn)化視圖建立
敵機(jī)視圖中直接記錄挨揍和爆炸的圖像數(shù)組预侯,以便后續(xù)處理
4) 擴(kuò)展游戲模型,增加創(chuàng)建敵機(jī)方法峰锁,以便視圖控制器調(diào)用
5) 在時(shí)鐘方法中每秒創(chuàng)建3架小飛機(jī)萎馅,每隔10秒隨機(jī)創(chuàng)建中飛機(jī)或者大飛機(jī)
9. 互毆——碰撞檢測(cè)
1) 子彈擊中敵機(jī)
用子彈的傷害值減敵機(jī)的生命值
1> 如果敵機(jī)的生命值小于等于0,敵機(jī)爆炸
2> 如果大于0虹蒋,顯示挨揍圖片
問題1. 如何做碰撞檢測(cè)糜芳?
使用CGRectIntersectsRect方法可以判斷矩形是否相等
問題2. 當(dāng)飛機(jī)的hp<=0時(shí),如何播放飛機(jī)爆炸效果魄衅?
由于無法準(zhǔn)確地知道序列幀動(dòng)畫何時(shí)完成峭竣,因此上能使用序列幀動(dòng)畫來播放飛機(jī)爆炸的效果
要解決此問題,可以通過逐幀播放來處理
在飛機(jī)模型中增加兩個(gè)屬性
1> toBlowup:需要播放爆炸序列幀標(biāo)示
2> blowupFrames:爆炸序列圖片當(dāng)前播放幀數(shù)
如果幀數(shù)與爆炸數(shù)組中的總數(shù)相等晃虫,將飛機(jī)圖片從視圖和集合中刪除
2) 敵機(jī)撞英雄
一下就死
檢測(cè)完子彈和敵機(jī)碰撞之后皆撩,檢測(cè)敵機(jī)和英雄的碰撞
遍歷敵機(jī)集合,依次與英雄做碰撞檢測(cè)哲银,當(dāng)出現(xiàn)碰撞時(shí)
播放英雄爆炸序列幀動(dòng)畫扛吞,動(dòng)畫完成后,調(diào)用方法關(guān)閉游戲時(shí)鐘盘榨。
10. 界面擴(kuò)展喻粹,增加暫停按鈕和得分標(biāo)簽
1) 增加游戲視圖,作為游戲的容器視圖草巡,以方便游戲界面的調(diào)整
2) 添加暫停按鈕守呜,通過按鈕的tag判斷游戲的運(yùn)行狀態(tài),從而修改按鈕顯示圖標(biāo)山憨,并且開啟或關(guān)閉時(shí)鐘
3) 添加得分標(biāo)簽查乒,在model中,添加score屬性郁竟,飛機(jī)摧毀時(shí)玛迄,修改游戲得分
11. 音效和背景音樂——沒有音樂的游戲,是難以想象的棚亩!
1) 導(dǎo)入AVFoundation和AudioToolBox框架
2) 音效是使用C語言函數(shù)加載的
特點(diǎn):短蓖议,直接播放,上允許中斷
如果重夊建立讥蟆,會(huì)生成多個(gè)SystemSoundId
結(jié)語
本示例程序有大量注釋勒虾,主要思想是我們老生常談的MVC。復(fù)習(xí)一下飛機(jī)大戰(zhàn)示例程序地址瘸彤。