前天犯賤登錄了騙子的蘋果ID, 結(jié)果自己的ipad被騙子遠(yuǎn)程鎖定了, 如今變磚頭, 心情很down, 故參考網(wǎng)友的思路自己手?jǐn)]一個(gè)貪食蛇(簡(jiǎn)直班門弄斧).
先上游戲效果圖如下, 界面和諾基亞時(shí)代的貪食蛇差不多:
這里簡(jiǎn)單說下思路, 文章最后貼上我的源碼github下載地址, 有興趣的大兄弟可以下來看看, 本人最高才玩了52分.
首先我們用OC來寫貪食蛇, 那么思想就是要面向?qū)ο蟮? 這里有幾個(gè)主要的類: 蛇, 蛇行走的背景view, 蛇的節(jié)點(diǎn), 還有控制器. 我們就是在這4個(gè)類里面操作.
蛇(Snake): 它是由節(jié)點(diǎn)(Node)組成, 那么用一個(gè)數(shù)組來保存一條蛇的所有節(jié)點(diǎn). 蛇有很多行為(方法), 包括出生(初始化), 吃東西, 長(zhǎng)大, 行走, 停下來.
節(jié)點(diǎn)(Node): 一個(gè)節(jié)點(diǎn)的位置由它的中心點(diǎn)坐標(biāo)來決定, 所以節(jié)點(diǎn)類有一個(gè)centerPoint屬性, 傳入這個(gè)屬性可以創(chuàng)建一個(gè)節(jié)點(diǎn).
如何把蛇創(chuàng)建在界面上
一開始肯定是想著創(chuàng)建image view來表示每個(gè)節(jié)點(diǎn), 那么一條蛇就由好幾個(gè)image view組成, 但是蛇吃東西后會(huì)不斷變長(zhǎng), 最后可能要?jiǎng)?chuàng)建好多個(gè)image view. 我們知道, 在界面上創(chuàng)建過多的控件是影響性能的, 所以我選擇用 Quartz2D 繪圖的方式把蛇繪制出來, 也就是把節(jié)點(diǎn)數(shù)組里面的每個(gè)節(jié)點(diǎn)繪制出來.
如何實(shí)現(xiàn)蛇的行走
一條蛇的位置是由一個(gè)節(jié)點(diǎn)數(shù)組來決定, 數(shù)組的第一個(gè)元素代表蛇頭, 數(shù)組的最后一個(gè)元素代表蛇尾. 讓一條蛇移動(dòng), 其實(shí)就是把節(jié)點(diǎn)數(shù)組的最后一個(gè)節(jié)點(diǎn)元素從數(shù)組中移除, 改一下它的中心點(diǎn)坐標(biāo)為蛇頭節(jié)點(diǎn)的坐標(biāo)再遠(yuǎn)一個(gè)單元格, 接著把這個(gè)節(jié)點(diǎn)放進(jìn)數(shù)組的第0位, 也就是放在原來的蛇頭節(jié)點(diǎn)前面, 讓它變成蛇頭. 然后用一個(gè)repeat為YES的定時(shí)器NSTimer, 不斷的把蛇尾節(jié)點(diǎn)放到蛇頭節(jié)點(diǎn)前面, 然后不斷重繪(手動(dòng)調(diào)用setNeedDisplay方法來觸發(fā)draw rect:方法).
PS: 繪圖操作寫在draw rect:方法里面, 系統(tǒng)會(huì)默認(rèn)調(diào)用一次. 當(dāng)我們手動(dòng)調(diào)用setNeedDisplay方法后會(huì)自動(dòng)再次觸發(fā)draw rect方法.
如何控制蛇的前進(jìn)方向
我用一個(gè)枚舉屬性來記錄蛇的方向,
當(dāng)蛇的方向向上, 節(jié)點(diǎn)的坐標(biāo)x不變, y減一個(gè)單元格;
當(dāng)蛇的方向向下, 節(jié)點(diǎn)的坐標(biāo)x不變, y加一個(gè)單元格;
當(dāng)蛇的方向向左, 節(jié)點(diǎn)的坐標(biāo)x減一個(gè)單元格, y不變;
當(dāng)蛇的方向向右, 節(jié)點(diǎn)的坐標(biāo)x加一個(gè)單元格, y不變.
如何創(chuàng)建食物
食物直接用一個(gè)image view來表示即可, 創(chuàng)建時(shí)候它的坐標(biāo)隨機(jī), 但是要注意要控制食物不能創(chuàng)建在蛇身上.
蛇吃食物的過程
當(dāng)蛇頭的坐標(biāo)等于食物的坐標(biāo), 表示蛇吃了食物, 這時(shí)候要做3件事:
1.重新隨機(jī)位置創(chuàng)建食物.
2.蛇要往蛇尾方向變長(zhǎng)一格: 前面說了, 蛇移動(dòng)時(shí)候我要把節(jié)點(diǎn)數(shù)組最后一個(gè)節(jié)點(diǎn)移除取出來. 在我把節(jié)點(diǎn)數(shù)組中的蛇尾節(jié)點(diǎn)從數(shù)組中移除的時(shí)候, 注意!這個(gè)位置是沒有節(jié)點(diǎn)了,當(dāng)蛇吃了食物后, 我們創(chuàng)建一個(gè)新的節(jié)點(diǎn), 放在這個(gè)位置, 就可以實(shí)現(xiàn)蛇變長(zhǎng)了一格. 所以需要用屬性保存記錄一下這個(gè)蛇尾節(jié)點(diǎn)的原坐標(biāo)lastPoint, 吃到食物后用這個(gè)坐標(biāo)創(chuàng)建一個(gè)新的節(jié)點(diǎn)放在這里.
3.分?jǐn)?shù)+1.
核心的思路已經(jīng)說完了, 剩下的就是自己在邊敲代碼過程中邊修正一些細(xì)節(jié)的業(yè)務(wù)邏輯, 比如蛇頭碰到邊界或者碰到自己就會(huì)game over.
該demo只實(shí)現(xiàn)了最原始的貪食蛇, 還可以不斷的豐富和優(yōu)化它的功能和玩法的, 這個(gè)以后再慢慢弄了.
demo的源碼下載地址如下, 裝在自己的手機(jī)里玩玩還是有那么一點(diǎn)無(wú)聊的:
https://github.com/imbawales/Hungry-Snake
最后良心建議, 千萬(wàn)不要在自己的蘋果設(shè)備上登錄別人的蘋果ID, 以及自己的蘋果ID一定要上官網(wǎng)弄2級(jí)保護(hù)防止被盜.