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


    本文首发于微信公众号:小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。

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

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

    两侧的碰撞

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

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

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

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

    向左移动处理:

    左侧的碰撞检测:

    向右移动处理:

    右侧的碰撞检测:

    形状切换时的碰撞

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

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

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

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

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

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

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

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

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

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

    切换的碰撞检测计算:

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

    其实,前面的三种碰撞检测也都是“预判断”,我们先判断形状下方,左方或者右方是否有碰撞,有的话则不能移动,没有的话则可以移动。
    对于碰撞的检测很像是进行一场演习,如果演习出了问题(发生碰撞),就要立刻停止正式行动,如果演习顺利的话(没有碰撞),再进行正式行动。

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

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


    我是会做游戏也会教你做游戏的小蚂蚁,欢迎关注微信公众号【小蚂蚁教你做游戏】,领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。

  • 相关阅读:
    c2rust简单使用
    Optional详解和常用API
    MacOS Mojave(苹果14系统) v10.14.6中文离线安装包
    K8s复习笔记12--Ingress/Egress实验9则
    Linux 配置Java环境
    云原生K8S精选的分布式可靠的键值存储etcd原理和实践
    容器化部署mariadb数据库
    如何深度清除Mac电脑缓存?高手们也都用最后这种方法
    C#每天复习一个重要小知识day2:有参与无参构造函数
    Word中的图片保存后变模糊怎么解决
  • 原文地址:https://blog.csdn.net/flyhorsejun/article/details/125428368