嗨!大家好,我是小蚂蚁。在上一节中,我们学习了泡泡的发射,移动,反弹和停靠。所有的这些都是以计算的方式来实现的,我们没有选择使用物理,碰撞检测这些方式,因为泡泡龙游戏需要一定的精准性,而通过在每一帧进行计算,可以保证游戏的精准。

上一节中,对于泡泡的停靠,我们使用的方式是在泡泡移动的每一帧,对游戏中的所有泡泡进行一次遍历,判断每一个泡泡与移动的泡泡间的距离,如果距离在碰撞距离之内,则证明发生了碰撞,泡泡停靠。

今天,我们继续来处理泡泡停靠后的一些事情。

如图,红色虚线的泡泡是需要停靠的泡泡,在这 3 个泡泡中,只有中间的泡泡停靠的位置正确,其余的两个泡泡停靠的位置都不对。再次看一下图中的泡泡龙游戏中所有的泡泡的布局,虽然奇数行和偶数行是参差排列的,但是每一个泡泡在整个排列布局中都有一个自己确切的位置。

也就是说,在整个游戏中是不允许泡泡随意的设置自己的位置的,如图的第一个和第三个泡泡那样。我们需要做的是计算出当前的这个将要停靠的泡泡的行列号,然后根据行列号为其设置一个指定的位置。

如何计算要停靠的泡泡的行列号呢?还记得我们在第一节中讲过的吗?根据屏幕上任意一点的位置倒推出当前位置泡泡的行列号。

当泡泡遇到碰撞停止移动后,我们可以根据这个公式推算出当前这个要停靠的泡泡的行列号

接着,我们来看一下发射泡泡的积木逻辑。

在上一节的积木逻辑上做了一些改动。将“泡泡的碰撞计算”和“行列号的计算”放到了函数中,这样整个逻辑看起来更简洁了。

碰撞检测函数。

行列号计算函数。

在第一节中我们已经详细讲过原理了,这里就不赘述了,忘记的话可以去回顾一下。

在经历过这一系列的处理之后,我们得到了要停靠的泡泡的行号列号,有了行列号,我们只需要根据行列号在指定的位置创建一个新的泡泡就可以了吧!

且慢,这里还有一种情况需要处理。

如图,我们沿着红色的虚线箭头的方向,发射了一个泡泡,每一帧泡泡都会向前移动一段距离(如果不了解游戏循环中的“帧”,可以看一下这篇文章),碰撞检测计算以及行列号的计算是在每一帧泡泡移动后计算的。假如,泡泡整个移动的过程共包含 4 帧,每一帧移动过后都会进行一次碰撞检测计算,在前 3 帧,都没有计算出碰撞,在第 4 帧,计算出碰撞了,然后泡泡的移动停止,并且以当前的位置(x,y)进行行列号的计算,但是很明显此时计算出的行列号将会和重叠的蓝色泡泡一样,这就造成了一个问题。

根据当前的计算,绿色的泡泡会重叠在蓝色的泡泡之上。但是,它正确的位置应该是在蓝色泡泡的左下方的位置。

我们如何处理这样的问题呢?

首先我们来看一下为什么会发生这样的问题。移动的泡泡每一帧都会有一段向前的位移,假设当前的泡泡是在水平向右移动,第 1 帧位于 (0,0),我们为泡泡设置每一帧移动 10 的距离,那么第 2 帧泡泡就会位于 (10,0) 的位置,接着 (20,0),(30,0)...... 现在假设我在 (15,0) 的位置上有一个泡泡,那么计算出碰撞的时候泡泡其实已经到了 (20,0) 的位置。可见正是因为这个每一帧 10 的间隔, 才导致了这种“跑过头”的情况。如果每一帧泡泡只移动 1 的距离,就不会出现这样情况了。

那是不是我们直接将泡泡每一帧的移动距离设置为 1 就好了。不是,那样泡泡移动的会非常的缓慢。

想要解决这个问题我们需要一个回退的处理。跑过头了没关系,我们向后一点儿一点儿的回退,直到回退到不发生碰撞为止。

如图,如果根据“行列号”的计算结果得出当前要停靠的泡泡与已有的泡泡重叠,那么,我们就让这个要停靠的泡泡不停的一点儿一点儿的回退,直到没有碰撞时为止。此时这个位置就是泡泡要停靠的位置。

我们来看一下回退的积木逻辑。

这里需要注意的是整个回退的计算是在一帧之内执行的,所以这里我们需要使用到逻辑循环积木,结合着上方的图片理解一下这段逻辑,如果位置重叠了,就一点儿一点儿的回退,每回退一点儿都进行一次碰撞计算(可见,整个回退处理包含了大量的计算),直到不发生碰撞,此时的位置就是我们要停靠的泡泡的位置。最后,将位置再次带入计算出行列号。

最后,我们来看一下发射泡泡的所有积木逻辑。

整个逻辑除了处理发射泡泡的移动,反弹,停靠等,其实最重要的就是得到了一个“行号和列号”,我们会在这个行号和列号处克隆一个新的泡泡。至此发射泡泡的使命就完成了,最后我们将其进行删除处理。

最后,我们来预览一下游戏。我为游戏增加了一些素材,看上去是不是有点儿样子了呢!

今天的内容就到这里了,泡泡停靠的计算和处理是泡泡龙游戏中的一个难点。你需要理解游戏中“帧”,对于移动来讲,游戏中的物体是一帧一帧的前进。对于计算来讲,通常是需要在一帧之内进行大量的计算,这里需要额外的注意“重复执行”积木和“逻辑循环”积木的区别。


我是会做游戏也会教你做游戏的小蚂蚁,关注公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。

泡泡龙游戏开发系列教程(四)相关推荐

  1. unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)

    目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 unity2d游戏开发系列教程:三.场景布置,增加怪物和机关 原文下载 ...

  2. unity2d游戏开发系列教程:三、场景布置,增加怪物和机关

    目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 第一节.场景草地布置 先查看一下资源文件里都有什么,一会就要用到的 打开 ...

  3. unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能

    目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...

  4. HTML5游戏开发系列教程5(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...

  5. unity2d游戏开发系列教程:一、环境安装

    从这篇文章开始,一步一步教大家从0开始通过2DGameKit项目进行2D游戏开发 第一步.环境安装 1.先使用手机下载Unity Connect并注册登陆 2.进入unity官网https://uni ...

  6. UE4游戏开发系列教程之————world machine地编教程

    写在前面,我写这篇教程原因还是今年的年假太长了~~~自己在家闲着无聊,就继续做我"独立3A游戏"的梦.我从一开始的unity3d转战到了UE4.因为Unity3D的表现力实在有待提 ...

  7. 2d unity 多物体 射线_24小时入门Unity游戏开发系列教程

    版权声明: 本系列教程来自Unity Game Development in 24 Hours, Sams Teach Yourself(出版日期:2013年12月6日) 教程内容仅供个人学习参考,版 ...

  8. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(四)-马里奥平移

    上一篇博文提到,程序如何获取键盘输入,也就是D键按下,程序获取到前进指令,那么获取到前进指令之后,马里奥是如何前进的呢,这篇文章我们重点讨论这个问题. 马里奥的移动,依旧是在帧刷新函数中,这个调用过程 ...

  9. [cocos2d-x]游戏开发系列教程-搭建cocos2d-x的windows开发环境

    1.在上一篇中我们成功运行了HelloCpp和TestCpp工程,我们到目录cocos2d-x-2.2.1\Debug.win32下 查看生成的文件,在我电脑上绝对路径是H:\source\cocos ...

  10. cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面

    之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE ...

最新文章

  1. Visual Studio 2017创建XAML文件
  2. session 安全问题(关闭页面时自动清除session)
  3. 端口复用和半关闭补充
  4. WM_PAINT介绍及OnPaint()函数的作用原理
  5. 吃鸡服务器8月10日维护,《黑潮之上》2021年8月10日不停服维护公告
  6. BugkuCTF-Reverse题First_Mobile(xman)
  7. linux mariadb 升级,linux mariadb
  8. android平台代号、版本、API 级别和 NDK 版本
  9. C语言 strftime 格式化显示日期时间 时间戳
  10. [RK3399][Android7.1][Camera]IMX307 mclk 37.125M补丁
  11. GBASE 8s UDR内存管理_02_mi_dalloc
  12. mrc mcr 与 bic orr 含义及用法示例
  13. 解决JBX常见问题最权威的办法(来自borland)
  14. Sequence Model-week1编程题2-Character level language model【RNN生成恐龙名 LSTM生成莎士比亚风格文字】...
  15. scrapy安装时遇到问题怎么解决
  16. 内网通过映射后的公网IP访问内网服务测试--ASA842 hairpin NAT测试
  17. Day16 GUI编程:贪吃蛇
  18. 树莓派wifi连接不上咋回事
  19. 24 个很酷的 Linux/Unix 工具
  20. 键盘按钮keyCode对照表

热门文章

  1. css:clac计算
  2. IOS越狱流程,支持最高IOS12.1.2,包含未签名ipa的安装教程
  3. 更改itunes备份路径【windows备份iphone数据】
  4. 难倒高手了,c语言枚举end的作用是什么?
  5. 网络安全知识竞赛选择题(121-160题)
  6. 解决0x00000FD:Stack overflow(参数:0x00000000,0x002F2000)栈溢出问题
  7. 1688如何做视频外链
  8. 彻底搞懂js中的this指向
  9. 《史蒂夫·乔布斯传》——童年篇有感
  10. 数据库实验第七周【集合查询数据更新】