接上文
本節(jié)是這個(gè)系列的最后一節(jié)了。本節(jié)中蝴韭,將增加蛇的方向,增加用戶交互操作熙侍,增加開始暫停等等榄鉴。
1 增加方向
在手機(jī)屏幕上,貪吃蛇的移動方向只有四種蛉抓,上庆尘,下,左芝雪,右减余。我們將這四種方向,定義成一個(gè)枚舉惩系。創(chuàng)建一個(gè)新的文件位岔,Direciton.swift(file->new-file如筛,過程不贅述)。
在Direction.swift中添加如下代碼:
enum Direction {
case UP
case DOWN
case LEFT
case RIGHT
}
之后我們在Snake.swift中添加Direction的擴(kuò)展抒抬,在擴(kuò)展中杨刨,我們定義兩個(gè)函數(shù),walk()和changeDirection()擦剑。分別描述蛇的前進(jìn)和方向的變化妖胀。對于walk函數(shù),傳入的參數(shù)為當(dāng)前蛇頭的坐標(biāo)惠勒,我們根據(jù)當(dāng)前的方向赚抡,修改坐標(biāo)。對于changeDirection函數(shù)纠屋,傳入?yún)?shù)有兩個(gè)涂臣,分別為蛇頭的當(dāng)前坐標(biāo)和用戶的點(diǎn)擊坐標(biāo)(根據(jù)點(diǎn)擊坐標(biāo)決定蛇的新方向),代碼如下:
extension Direction {
func walk(inout point: CGPoint) {
switch self {
case .UP: point.y -= CGFloat(30)
case .DOWN: point.y += CGFloat(30)
case .LEFT: point.x -= CGFloat(30)
case .RIGHT: point.x += CGFloat(30)
}
}
mutating func changeDirection(cur: CGPoint, target: CGPoint) {
switch self {
case .UP: self = cur.x > target.x ? .LEFT : .RIGHT
case .DOWN: self = cur.x > target.x ? .LEFT : .RIGHT
case .LEFT: self = cur.y > target.y ? .UP : .DOWN
case .RIGHT: self = cur.y > target.y ? .UP : .DOWN
}
}
}
之后在Snake中添加對Direction屬性售担,在 weak var mainView: UIView!下面添加如下代碼:
var direction = Direction.RIGHT
然后修改Snake.walk函數(shù)赁遗,刪除原來的代碼,改為如下代碼:
direction.walk(&head.frame.origin)
并在Snake中添加修改方向的操作
func changeDirection(point: CGPoint) {
direction.changeDirection(head.frame.origin, target: point)
}
完成以上操作后族铆,我們還需要添加貪吃蛇吃掉食物的操作岩四。當(dāng)貪吃蛇吃掉一個(gè)食物時(shí),需要增加一段身體哥攘,因此繼續(xù)在Snake中添加如下代碼:
func eat() {
body.addOne(mainView)
}
2 增加用戶交互
有了方向修改操作后剖煌,我們需要用戶通過點(diǎn)擊屏幕來觸發(fā)修改蛇的運(yùn)動方向。在左側(cè)導(dǎo)航欄中點(diǎn)擊Main.storyboard献丑,在右下角的filter中輸入tap末捣,找到Tap Gesture,將其拖到我們的view中创橄。
操作完成后箩做,會在Main.storyboard中出現(xiàn)手勢操作的標(biāo)識,如下:
點(diǎn)擊手勢操作標(biāo)識妥畏,并按住control鍵邦邦,拖動到SnakeViewController的walk后面,Connection選擇action醉蚁,Type選擇UITapGesture...燃辖,Name填寫changeDirection,之后點(diǎn)擊connect如圖所示:
在changeDirection中添加如下代碼:
@IBAction func changeDirection(sender: UITapGestureRecognizer) {
let tapPoint = sender.locationInView(self.view)
snake.changeDirection(tapPoint)
}
之后點(diǎn)擊運(yùn)行网棍,當(dāng)貪吃蛇運(yùn)行過程中黔龟,我們點(diǎn)擊屏幕,可以發(fā)現(xiàn)小蛇根據(jù)我們的點(diǎn)擊位置,自動的改變方向了氏身。
3 增加開始暫停
點(diǎn)擊Main.storyboard巍棱,在右下角的filter中輸入bar button item,找到Bar Button Item蛋欣,拖動到導(dǎo)航欄的左下角位置航徙,如圖:
點(diǎn)擊新的item,在右側(cè)的屬性欄里陷虎,將Title修改為『暫偷教ぃ』
點(diǎn)擊新增加的item button,并按住control鍵尚猿,和上面的操作一樣窝稿,增加pause函數(shù)。當(dāng)用戶點(diǎn)擊暫停時(shí)谊路,我們將當(dāng)前的定時(shí)器暫停讹躯,當(dāng)用戶再次點(diǎn)擊時(shí)恢復(fù)菩彬,并修改title缠劝,代碼如下:
var isPause = false
@IBAction func pause(sender: UIBarButtonItem) {
isPause = !isPause
if (isPause) {
sender.title = "開始"
timer.fireDate = NSDate.distantFuture()
} else {
sender.title = "暫停"
timer.fireDate = NSDate.distantPast()
}
}
點(diǎn)擊左上角的運(yùn)行,我們可以發(fā)現(xiàn)當(dāng)點(diǎn)擊『暫推睿』時(shí)惨恭,小蛇就停住了,再次點(diǎn)擊『開始』時(shí)耙旦,又動了起來脱羡。
4 增加吃食物判斷邏輯
當(dāng)蛇頭的坐標(biāo)和食物的坐標(biāo)相同時(shí),我們判定吃食成功免都,則觸發(fā)兩個(gè)操作锉罐,a 修改食物的坐標(biāo),b 增加蛇的長度绕娘。將SnakeViewController.walk的定義修改成如下代碼:
var score = 0 //記錄分?jǐn)?shù)
func walk() {
if food.frame.origin == snake.head.frame.origin {
food.changeFood(food)
snake.eat()
score += 10
navigationItem.title = String(score)
}
snake.walk()
}
我們同時(shí)增加了一個(gè)計(jì)分操作脓规,如代碼中所示。
點(diǎn)擊左上角的運(yùn)行险领,當(dāng)小蛇完成吃食操作時(shí)侨舆,它的長度增加了。
5 邊界處理
目前為止绢陌,貪吃蛇已基本全部完成了挨下。但是當(dāng)它到了屏幕的邊界時(shí),會繼續(xù)往前脐湾,這樣就脫離我們的視線了臭笆。因此我們增加邏輯,當(dāng)碰觸屏幕邊緣時(shí),修改蛇的坐標(biāo)愁铺,讓它從另一邊重新出現(xiàn)凿菩。在左側(cè)找到ListBodyItem,在SnakeHead中增加touchEdge函數(shù)帜讲,代碼如下:
func touchEdge(){
if (frame.origin.x < 0) {
frame.origin.x = 330
} else if (frame.origin.x > 330) {
frame.origin.x = 0
} else if (frame.origin.y < 60) {
frame.origin.y = 630
} else if (frame.origin.y > 630) {
frame.origin.y = 60
}
}
![snake.gif](http://upload-images.jianshu.io/upload_images/1397675-f0f86b83cf3fcdbf.gif?imageMogr2/auto-orient/strip)
之后在Snake的walk中增加對touchEdge的調(diào)用衅谷,如下:
func walk() {
direction.walk(&head.frame.origin)
head.touchEdge()
}
點(diǎn)擊左上角的運(yùn)行,現(xiàn)在當(dāng)小蛇到達(dá)屏幕邊緣時(shí)似将,會『神奇』的從另一邊出現(xiàn)了获黔。
最終的效果圖:
項(xiàng)目的github如下:
總結(jié):
1 swift蠻好用的
2 iOS做界面開發(fā)的學(xué)習(xí)曲線挺平滑的
3 素材真的很難找,適配屏幕調(diào)整圖片尺寸很費(fèi)勁