iOS開發(fā)祈争,分享一個(gè)使用CADisplayLink實(shí)現(xiàn)的仿微信飛機(jī)大戰(zhàn)示例程序OC版

前言

分享:心誠求之斤程,雖上中,上遠(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)-效果演示

airplaneGame.gif

開發(fā)筆記

1. 開發(fā)之前橄杨,要確保開發(fā)代碼的獨(dú)立完整性,可以通過xcode提供的group的方式來實(shí)現(xiàn)照卦,具體請(qǐng)看示例程序

游戲流程圖.png

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)示例程序地址瘸彤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末修然,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愕宋,老刑警劉巖玻靡,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異中贝,居然都是意外死亡囤捻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門雄妥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來最蕾,“玉大人,你說我怎么就攤上這事老厌∥猎颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵枝秤,是天一觀的道長(zhǎng)醋拧。 經(jīng)常有香客問我,道長(zhǎng)淀弹,這世上最難降的妖魔是什么丹壕? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮薇溃,結(jié)果婚禮上菌赖,老公的妹妹穿的比我還像新娘。我一直安慰自己沐序,他們只是感情好琉用,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著策幼,像睡著了一般邑时。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上特姐,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天晶丘,我揣著相機(jī)與錄音,去河邊找鬼唐含。 笑死浅浮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捷枯。 我是一名探鬼主播滚秩,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铜靶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤争剿,失蹤者是張志新(化名)和其女友劉穎已艰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚕苇,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哩掺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涩笤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚼吞。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹬碧,靈堂內(nèi)的尸體忽然破棺而出舱禽,到底是詐尸還是另有隱情,我是刑警寧澤恩沽,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布誊稚,位于F島的核電站,受9級(jí)特大地震影響罗心,放射性物質(zhì)發(fā)生泄漏里伯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一渤闷、第九天 我趴在偏房一處隱蔽的房頂上張望疾瓮。 院中可真熱鬧,春花似錦飒箭、人聲如沸狼电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漫萄。三九已至,卻和暖如春盈匾,著一層夾襖步出監(jiān)牢的瞬間腾务,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工削饵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岩瘦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓窿撬,卻偏偏與公主長(zhǎng)得像启昧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劈伴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,117評(píng)論 25 707
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,374評(píng)論 7 249
  • 滿懷期待過年新啼,如果一切正常發(fā)展,應(yīng)該是如此刹碾≡镒玻可是事情總是偏不如我意。 除夕迷帜,朋友家團(tuán)年后物舒,我?guī)〉幕丶椅缢瞎?..
    牛錘錘閱讀 165評(píng)論 0 0
  • 連續(xù)一個(gè)多月戏锹,每天都是凌晨一點(diǎn)以后休息冠胯,各種學(xué)習(xí)與總結(jié)應(yīng)接不暇,實(shí)在不舍得停下來…終于在早上景用,老婆爆發(fā)了涵叮,她應(yīng)該是...
    承謙閱讀 1,202評(píng)論 0 1
  • 天氣預(yù)報(bào)最準(zhǔn)時(shí)的一個(gè)月莫過于三四月了。即使全月都被標(biāo)上“雨”的符號(hào)伞插,大部分不會(huì)有偏差割粮。三月迎來了南方特有的雨季。春...
    叁菇?jīng)?/span>閱讀 250評(píng)論 0 1