各位讀者老爺周末好,這篇文章應(yīng)該在十一假期期間更新,當(dāng)時由于發(fā)了篇Git的簡介,就一直擱置了,今天周六明天不用上課,利用這個時間寫一下,最近學(xué)習(xí)狀態(tài)不佳,覺得不應(yīng)該花費(fèi)過多時間在寫小游戲上面,我得好好學(xué)習(xí)學(xué)習(xí)網(wǎng)絡(luò)多線程了,以后文章會慢慢轉(zhuǎn)向總結(jié)OC中重要的知識點(diǎn),畢竟基礎(chǔ)得打扎實了,這樣以后小游戲才能寫的更順手,程序里主要利用了些些Quartz2D中的基礎(chǔ)知識,難度很適合像我這樣的萌新。廢話不多說,先上效果圖,gif效果顯示可能略卡,實際運(yùn)行效果很流暢,代碼文章結(jié)尾處有下載鏈接。

游戲中PACMAN的移動是通過手指滑動控制的,碰到一個紅色的豆子會把它吃掉,接下來分布介紹下我的的方法:
第一步:如何畫出PACMAN并實現(xiàn)嘴巴一張一合的效果
我是利用drawRect方法繪制的,就是畫了一個3/4的圓弧,然后把一端連到圓心,再通過closePath方法封閉起來就可以,代碼如下
-(void)drawRect:(CGRect)rect
{
CGFloat starA = -M_PI/4 + self.progress * M_PI/4 ;
CGFloat endA = M_PI/4 - self.progress * M_PI/4 ;
CGPoint center = CGPointMake(25 , 25);
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:25 startAngle:starA endAngle:endA clockwise:NO];
[path addLineToPoint:center];
[path closePath];
[[UIColor yellowColor] setFill];
[path fill];
}
起始角度和結(jié)束角度都設(shè)一下,這樣看起來是一個口朝右的PACMAN,progress屬性是為了之后通過改變它的值從而改變扇形的大小。注意在progress的set方法中要調(diào)用setNeedDisplay方法這樣才會更新。
PACMAN畫到一個長寬等于它直徑的view上面(比如叫shapeView)然后把這個view放到viewController的view中去,之后的代碼都在viewController.m中進(jìn)行,之后要做的就是將self.shapeView.progress值周期性從0到1變化,最好不要完全等于1,嘴巴完全合上后圓形會消失,0到0.9不會影響視覺的,這里的周期性變化我用CADisplayLink完成的,時間間隔短用這個動畫看起來流暢,注意因為嘴巴要張合,所以0到1之后還要再到0,然后再到1周期性變化,這個要求怎么實現(xiàn),我用到了這么個方法,這段代碼應(yīng)該不難懂。
static int count = 0;
-(void)change
{
if (count == 20) {
count = 0;
}
if (count < 10) {
self.shapeView.progress += 0.1;
}
if (count >= 10) {
self.shapeView.progress -= 0.1;
}
count ++;
}
好,到這里嘴巴張合的效果就可以實現(xiàn)了。
第二步:PACMAN動起來!
這里我的代碼寫的略顯臃腫,不夠漂亮,我通過滑動手勢的方向,上下左右分別寫了四個方法,然后再設(shè)置第二個CADisplayLink計時器,來實現(xiàn)frame的變化,分別是x值的增加減少和y值的增加減少,每次滑動的時候讓計時器停止然后再執(zhí)行前往將要移動方向的方法即可,我還實現(xiàn)跑出屏幕一端再從另一端進(jìn)入的效果,以往右邊跑為例,只要x值超過了屏幕寬度,再讓它的x值變?yōu)?減去shapeView的寬度的值即可。
這里有個細(xì)節(jié)也是小難點(diǎn)要注意,就是每次移動之后嘴巴的方向也要變化,我用到的方法是每次讓shapeView旋轉(zhuǎn)一定角度,角度的大小由之前的移動方向決定,比如PACMAN正在往右移動的時候,你往上滑動手指,需要讓它往左轉(zhuǎn)90度,如果往左滑手指,需要讓它轉(zhuǎn)180度,依次類推,那么如何知道上次的移動方向是哪里呢,我設(shè)置了一個變量a,往不同的方向移動就給a一個不同的值,這樣每次新的移動之前判斷一下a的值就知道了。我的程序里我初始讓PACMAN默認(rèn)往右跑,所以a是一直有正確的值的。
這一塊大家看下我的代碼理解起來容易些,由于代碼比較臃腫我就不粘貼了
第三步:吃豆子的效果
這一步最為簡單,只要初始的時候默認(rèn)生成一些有顏色的imageView,對它的layer操作下設(shè)置成個圓形即可,然后每次移動的時候判斷下shapeView的center到每個imageView的center的距離小于一定值,就讓imageView消失即可,就 (x2-x1)2 + (y2-y1)2 <= (一定值)2 。我是這么寫的。。
for (UIImageView *imageView in self.pointArray) {
if ((imageView.center.x - self.shapeView.center.x) * (imageView.center.x - self.shapeView.center.x) + (imageView.center.y - self.shapeView.center.y) * (imageView.center.y - self.shapeView.center.y) <= 25*25 ) {
imageView.hidden = YES;
}
}
代碼寫出來之后沒去修改,本菜就寫道這里了,大家下載代碼的話用iphone6模擬器運(yùn)行,里面好多值我直接用數(shù)字寫的,沒做屏幕適配什么的,就為了達(dá)成效果,有興趣的朋友可以設(shè)置下障礙物,分?jǐn)?shù)之類的把這個搞成個小游戲,今天就到這里了,有好的建議或者問題,大家留言討論哦。