嗨!大家好,我是小蚂蚁。今天我们来继续了解在泡泡龙游戏中,泡泡是如何发射,移动,反弹和停靠的。
这一节里会涉及到比较多的数学运算,不过完全不用担心,试着找一张纸和一支笔,画一画,很容易理解的。
如何处理泡泡的发射
在泡泡龙游戏中,当我们点击屏幕上的一点时,发射器中的泡泡会向我们点击的那个位置发射。想要实现这样的功能,我们就必须要知道当前点击的屏幕位置位于要发射的泡泡的哪个方向,也就说我们需要计算出泡泡的发射角度。
我们来看图片,一个点是要发射的泡泡的位置(x0,y0),一个点是屏幕点击位置(x1,y1),现在已知这两个点的位置,我们需要计算出一个角度 A,也就是泡泡发射的角度。这里计算角度 A,使用了三角函数中正切函数,对照着右侧的图片和计算公式可以回忆一下那些曾经学过的数学知识。
在小游戏制作工具中运算类别中的一个积木块为我们提供了用于计算角度A的方法。
具体的泡泡发射角度的计算,只需要像下面这样就可以了。
刚才我们所计算的情况是点击屏幕的位置位于要发射的泡泡的右侧,接着来看一下当点击位置位于泡泡的左侧时,该怎么计算?
如图,点击位置位于泡泡左侧,我们需要计算的是绿色的旋转角度,此时如果我们仍然使用上方的计算公式,那么计算出的就是左侧的角度A,但此时这个角度A是个负数(很显然此时 x1-x0 是个负数),想要得到右侧的旋转角度,只需要将计算得到的 -A 加上 180度即可。
在小游戏制作工具中的移动方向(也叫旋转角度)指的是以水平向右为 0 度,然后逆时针旋转指定的度数,此时这个方向就是要移动的方向。
最后,看一下关于旋转角度计算的积木逻辑。
实话讲,当点击屏幕左侧这个加上180度的计算,我在做的时候是完全靠猜的,点击右侧是比较直观的,但是点击左侧的时候就看不出来了,但是我知道的是一定是某一个值(90?180?270?360?)的加减,所以就挨个尝试,试到 180 的时候就试出来了。所以你看到的上方的分析图,完全属于事后分析。在游戏开发的过程中,一时想不出来并不要紧,我们笨人也是有方法的,这个方式就是猜测加不断尝试。
如何处理泡泡的移动和反弹
泡泡的移动比较简单,我们直接在循环中不停的让它前向移动即可。
对于泡泡碰到两侧墙面的反弹,就又需要计算了。
如图,是泡泡碰到右侧或左侧反弹后移动角度的计算,是的,这个公式我又是靠猜的,所以这里不进行事后分析了,反正就是那几个特殊的角度数值,不是加就是减,挨个尝试总能试出来的。
最后,来看一下发射的泡泡的积木逻辑。
预览一下,看看泡泡发射移动和反弹的效果。
如何处理泡泡的停靠
如果说上方的这些发射,移动,反弹都属于开胃小菜的话,那么我们接下来要上正餐了,请集中你的注意力,跟上文章的思路。
在泡泡的发射,移动和反弹的过程中,我们全部使用的是实时的计算来实现的,没有使用反弹,物理移动等方式。为什么呢?因为对于泡泡龙这个游戏来说,是需要非常精准的,泡泡碰到墙壁后一定会反弹,泡泡碰到任何一个其它的泡泡时,一定会停靠,这其中不允许有失误(见过有泡泡龙游戏泡泡碰到墙壁后没有反弹而是飞出去的吗?),但是物理碰撞和物理移动是有可能有失误状况出现的,所以我们直接放弃了使用物理移动和碰撞检测,而是全部都采用实时计算的方式,因为这种方式不会出现失误。
对于泡泡的停靠,我们仍然是需要使用实时的计算方式,来算出泡泡在何时进行停靠。
如图,蓝色的泡泡被发射出去了,它会沿着发射的方向一直移动,直到它碰到任何一个其它的泡泡时停止。
其实,使用碰撞检测是最简单的方式,检测一下这个飞行的泡泡,只要它碰到其它的任何一个泡泡,就让它停止。但是,我们上方说过,碰撞检测并不能保证精准,可能会出现下面这样的问题。
这种情况在游戏里是不允许发生的,我们不能让一个泡泡穿透到另一个泡泡的里面。
为了保证碰撞的精准,就需要使用实时的计算来把两个球是否相碰给算出来。
如图,这就是计算两个泡泡是否碰上的方法,我们只需要计算当前两个泡泡之间的距离,然后判断这个距离是否在碰撞距离之内,如果是的话,就可以说这两个泡泡碰上了。
计算两点间的距离,我们可以使用这个公式。
最后,因为我们无法预知玩家将会向哪个方向发射泡泡,所以在计算碰撞时,我们需要计算整个屏幕中所有的泡泡,挨个地计算它与移动的泡泡的距离是否在碰撞距离之内,只要任何一个泡泡满足碰撞条件,那么这个移动的泡泡就应该进行停靠了。
最后,来看一下发射泡泡的所有积木逻辑。
注意其中的用于计算碰撞的双层逻辑循环,这里用到的是逻辑循环而不是重复执行(不记得这两种循环的区别的话,可以参考一下这篇文章),因为我们需要在泡泡移动过程中的每一帧,都进行一次计算,直到满足碰撞条件时为止。注意其中的两种退出的使用,退出逻辑循环退出的是当前的计算,退出循环退出的是泡泡的移动。当泡泡的移动循环退出时,泡泡也就停止了。
最后,预览一下看看泡泡的停靠。
总结一下,今天我们了解了泡泡龙游戏中泡泡的发射,移动,反弹和停靠。其中涉及到了很多的数学计算,我想这又会让不少人头疼了。
分享一下我自己在游戏开发的过程中遇到很多数学计算时的方法。
首先,你要克服自己内心对于数学的恐惧,可以这样想,这最多不过是初中的数学知识(其实绝大部分游戏开发中用到的数学知识都不会超过初中数学的内容),虽然早就忘干净了,但是没关系,现查现用也来得及,你肯定能搞的定,要先在心理上克服它。
越过心里这一关之后,下一步就简单了。拿出纸和笔,画个草图,写写画画(对于数学,在纸上写写画画绝对是最好的学习方式了),然后推导推导公式。不用怕推导错了,因为我们还要拿这些公式到游戏里去验证。不得不说这就是游戏开发的一个好处,你完全可以自己去验证自己的猜想,而且游戏的运行结果会很明确的告诉你,你的猜想是对的还是错的。
最后,就是秘诀了。大胆的去猜测,然后在游戏里去试验。你的游戏又试不坏,你总是可以通过多次的尝试来找到那个最终的正确结果。