Swift游戏开发之俄罗斯方块:No.9 添加点击和移动事件

本节内容过后,我们的程序运行起来将是这样的:

我们一步一步来,首先添加点击事件:

接触过iOS开发的应该对这些步骤不陌生,我们要添加UITapGestureDetectorview里面。

打开Main.storyboard,界面应该类似于下面这样

在右下角通过搜索找到 Tap Gesture Recognizer 然后把它拖入到GameViewControllerScene
里面

接下来打开Assistant Editor,界面看起来是这样的:

按住ctrl将Tap Gesture Recognizer 拖入到右侧的GameViewController

确保你的Connection类型是Action,Name 是 didTap, Type为UITapGestureRecognizer, 之后点击connect,在GameViewController类中应该会添加下面的代码:

 

这样当点击事件被识别的时候,这个函数将会被执行。接下来我们在这个界面右键点击Tap Gesture Recognizer,把outlets的delegate赋给Game View Controller 

就像给GameViewController添加swiftris代理一样,我们再添加上手势的代理吧

接下来运行我们的程序,看看点击屏幕以后,我们的俄罗斯方块能不能旋转。我们的程序应该是这样的:

接下来,我们还需要添加两个手势,添加的过程和Tap Gesture
一模一样。

我们先来添加Pan,也就是移动,确保你的didPan函数和下面的一样:

#1 我们定义个panPointReference点来追踪pan手势的位置。

#2 我们把起始点位置记录下来,然后在#3中计算当前的位置有没有和起始点相差绝对值(abs)超过0.9个block,如果超过了,就执行移动命令

#4 可以通过velocityInView来判断手势的方向,正值是向右,负值是向左,然后我们把swiftris向对应的方向移动一格。并且把当前的位置设置成开始的位置,这样确保用户一次可以移动好几格。

但是我在后来玩游戏的过程中发现,很容易移动超过自己想象的位置,而且如果在后面的swipe动作中很容易出发pan,因为0.9个blocksize其实是很小的位置。不过这都不是问题,我们知道了原理,怎样调整就随意了!

接下来运行一下程序,看看是不是我们想象的那样定的吧

接下来我们来完成swipe手势,swipe就是我们移动的时候,方块可以直接快速沿着这个方向移动。重复同样的步骤建立Swipe Gesture Recognizer,name为didSwipe, 需要多一个步骤,如下图所示

确保swipe方向是down

接下来我们开始修改GameViewController

我们重新输入下#1#2中没有显示完全的代码

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer!, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer!) -> Bool {
         return true
     }

// #2
     func gestureRecognizer(gestureRecognizer: UIGestureRecognizer!, shouldBeRequiredToFailByGestureRecognizer otherGestureRecognizer: UIGestureRecognizer!) -> Bool {
         if let swipeRec = gestureRecognizer as? UISwipeGestureRecognizer {
             if let panRec = otherGestureRecognizer as? UIPanGestureRecognizer {
                 return false
             }
         } else if let panRec = gestureRecognizer as? UIPanGestureRecognizer {
             if let tapRec = otherGestureRecognizer as? UITapGestureRecognizer {
                 return true
             }
         }
         return false
     }

#1 部分允许我们的手势同时执行,当然,有些时候我们的手势可能会冲突,所以需要在做些调整

注意到在#2中 如果当前手势是swipe而panRec 手势是otherGestureRecognizer时,在我的代码里面需要return false, 因为我刚开始发现如果是return ture,那么swipe手势一直没法识别,因为它被pan覆盖掉了。而改成false后就正常了。这里算是原版教材俩面的第2
处错误。

大家也可以试试是不是这样的

时间: 2024-11-05 22:48:36

Swift游戏开发之俄罗斯方块:No.9 添加点击和移动事件的相关文章

Swift游戏开发之俄罗斯方块:No.1 建立你的第一个Swift游戏工程

原文地址:https://www.bloc.io/tutorials/swiftris-build-your-first-ios-game-with-swift#!/chapters/677 好了,我们正式开始我们的swift游戏开发! 首先,需要新建一个工程,熟悉iOS开发的童鞋应该对这个步骤不会陌生.我们还是一步一步来吧: 这里有两种途径建立全新的工程,你可以:  如果你的Mac没有运行Xcode,请打开它,然后在欢迎页面点击Create a new Xcode project 这里我还是要

Swift游戏开发之俄罗斯方块:No.0

花了一周时间,按照Swift的开发教程,各种查阅资料,各种google,总算把俄罗斯方块游戏写完了,也想写个系列教学blog:因为虽然看着教程不长,但是对于从零学Swift的我,中间还是遇到了很多困难,好多bug不知道是怎么出来的,都是经过很纠结的过程才一一克服掉的,所以,这篇中文版的系列教学,也算是个为想学swift而又无从下手的童鞋们图个方便吧. 先上一个最终版本,基本效果就是这样,添加了动画效果和音效等等,其实还有很多事情可以做,只要照着这系列的blog进行下去,相信大家最终都创造出有着自

Swift游戏开发之俄罗斯方块:No.2 准备工作

如果你已经成功建好了工程,运行之后你会发现是个小飞机的程序,如果我没记错的: 这个程序是spin-the-bottle:Space Edition,但是可惜的是,我们并不需要这些东西,我们需要一个干净的模板,所以,我们需要首先清理下战场,然后把我们需要用到的一些资源放进来. 打开项目导航栏,如下图中圆圈内的图标,或者点击⌘ + 1: 右键点击GameScene.sks,选择delete 当系统询问的时候,选择move to trash 接下来点击image.xcassets,然后删除spaces

Swift游戏开发之俄罗斯方块:No.8 游戏规则

每个游戏都有它自己的规则,我们的俄罗斯方块的规则很明显,shape落到最底端时就停止下落,然后下一个shape开始往下落:当任一一个点挡住下落的shape时,整个shape就认为是已经到底了:当一行充满所有blocks时,这行消除,然后所有的往下落一行等等等等. 那么我们现在就开始制定我们的游戏规则,本节过后,我们的程序运行起来是这样子的: 我们首先从自定义的协议(protocol)开始,之前我们已经接触过两个swift自带的协议,hashable和printable.我们首先在swiftris

Swift游戏开发之俄罗斯方块:No.4 滴答作响的时钟机制

为什么标题要叫做"滴答作响的时钟机制"呢? 想必我们大家都玩过俄罗斯方块,那些不同形状的东西,就是哪些不同形状,你懂的,会随着游戏级别的提高而下降的越来越快.是的 ,我们也要模仿那样,做出我们自己的时钟机制. 我们可以看到SKScene里面有一个函数update(currentTime: CFTimeInterval). 这个函数被没一帧所调用.帧,frame, 是什么? 你可以理解一帧就是一副静态的图片,如果很多图片在很短的时间内连续播放,就成了动画.当你的眼睛开始去预知每一帧图像的

Swift游戏开发之俄罗斯方块:No.3 二维数组

数组是一个很有用的数据结构,很多程序都建立在数组之上,我很少看到哪个应用程序不用到数组的. 而我们的俄罗斯方块显然也需要数组,而且是更为特殊的  二维数组. 为什么是二维数组呢?其实我们的整个游戏区域,可以看做是一个二维数组区域,就像这样: 我们的每一个block都占据在这样一个20x10的区域之内,20行,10列的一个200个block的二维数组让我们可以根据(x,y)坐标来确定block的位置,而这些blocks其实就是组成我们的L形,或者Z形 等等不同但我们都熟知的俄罗斯方块: swift

Swift游戏开发之俄罗斯方块:No.6 构建形状

The object of art is to give life shape - William Shakespeare 上一章节我们介绍了这个游戏最基本的组成元素,block,那么接下来我们就开始更为清晰和形象地了解如果做出来俄罗斯方块的shape吧.是的,就是这样的形状: 首先我们来新建一个类,名字叫做Shape:到这里新建一个类的步骤应该很熟练了吧. 我们来修改下面的代码 在代码的第一部分,我们先建立了一个枚举类型,这个enumeration用来辅助我们定义我们的shape的4个方向,无

Swift游戏开发之俄罗斯方块:No.5 Block Party

我实在想不出怎么才能起一个好听点的中文名字,还是用原教程中的名字,block party吧 如果前面的几篇教程你觉得很简单,那么是时候开始加深难度了. 在俄罗斯方块游戏中,我们的主体就是那些形状,而每一个形状都是由不同的块组成的.所以,我们需要建立一个基础类,block,用来为我们更上层的显示打基础. 首先,按照建立二维数组array2D的步骤建立一个新的class,起名叫做Block 按照下面修改你的block类 可能你已经猜到了,这不是我们block 类的全部内容. 这部分只是定义了一个en

Swift游戏开发之俄罗斯方块:No.10 最后一步!美化你的程序

好了,本节是我们这系列教程的最后一篇.经过之前的代码磨练,到了最后一步,基本已经没有什么太多的知识点和难点了.最后,我们的程序看起来是非常酷炫的: 从图里可以看到,我们添加了分数和关卡,然后添加了消除方块时的动画效果,其实还有声音.有没有小激动啊,我们这就开始. 首先确保你的属性和图中保持一致. 我们从右下角中找到view,然后把他拖入屏幕中,然后在属性中把它的背景设置成default也就是透明,然后按照图示的坐标和大小设置好 接下来我们拖入进来一个image view,因为这个image是在v