泡泡龙游戏开发系列教程(四)
嗨!大家好,我是小蚂蚁。在上一节中,我们学习了泡泡的发射,移动,反弹和停靠。所有的这些都是以计算的方式来实现的,我们没有选择使用物理,碰撞检测这些方式,因为泡泡龙游戏需要一定的精准性,而通过在每一帧进行计算,可以保证游戏的精准。
上一节中,对于泡泡的停靠,我们使用的方式是在泡泡移动的每一帧,对游戏中的所有泡泡进行一次遍历,判断每一个泡泡与移动的泡泡间的距离,如果距离在碰撞距离之内,则证明发生了碰撞,泡泡停靠。
今天,我们继续来处理泡泡停靠后的一些事情。
如图,红色虚线的泡泡是需要停靠的泡泡,在这 3 个泡泡中,只有中间的泡泡停靠的位置正确,其余的两个泡泡停靠的位置都不对。再次看一下图中的泡泡龙游戏中所有的泡泡的布局,虽然奇数行和偶数行是参差排列的,但是每一个泡泡在整个排列布局中都有一个自己确切的位置。
也就是说,在整个游戏中是不允许泡泡随意的设置自己的位置的,如图的第一个和第三个泡泡那样。我们需要做的是计算出当前的这个将要停靠的泡泡的行列号,然后根据行列号为其设置一个指定的位置。
如何计算要停靠的泡泡的行列号呢?还记得我们在第一节中讲过的吗?根据屏幕上任意一点的位置倒推出当前位置泡泡的行列号。
当泡泡遇到碰撞停止移动后,我们可以根据这个公式推算出当前这个要停靠的泡泡的行列号。
接着,我们来看一下发射泡泡的积木逻辑。
在上一节的积木逻辑上做了一些改动。将“泡泡的碰撞计算”和“行列号的计算”放到了函数中,这样整个逻辑看起来更简洁了。
碰撞检测函数。
行列号计算函数。
在第一节中我们已经详细讲过原理了,这里就不赘述了,忘记的话可以去回顾一下。
在经历过这一系列的处理之后,我们得到了要停靠的泡泡的行号和列号,有了行列号,我们只需要根据行列号在指定的位置创建一个新的泡泡就可以了吧!
且慢,这里还有一种情况需要处理。
如图,我们沿着红色的虚线箭头的方向,发射了一个泡泡,每一帧泡泡都会向前移动一段距离(如果不了解游戏循环中的“帧”,可以看一下这篇文章),碰撞检测计算以及行列号的计算是在每一帧泡泡移动后计算的。假如,泡泡整个移动的过程共包含 4 帧,每一帧移动过后都会进行一次碰撞检测计算,在前 3 帧,都没有计算出碰撞,在第 4 帧,计算出碰撞了,然后泡泡的移动停止,并且以当前的位置(x,y)进行行列号的计算,但是很明显此时计算出的行列号将会和重叠的蓝色泡泡一样,这就造成了一个问题。
根据当前的计算,绿色的泡泡会重叠在蓝色的泡泡之上。但是,它正确的位置应该是在蓝色泡泡的左下方的位置。
我们如何处理这样的问题呢?
首先我们来看一下为什么会发生这样的问题。移动的泡泡每一帧都会有一段向前的位移,假设当前的泡泡是在水平向右移动,第 1 帧位于 (0,0),我们为泡泡设置每一帧移动 10 的距离,那么第 2 帧泡泡就会位于 (10,0) 的位置,接着 (20,0),(30,0)...... 现在假设我在 (15,0) 的位置上有一个泡泡,那么计算出碰撞的时候泡泡其实已经到了 (20,0) 的位置。可见正是因为这个每一帧 10 的间隔, 才导致了这种“跑过头”的情况。如果每一帧泡泡只移动 1 的距离,就不会出现这样情况了。
那是不是我们直接将泡泡每一帧的移动距离设置为 1 就好了。不是,那样泡泡移动的会非常的缓慢。
想要解决这个问题我们需要一个回退的处理。跑过头了没关系,我们向后一点儿一点儿的回退,直到回退到不发生碰撞为止。
如图,如果根据“行列号”的计算结果得出当前要停靠的泡泡与已有的泡泡重叠,那么,我们就让这个要停靠的泡泡不停的一点儿一点儿的回退,直到没有碰撞时为止。此时这个位置就是泡泡要停靠的位置。
我们来看一下回退的积木逻辑。
这里需要注意的是整个回退的计算是在一帧之内执行的,所以这里我们需要使用到逻辑循环积木,结合着上方的图片理解一下这段逻辑,如果位置重叠了,就一点儿一点儿的回退,每回退一点儿都进行一次碰撞计算(可见,整个回退处理包含了大量的计算),直到不发生碰撞,此时的位置就是我们要停靠的泡泡的位置。最后,将位置再次带入计算出行列号。
最后,我们来看一下发射泡泡的所有积木逻辑。
整个逻辑除了处理发射泡泡的移动,反弹,停靠等,其实最重要的就是得到了一个“行号和列号”,我们会在这个行号和列号处克隆一个新的泡泡。至此发射泡泡的使命就完成了,最后我们将其进行删除处理。
最后,我们来预览一下游戏。我为游戏增加了一些素材,看上去是不是有点儿样子了呢!
今天的内容就到这里了,泡泡停靠的计算和处理是泡泡龙游戏中的一个难点。你需要理解游戏中“帧”,对于移动来讲,游戏中的物体是一帧一帧的前进。对于计算来讲,通常是需要在一帧之内进行大量的计算,这里需要额外的注意“重复执行”积木和“逻辑循环”积木的区别。
我是会做游戏也会教你做游戏的小蚂蚁,关注公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。
泡泡龙游戏开发系列教程(四)相关推荐
- unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)
目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 unity2d游戏开发系列教程:三.场景布置,增加怪物和机关 原文下载 ...
- unity2d游戏开发系列教程:三、场景布置,增加怪物和机关
目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 第一节.场景草地布置 先查看一下资源文件里都有什么,一会就要用到的 打开 ...
- unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能
目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...
- HTML5游戏开发系列教程5(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...
- unity2d游戏开发系列教程:一、环境安装
从这篇文章开始,一步一步教大家从0开始通过2DGameKit项目进行2D游戏开发 第一步.环境安装 1.先使用手机下载Unity Connect并注册登陆 2.进入unity官网https://uni ...
- UE4游戏开发系列教程之————world machine地编教程
写在前面,我写这篇教程原因还是今年的年假太长了~~~自己在家闲着无聊,就继续做我"独立3A游戏"的梦.我从一开始的unity3d转战到了UE4.因为Unity3D的表现力实在有待提 ...
- 2d unity 多物体 射线_24小时入门Unity游戏开发系列教程
版权声明: 本系列教程来自Unity Game Development in 24 Hours, Sams Teach Yourself(出版日期:2013年12月6日) 教程内容仅供个人学习参考,版 ...
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(四)-马里奥平移
上一篇博文提到,程序如何获取键盘输入,也就是D键按下,程序获取到前进指令,那么获取到前进指令之后,马里奥是如何前进的呢,这篇文章我们重点讨论这个问题. 马里奥的移动,依旧是在帧刷新函数中,这个调用过程 ...
- [cocos2d-x]游戏开发系列教程-搭建cocos2d-x的windows开发环境
1.在上一篇中我们成功运行了HelloCpp和TestCpp工程,我们到目录cocos2d-x-2.2.1\Debug.win32下 查看生成的文件,在我电脑上绝对路径是H:\source\cocos ...
- cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面
之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE ...
最新文章
- Visual Studio 2017创建XAML文件
- session 安全问题(关闭页面时自动清除session)
- 端口复用和半关闭补充
- WM_PAINT介绍及OnPaint()函数的作用原理
- 吃鸡服务器8月10日维护,《黑潮之上》2021年8月10日不停服维护公告
- BugkuCTF-Reverse题First_Mobile(xman)
- linux mariadb 升级,linux mariadb
- android平台代号、版本、API 级别和 NDK 版本
- C语言 strftime 格式化显示日期时间 时间戳
- [RK3399][Android7.1][Camera]IMX307 mclk 37.125M补丁
- GBASE 8s UDR内存管理_02_mi_dalloc
- mrc mcr 与 bic orr 含义及用法示例
- 解决JBX常见问题最权威的办法(来自borland)
- Sequence Model-week1编程题2-Character level language model【RNN生成恐龙名 LSTM生成莎士比亚风格文字】...
- scrapy安装时遇到问题怎么解决
- 内网通过映射后的公网IP访问内网服务测试--ASA842 hairpin NAT测试
- Day16 GUI编程:贪吃蛇
- 树莓派wifi连接不上咋回事
- 24 个很酷的 Linux/Unix 工具
- 键盘按钮keyCode对照表
热门文章
- css:clac计算
- IOS越狱流程,支持最高IOS12.1.2,包含未签名ipa的安装教程
- 更改itunes备份路径【windows备份iphone数据】
- 难倒高手了,c语言枚举end的作用是什么?
- 网络安全知识竞赛选择题(121-160题)
- 解决0x00000FD:Stack overflow(参数:0x00000000,0x002F2000)栈溢出问题
- 1688如何做视频外链
- 彻底搞懂js中的this指向
- 《史蒂夫·乔布斯传》——童年篇有感
- 数据库实验第七周【集合查询数据更新】