接上文
本节是这个系列的最后一节了。本节中,将增加蛇的方向,增加用户交互操作,增加开始暂停等等。
1 增加方向
在手机屏幕上,贪吃蛇的移动方向只有四种,上,下,左,右。我们将这四种方向,定义成一个枚举。创建一个新的文件,Direciton.swift(file->new-file,过程不赘述)。
在Direction.swift中添加如下代码:
enum Direction {
case UP
case DOWN
case LEFT
case RIGHT
}
之后我们在Snake.swift中添加Direction的扩展,在扩展中,我们定义两个函数,walk()和changeDirection()。分别描述蛇的前进和方向的变化。对于walk函数,传入的参数为当前蛇头的坐标,我们根据当前的方向,修改坐标。对于changeDirection函数,传入参数有两个,分别为蛇头的当前坐标和用户的点击坐标(根据点击坐标决定蛇的新方向),代码如下:
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函数,删除原来的代码,改为如下代码:
direction.walk(&head.frame.origin)
并在Snake中添加修改方向的操作
func changeDirection(point: CGPoint) {
direction.changeDirection(head.frame.origin, target: point)
}
完成以上操作后,我们还需要添加贪吃蛇吃掉食物的操作。当贪吃蛇吃掉一个食物时,需要增加一段身体,因此继续在Snake中添加如下代码:
func eat() {
body.addOne(mainView)
}
2 增加用户交互
有了方向修改操作后,我们需要用户通过点击屏幕来触发修改蛇的运动方向。在左侧导航栏中点击Main.storyboard,在右下角的filter中输入tap,找到Tap Gesture,将其拖到我们的view中。
操作完成后,会在Main.storyboard中出现手势操作的标识,如下:
点击手势操作标识,并按住control键,拖动到SnakeViewController的walk后面,Connection选择action,Type选择UITapGesture...,Name填写changeDirection,之后点击connect如图所示:
在changeDirection中添加如下代码:
@IBAction func changeDirection(sender: UITapGestureRecognizer) {
let tapPoint = sender.locationInView(self.view)
snake.changeDirection(tapPoint)
}
之后点击运行,当贪吃蛇运行过程中,我们点击屏幕,可以发现小蛇根据我们的点击位置,自动的改变方向了。
3 增加开始暂停
点击Main.storyboard,在右下角的filter中输入bar button item,找到Bar Button Item,拖动到导航栏的左下角位置,如图:
点击新的item,在右侧的属性栏里,将Title修改为『暂停』
点击新增加的item button,并按住control键,和上面的操作一样,增加pause函数。当用户点击暂停时,我们将当前的定时器暂停,当用户再次点击时恢复,并修改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()
}
}
点击左上角的运行,我们可以发现当点击『暂停』时,小蛇就停住了,再次点击『开始』时,又动了起来。
4 增加吃食物判断逻辑
当蛇头的坐标和食物的坐标相同时,我们判定吃食成功,则触发两个操作,a 修改食物的坐标,b 增加蛇的长度。将SnakeViewController.walk的定义修改成如下代码:
var score = 0 //记录分数
func walk() {
if food.frame.origin == snake.head.frame.origin {
food.changeFood(food)
snake.eat()
score += 10
navigationItem.title = String(score)
}
snake.walk()
}
我们同时增加了一个计分操作,如代码中所示。
点击左上角的运行,当小蛇完成吃食操作时,它的长度增加了。
5 边界处理
目前为止,贪吃蛇已基本全部完成了。但是当它到了屏幕的边界时,会继续往前,这样就脱离我们的视线了。因此我们增加逻辑,当碰触屏幕边缘时,修改蛇的坐标,让它从另一边重新出现。在左侧找到ListBodyItem,在SnakeHead中增加touchEdge函数,代码如下:
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的调用,如下:
func walk() {
direction.walk(&head.frame.origin)
head.touchEdge()
}
点击左上角的运行,现在当小蛇到达屏幕边缘时,会『神奇』的从另一边出现了。
最终的效果图:
项目的github如下:
总结:
1 swift蛮好用的
2 iOS做界面开发的学习曲线挺平滑的
3 素材真的很难找,适配屏幕调整图片尺寸很费劲