如何做一个俄罗斯方块5:形状碰撞检测(下)

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

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


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


两侧的碰撞

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


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

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


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


向左移动处理:


左侧的碰撞检测:


向右移动处理:


右侧的碰撞检测:


形状切换时的碰撞


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


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

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

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

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

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


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


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



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



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



切换的碰撞检测计算:



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


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

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


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


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





我是会做游戏也会教你做游戏的小蚂蚁,想学习做游戏的话,关注我的公众号就对啦!

相关文章
|
存储 vr&ar 图形学
法线贴图的视线原理
使用法线贴图可以大大提高渲染效果,使低多边形数的模型看起来具有高多边形数模型的细节和真实感。在游戏开发、电影制作和虚拟现实等领域,法线贴图被广泛应用于增强场景和物体的视觉效果。
150 2
|
3月前
|
图形学
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
|
3月前
|
算法
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
|
3月前
|
图形学
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
|
5月前
|
编解码 算法 程序员
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
|
6月前
俄罗斯方块游戏开发实战教程(5):形状碰撞检测(下)
俄罗斯方块游戏开发实战教程(5):形状碰撞检测(下)
109 1
|
6月前
|
开发工具
俄罗斯方块游戏开发实战教程(4):形状碰撞检测(上)
俄罗斯方块游戏开发实战教程(4):形状碰撞检测(上)
88 1
|
开发工具
如何做一个俄罗斯方块4:形状碰撞检测(上)
在游戏开发中,我们所说的“碰撞”经常指的是物理碰撞,什么是物理碰撞呢?一般的在游戏开发工具中都会包含一个叫做“物理引擎”的东西,它的作用就是在游戏中模拟出现实中的物理效果。例如,我们扔一个东西,这个东西会因为重力而下落,最终落到地上,与地面发生碰撞。在游戏中,我们可以借助物理引擎,来模拟出东西下落掉到地面上的效果。当东西掉到地面上时,我们就说这个东西与地面发生了碰撞。
308 0
|
小程序
如何做一个俄罗斯方块6:形状停靠
在处理形状停靠之前,有一点儿东西需要了解,就是已经停靠的方块和正在下落的方块不是一种方块,如图,红色的表示的是已经停靠的方块,绿色的表示下落的绿色方块的作用是展示当前下落的形状,红色方块的作用是标识出哪些位置已经摆放了方块。
117 0
如何做一个俄罗斯方块3:形状控制
今天,我们来继续学习和实现下一个模块:玩家控制形状。在俄罗斯方块游戏中,玩家可以对下落的形状进行控制,控制分为两种,一种是控制形状的移动(左,右,下),一种是控制形状的旋转(顺时针旋转 90 度)。
129 0