一步一步教你用Swift开发俄罗斯方块:No.7 下落机制

上一章节我们完成了shape的建立,现在游戏里面的元素(blocks,shapes)都已经完成了,背景也搭好了(array2D),让我们开始制定游戏规则吧。首先就是需要让我们的shape掉下来,还记得我们刚开始的时候每个600毫秒要刷新一下屏幕呢?那会还有一个closure我们都不太明白是干嘛用的,马上就知道了。

好了,今天章节过后,你的程序运行起来应该是这样的:

让我们来修改代码吧,这次要修改的代码比较多,而且没有上一章节那样重复的工作。不用太过担心,我们一步一步来:

#1, 函数在执行时会根据上一章节写的每个不同shape子类的blockRowColumnPosition关系,决定每一个block旋转后的位置。

接下来,我们可以简单地从函数的名字上得出他们的作用,lowerShapeByOneRow, 每次将shape下落一行,而具体如何下落,就看 #2 中的shiftBy函数,这个都很简单,就不用详细解释了。

#3
moveto函数是直接将blocks移动到指定的行和列,为什么有这个函数呢?别急,很快我们就将看到它了

#4 中,我们将随机生成之前建立的7个不同形状的shape中的一个。

接下来,我们需要一个新的类Swiftris来管理游戏的逻辑和进程,比如游戏的初始化,开始,结束等等。建立新的类的步骤就不需要多说了,我们直接来写代码吧

目前看来,我们的swiftris类挺简单的,放心,一会它会变得复杂起来。

我们注意到在swiftris里面我们声明了3个变量,一个是用来表示每个block位置的二维数组blockArray,一个是nextShape,最后是fallingShape,我们可以很容易从名字上得出nextShape就是我们用来预览下一个是什么形状的,玩过俄罗斯方块的童鞋都想起来了吧,而相对应的,fallingShape就是游戏中我们正在操作的shape,我们可以旋转,移动等等来操作它。

接下来init函数我们生成一个20行,10列的二维数组,用来表示blocks的位置。

beginGame中我们随机生成一个shape,用我们shape类中最后写的那个函数,然后把它放在我们制定的位置中。

#2
中,我们有一个函数,返回的值是fallingshape和nextshape,当然fallingshape就是我们之前已经生成的nextshape了,我们用在shape类中新建的movtTo函数把他一到我们的游戏区域的中间,然后生成一个新的nextshape。逻辑上没有问题吧。

OK,逻辑关系处理好了,接下来轮到我们处理视觉上的效果了。终于可以在scene上大展手脚了!

#1, 我们定义了每个block的大小,20x20

#2, 我们定义了一些SKNodes,最下面的是gameLayer,它上一层是shapeLayer,然后是gameBoard

我们来补充下没有显示完全的gameBoard

let gameBoard = SKSpriteNode(texture: gameBoardTexture, size: CGSizeMake(BlockSize * CGFloat(NumColumns), BlockSize * CGFloat(NumRows)))

#3, 不要小看这个函数,这其实是我们整个GameScene中最重要的函数,pointForColumn(int,int) 。他根据column和row来计算每一个block的锚点位置,所以返回的是一个point坐标,只有根据这个坐标,我们才能把每个block放置在shapeLayer上。其实它计算的就是每个block的中心点的坐标。

#4, 我们把新生成的nextShape添加到屏幕中去,注意函数其中的一个参数用的是一个空的闭包,因为函数最后有个添加动作的函数
runAction,它里面有个参数 completion,这里我们用个()->() 闭包还是个占位的,如果有我们就用,没有就空着。和最开始我们接触到的那个tick闭包一样,不过,很快我们就能看到tick不在是一个空的闭包了。这个我们后面会讲到。

这里我们把SKTexture对象存在一个字典里面,因为每一个shape会有很多block,而我们是要重复利用这些image的

#5, 这里我们用到了之前定义的pointForColumn函数精确地每一个block添加到准确的位置,我们是从row-2开始的,这样可以显得我们的动画更加平滑地进入画面中

#6, 我们添加了一组动画,我们让每个block的alpha从0变化到0.7 ,因为这样更容易让用户有一种动画的感觉。关于里面各个参数,以及时间的长短,大家可以自己手动改变一下,然后看看效果上有什么变化。

接下来的两个函数确保同样的SKAction移动和重画不同shape的每一个block

好了,我们的drawing layer已经写好了,我们的逻辑layer也已经搞定了,接下来,让我们用户交互类 GameViewController来把他们两个关联起来吧

#1 我们给我们的tick 闭包设置了一个函数,看,之前我们不能理解的()->() 到这里也能明白了,每当屏幕刷新一下时,我们就执行didTick函数,我们把fallingShape往下移动一行,然后在scene上重新画出来它的形状。

好了,让我们运行下程序,看一看我们的俄罗斯方块下落的动态吧。

时间: 2024-10-25 21:29:29

一步一步教你用Swift开发俄罗斯方块:No.7 下落机制的相关文章

一步一步教你用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.2 准备工作

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

一步一步教你用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.4 滴答作响的时钟机制

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

一步一步教你用Swift开发俄罗斯方块:No.0

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

一步一步教你用Swift开发俄罗斯方块:No.5 Block Party

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

一步一步学习Swift之(一):关于swift与开发环境配置

一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣. 4.Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,它的降临将重新定义软件开发. 5.Swift 是编写 iOS 和 OS X 应用的极佳手段,并将伴随着新的特性和功能持续演进.

教你一步一步部署.net免费空间OpenShift系列之一------帐号注册和验证

前几天有博友发布了一篇文章<一键部署mono 免费空间支持ASP.NET MVC 再也不担心伙食费换空间了>,支持MVC3和域名绑定,觉得不错,于是自己实践了一下,发现自己实际遇到的问题真不少,而且网上的关于此空间的帖子要么千篇一律,要么语焉不详,现总结为图文教程系列 帐号注册和验证 打开https://www.openshift.com/products/pricing,出现三种选择,前2种是免费的,建议选择第二个. 点击Create one跳转到创建用户界面 看到如下信息,填写邮箱和密码,