各位讀者老爺大家好台丛,由于最近一直比較忙沒什么空挽霉,導(dǎo)致好久沒有更新文章了侠坎,明天有一天假期疫衩,就利用今晚時間和大家聊聊最近剛寫的一個小游戲,由于自己的時間比較少童芹,所以沒有在細(xì)節(jié)上做過多的處理鲤拿,程序還有很多不足的地方假褪,也歡迎大家多多指出或者提出自己的觀點(diǎn)近顷,游戲代碼仍然會在文章結(jié)尾處下載,廢話不多說缀遍,進(jìn)入正題饱须。
Flappy Bird當(dāng)年紅極一時的小游戲蓉媳,想必大家應(yīng)該都玩過,先上一張效果圖
我寫游戲仍然按照自己的一貫風(fēng)格,用最簡單的代碼或者邏輯實(shí)現(xiàn)游戲的主要功能玩荠,因為我的文章主要面向廣大新手,加上自己也是一個初學(xué)者屉凯,主要目的是為了和大家交流經(jīng)驗眼溶。
接下來說一下游戲的幾個主要功能是如何實(shí)現(xiàn)的:
第一步:游戲中的各種動畫的實(shí)現(xiàn) 用到的知識:CADisplayLink定時器,以及控件的frame變化
這里不得不說說我時如何在在storyboard中搭建我的游戲界面的
我用到的游戲素材分別是小鳥灌旧,上方管子枢泰,下方管子铝噩,地面背景,城市草地背景
后面的天空背景是我自己設(shè)置的view的背景色
游戲中看著是小鳥在往右飛毛甲,其實(shí)我設(shè)置的是鳥只是在上下移動,而背景圖片在不停往左移動玻募,那么我是如何實(shí)現(xiàn)的背景圖片在移動呢七咧。
看我的搭建結(jié)構(gòu),大家可以看到我在view中又放了兩個UIView控件艾栋,分別是view1和view2蝗砾,view1的尺寸和屏幕一樣,view2則在view1的右邊緊緊挨著拇泣,也就是說在屏幕外面暫時看不到矮锈,然后兩個都設(shè)置了背景顏色,以及地面背景圖苞笨,城市草地背景圖瀑凝,我能夠讓游戲中的背景一直不停移動原理就是view1和view2以相同速度左移,當(dāng)view1完全移出屏幕的時候谚中,讓它的frame變到view2的正右方,當(dāng)view2移出屏幕的時候就讓其frame變到view1的正右方宪塔,所以這樣就能用兩個view實(shí)現(xiàn)背景的無縫移動囊拜。
鳥和管道我都沒有放到view1和view2中,而是都放到了原有的view中南誊,為的是不讓鳥和view1,view2一起移動抄囚,管子的話倒是無所謂,個人喜好吧怠苔。
同理仪糖,管子也要以和view1,view2一樣的速度左移锅劝,從而實(shí)現(xiàn)一起移動的視覺效果故爵。
注意CADisplayLink的方法大概是每秒調(diào)用60次诬垂,所以方法中每次控件移動的距離設(shè)的盡量小一點(diǎn),這樣不會導(dǎo)致速度移動過快。
說完了背景以及管道的移動再說下小鳥的喉磁,小鳥是要一直讓它的frame的y值一直增加就能實(shí)現(xiàn)下降效果协怒,點(diǎn)擊屏幕鳥的位置向上移動的效果在touchesBegan方法里讓它y值每次增加一些就可以實(shí)現(xiàn)孕暇。
還有就是鳥扇動翅膀的效果芭商,就是兩個圖片不停的切換而已铛楣,動畫效果差不多就這么多了
第二步:死亡條件判定
第一種情況是鳥掉道地上簸州,這種比較簡單,只要鳥的y值加上本身的height大于或等于地面背景的y值就可以判斷
第二種死亡則是鳥碰到管子上搏存,這里稍微復(fù)雜一點(diǎn)點(diǎn)矢洲,就是一個簡單的碰撞檢測
以上方的管子為例,簡單的說也就是鳥的區(qū)域只要和管子的區(qū)域有一點(diǎn)重合就算失敗责静,不理解的話可以看看這一段代碼
if (self.redButton.x + BirdWH >= self.greenView.x && self.redButton.x <= CGRectGetMaxX(self.greenView.frame) && self.redButton.y <= CGRectGetMaxY(self.greenView.frame)) {
[self gameOver];
}
這個管子能明白的話灾螃,下方的管子也肯定能理解揩徊,這就是兩種死亡條件
第三步: 如果讓管子不停顯示,并且長度不一
管子不停顯示和view1熄赡,view2不停顯示道理一樣齿税,就是一走出屏幕左邊就讓它的frame來到屏幕右邊偎窘,至于長度則是每次來到屏幕右邊的時候讓它的height在一定范圍內(nèi)取個隨機(jī)值陌知,這樣看起來就像好多不一樣的管子了,為了追求難道赏参,你們也可以增加管子的數(shù)量以及合理的設(shè)置隨機(jī)長度范圍沿盅,這里要注意,上方的管子只需要改變height就可以腰涧,但下方的height變化后它就不是長在地上的樣子了,所以還要注意再根據(jù)隨機(jī)長度修改y值窖铡,讓管子的根一直扎在地上坊谁。
第四步: 分?jǐn)?shù)顯示
這里我遇到了一個bug滑臊,我一開始在view上放了個label控件準(zhǔn)備顯示分?jǐn)?shù),原理是每一個管子到達(dá)屏幕左邊的時候讓分?jǐn)?shù)加1雇卷,然后每次分?jǐn)?shù)變了的時候游戲就會刷新到開始的樣子,我請教了一下后得知這里涉及到多線程那塊的運(yùn)行循環(huán)的知識小染,等我這里研究研究再來更新,bug沒解決氧映,我試了試手寫代碼產(chǎn)生label脱货,這次沒有出現(xiàn)錯誤,就先用手寫的創(chuàng)建了振峻。
游戲大體上基本就這樣了择份,這和正版游戲的方法肯定有非常多不一樣的地方扣孟,我只是利用有限的知識簡單的實(shí)現(xiàn)了游戲的功能而已荣赶,大家有什么好的建議和想法,歡迎大家積極留言討論拔创。