ARTetris-AR版俄罗斯方块的源码解析
一、项目效果
图一
二、项目的框架
三、具体代码解读
从viewDidLoad的方法开始:
一、启动
获取水平面,然后在代理方法func renderer(...)函数里面进行游戏的启动。
从67行代码开始分析:
整个TetrisConfig.swift,就这一段代码,配置图一中的黑色网格井。只是设置了宽和高度。后续可以设置颜色等,可以根据项目需求进行设置。
二、下面对 Tetromino、TetrisState、TetrisWell、TetrisScene、TetrisEngine中的功能进行分析
2.1、Tetromino
FixedTetromino是一个存了8个点的类,奇数位是x坐标,偶数位是y坐标。
上图中的代码20行代表的就是一种方块的形状:例如
图6 然后[20行到23行]有4列,表示图6的4中旋转状态。
2.2、TetrisState
TetrisState指的是俄罗斯方块的形状和位置。这个形状和位置也是依赖FixedTetromino这个类的。
2.3、TetrisWell
TetrisWell指的就是图一 中的那个黑色网状井。这里面的代码设置很有意思。
private var matrix: [[Bool]] = [] //嵌套的数组.具体的我已经写了注释。
主要功能就是:如果为false,指的是当前位置并没有被方块占据。然后通过for循环进行比对来更新matrix数组的值。
2.4、TetrisScene
主要看init 函数和show函数 createWellFrame函数。
在AR的世界里面就是SCNNode节点。
- 在init函数里面创建了图一中黑色网格井的绘制。
- 然后再看show()函数展示第一个随机生成的俄罗斯方块。
2.5、TetrisEngine
TetrisEngine游戏引擎,控制旋转、左右移动等、但是本质都是依赖Tetromino这个类来进行状态的控制。
四、逻辑
- 所有的方块、网格都是SCNNode节点。然后Tetromino这个类储存了方块的形状。TetrisState对Tetromino再次进一步的加深,包含了该方块的位置坐标已经运动的算法。然后具体的算法无非是改变Tetromino里面具体点的值。
- 方块的移动也是改变Tetromino里面具体点的值。然后旋转再图6有讲解
- 关于俄罗斯方块在下移过程中拼接的时候,都是控制TetrisWell中的matrix数组来进行更新,从而控制整个程序中方块的状态。
- 具体的运动和判断就是通过for循环来对比matrix数组来进行更新,然后进行相应的处理,具体的看源码。
五、扩展
AR的特征识别是非常的简单的特征识别。能够识别平面。比如:地板的平面,桌子的平面。但是假设,能在一个复杂的环境下,识别出地面是地面,桌子是桌子,那么就可以利用这个性质做很多有用的功能,;如:室内导航。后续我也打算,集成SLAMORB2进行特征识别,集成到iOS的AR项目中,新的引擎将会很有实际用处。
六、引用
源码地址:https://github.com/exyte/ARTetris
我的注释后的源码地址:https://download.csdn.net/download/yuhui_now/10379609 。为避免版权问题,传的CSDN,若需要可以私信我发邮件给你。