一、项目效果

图一


二、项目的框架


三、具体代码解读

从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节点。

  1. 在init函数里面创建了图一中黑色网格井的绘制。
  2. 然后再看show()函数展示第一个随机生成的俄罗斯方块。

2.5、TetrisEngine

TetrisEngine游戏引擎,控制旋转、左右移动等、但是本质都是依赖Tetromino这个类来进行状态的控制。


四、逻辑

  1. 所有的方块、网格都是SCNNode节点。然后Tetromino这个类储存了方块的形状。TetrisState对Tetromino再次进一步的加深,包含了该方块的位置坐标已经运动的算法。然后具体的算法无非是改变Tetromino里面具体点的值。
  2. 方块的移动也是改变Tetromino里面具体点的值。然后旋转再图6有讲解
  3. 关于俄罗斯方块在下移过程中拼接的时候,都是控制TetrisWell中的matrix数组来进行更新,从而控制整个程序中方块的状态。
  4. 具体的运动和判断就是通过for循环来对比matrix数组来进行更新,然后进行相应的处理,具体的看源码。

五、扩展

AR的特征识别是非常的简单的特征识别。能够识别平面。比如:地板的平面,桌子的平面。但是假设,能在一个复杂的环境下,识别出地面是地面,桌子是桌子,那么就可以利用这个性质做很多有用的功能,;如:室内导航。后续我也打算,集成SLAMORB2进行特征识别,集成到iOS的AR项目中,新的引擎将会很有实际用处。


六、引用

源码地址:https://github.com/exyte/ARTetris

我的注释后的源码地址:https://download.csdn.net/download/yuhui_now/10379609 。为避免版权问题,传的CSDN,若需要可以私信我发邮件给你。

转载于:https://www.cnblogs.com/yuhui-snail/p/8964021.html

ARTetris-AR版俄罗斯方块的源码解析相关推荐

  1. 【SpringBoot】最新版2019Spring Boot配置解析,源码解析(速成SpringBoot)——学习笔记版【2】

    SpringBoot配置文件 文章目录 SpringBoot配置文件 四.配置文件 1.简介 2.YAML用法 2.1 简介 2.2语法 3.为属性注入值 3.1使用.yml配置文件 3.1编写.ym ...

  2. BAT高级架构师合力熬夜15天,肝出了这份PDF版《Android百大框架源码解析》,还不快快码住。。。

    前言 为什么要阅读源码? 现在中高级Android岗位面试中,对于各种框架的源码都会刨根问底,从而来判断应试者的业务能力边际所在.但是很多开发者习惯直接搬运,对各种框架的源码都没有过深入研究,在面试时 ...

  3. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  4. abp vnext2.0核心组件之DDD组件之实体结构源码解析

    接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析集合.Net Core3.1,基本环境已经完备, ...

  5. abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析

    老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的D ...

  6. arraylist能否接收强转类型_ArrayList 源码解析

    点击上方"IT牧场",选择"设为星标" 技术干货每日送达! 前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK14已经出来,但是JDK8我还不会, ...

  7. 【Vue.js源码解析 一】-- 响应式原理

    前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:建议通过左侧导航栏进行阅读 课程目标 Vue.js 的静态成员和实例成员初始化过程 首次渲染的过程 数据响应式原理 – 最核心的特性之一 准备工作 ...

  8. netty依赖_Netty系列之源码解析(一)

    接下来的时间灯塔君持续更新Netty系列一共九篇 当前:Netty 源码解析(一)开始 Netty 源码解析(二): Netty 的 Channel Netty 源码解析(三): Netty 的 Fu ...

  9. java arraylist 赋值_ArrayList源码解析,老哥,来一起复习一哈?

    点击上方"码农沉思录",选择"设为星标" 优质文章,及时送达 前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK14已经出来,但是JDK8我还不会 ...

最新文章

  1. hadoop8088端口查看历史打不开,但是在虚拟机上可以打开的解决办法
  2. mysql 开启不严谨模式,mysql – 为什么innodb严格模式无法启用?
  3. linux --开机自动挂载硬盘【转】
  4. 诗与远方:无题(三十一)- 祝我单身
  5. 28.2. AndroidManifest.xml
  6. 用C#实现用免费smtp服务器(GMail)发邮件(转)
  7. IIPP迷你项目(一)“Rock-paper-scissor-lizard-Spock”
  8. vue : 本地调试跨域问题的解决办法:proxyTable
  9. bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会(Trajan)
  10. 计算机原理专科试卷带答案,计算机组成原理专科生期末试卷一
  11. Git与GitHub安装与配置
  12. 9080端口对应服务器文件位置,Filenet更改端口-更改9080 端口到 80 端口
  13. H5调用app原生接口
  14. Redies(一款高性能的数据库)
  15. 搭建FTP资源服务器
  16. 基于分布式认知工业互联网的汽车零部件质量溯源平台
  17. DBeaver 驱动安装
  18. Debian下Apache2安装与设置 一 ZT
  19. 人脸识别 年龄 matlab,基于年龄变化的人脸识别
  20. AppiumLibrary 时间控件的选择

热门文章

  1. 12月数据库榜单,整体排名稳定如昨,Oracle 分数接连下降
  2. android平台java编程规范_Android Java类编写规范+优化建议
  3. qt项目出现c4819错误的解决办法
  4. linux 远程链接数据库报错host *** is not allowed to connect to this mysql server
  5. php 批量删除挂马文件夹,万能删除服务器被挂马后删不掉的文件夹
  6. mysql 在线备份脚本,MySQL备份脚本
  7. java 数据库mysql_java是怎么连接mysql数据库的
  8. kvm上添加万兆网卡_某2节点万兆网卡直连vSAN延伸群集故障修复
  9. mysql结果行数_取得数据库结果集中的行数
  10. 计算机科学讲座的策划书,计算机科学与工学院女生新生讲座策划书.doc