俄罗斯方块游戏开发实战教程(5):形状碰撞检测(下)

简介: 俄罗斯方块游戏开发实战教程(5):形状碰撞检测(下)

嗨!大家好,我是小蚂蚁。


今天,我们来继续学习形状碰撞检测的剩余两个部分。


两侧的碰撞

如图,“形状1”不论是向左还是向右移动,只要形状上的任何一个方块两侧有其它的方块,就会发生“碰撞”,此时形状就不能再向左或者右移动。


其实,两侧的碰撞判断跟我们上一节讲过的向下移动的碰撞判断原理是一样的,向下碰撞检测的是每一个方块下方的位置是否有其它方块,那么向左/右碰撞检测的就是每个方块左/右侧的位置是否有其他的方块。

关于什么是计算点,如何获取计算点在数据表格中的行列位置,以及如何遍历当前图形的数据,我们在上一节中已经详细讲过了,这里就不再赘述了。总之,我们从计算点的位置开始,依次的遍历形状上的每一个格子位置,只要有任何一个格子左/右方的数值为 1 ,就证明发生“碰撞”了。


来看一下向左和向右移动的积木逻辑。


向左移动处理:


左侧的碰撞检测:


向右移动处理:


右侧的碰撞检测:


形状切换时的碰撞


接着,我们再来看一下最后的一种碰撞检测:形状切换时的碰撞。


什么是形状切换时的碰撞呢?请看下面这张图。

“形状1”由状态 2 切换到状态 3 时,右侧的方块会覆盖在已有的红色方块上,此时就发生了“碰撞”。在游戏中这种情况是不允许发生的,也就是说,我们需要预先判断将要切换的状态是否会与已有的方块发生“碰撞”,如果是的话,就不允许当前的形状切换状态。

具体的碰撞检测过程是这样的:

首先,获取将要切换的那个状态的形状数据,然后逐个的进行检查,只要有一个方块位置上的数据为 1 ,并且在数据网格中的相同位置的数据也是 1 ,就证明发生了碰撞。

这里的碰撞跟之前讲过的几种碰撞大体流程上是类似的,只不过有两点不同。第一,用于碰撞检测计算的形状数据是下一个状态的形状数据;第二,碰撞检测的位置不是左边,右边或者下边,而是当前方块的位置


接着,来看一下具体的实现。


首先,为形状创建两个变量,一个是“当前状态”,一个是“目标状态”。



然后,来看切换状态的积木逻辑。



最后,来看一下状态碰撞检测积木的逻辑。



切换的碰撞检测计算:



这里重点需要理解的是“预判断”,即我们假设形状切换到了下一个状态,然后使用这个状态的数据进行计算判断,如果有碰撞的话,则不允许当前的形状进行状态切换,如果没有碰撞的话,则允许当前的形状进行状态切换。


其实,前面的三种碰撞检测也都是“预判断”,我们先判断形状下方,左方或者右方是否有碰撞,有的话则不能移动,没有的话则可以移动。

对于碰撞的检测很像是进行一场演习,如果演习出了问题(发生碰撞),就要立刻停止正式行动,如果演习顺利的话(没有碰撞),再进行正式行动。


关于形状碰撞检测的内容很多,所以分了两篇来讲解。这里我只以“形状1”为例进行了讲解,但是在俄罗斯方块游戏中一共是有 7 种形状,对于其它的几种形状,碰撞检测的原理也都是一样的,个别形状稍有差异而已。


碰撞检测的实现方法是多种多样的,甚至是不停变化的,但是其中的原理是不变的,希望你能够理解并掌握其中的原理,这样才能更好的应对变化。


相关文章
|
存储 Cloud Native 安全
阿里云目前优惠券最新种类、金额及使用区别参考
目前阿里云为用户推出了无门槛优惠券,上云抵扣金、算力补贴优惠券、上云礼包等不同种类的优惠券,助力更多用户优惠上云,但是这些优惠券在领取和使用规则上是不同的,本文为大家介绍目前阿里云的各种优惠券领取和使用注意事项,以供大家了解自己能领取或者申请哪些优惠券,在使用过程中需要注意什么。
阿里云目前优惠券最新种类、金额及使用区别参考
|
C++
C++ PCL 沿着自定义的平面做横截面(直通滤波)
C++ PCL 沿着自定义的平面做横截面(直通滤波)
152 0
|
定位技术 C++
C++实现俄罗斯方块(附代码)
C++实现俄罗斯方块(附代码)
C++实现俄罗斯方块(附代码)
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
303 3
|
数据采集 自然语言处理 Python
用 Python 生成并识别图片验证码
用 Python 生成并识别图片验证码
293 1
|
消息中间件 SQL 数据可视化
最接地气的.NET微服务框架 - Wing
最接地气的.NET微服务框架 - Wing
396 0
|
Linux 网络安全 Python
dash-plotly项目
dash-plotly项目
|
JavaScript 前端开发 C++
vscode编辑器中如何调试nextjs代码
代码可调式的重要性不言而喻。 对于Programer来说,自己编写的程序能够被优雅调试是一件幸福的事情,特别是习惯了后端程序调试的开发者... 在折腾Nextjs项目的日子里,我走了很多弯路才弄明白在vs code中如何优雅的调试代码。
1076 1
vscode编辑器中如何调试nextjs代码
|
安全 JavaScript 应用服务中间件
Nginx 跨域解决方案
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器,它允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。 跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是GET以外的 HTTP 请求