泡泡龙游戏开发系列教程(三)
嗨!大家好,我是小蚂蚁。今天我们来继续了解在泡泡龙游戏中,泡泡是如何发射,移动,反弹和停靠的。
这一节里会涉及到比较多的数学运算,不过完全不用担心,试着找一张纸和一支笔,画一画,很容易理解的。
如何处理泡泡的发射
在泡泡龙游戏中,当我们点击屏幕上的一点时,发射器中的泡泡会向我们点击的那个位置发射。想要实现这样的功能,我们就必须要知道当前点击的屏幕位置位于要发射的泡泡的哪个方向,也就说我们需要计算出泡泡的发射角度。
我们来看图片,一个点是要发射的泡泡的位置(x0,y0),一个点是屏幕点击位置(x1,y1),现在已知这两个点的位置,我们需要计算出一个角度 A,也就是泡泡发射的角度。这里计算角度 A,使用了三角函数中正切函数,对照着右侧的图片和计算公式可以回忆一下那些曾经学过的数学知识。
在小游戏制作工具中运算类别中的一个积木块为我们提供了用于计算角度A的方法。
具体的泡泡发射角度的计算,只需要像下面这样就可以了。
刚才我们所计算的情况是点击屏幕的位置位于要发射的泡泡的右侧,接着来看一下当点击位置位于泡泡的左侧时,该怎么计算?
如图,点击位置位于泡泡左侧,我们需要计算的是绿色的旋转角度,此时如果我们仍然使用上方的计算公式,那么计算出的就是左侧的角度A,但此时这个角度A是个负数(很显然此时 x1-x0 是个负数),想要得到右侧的旋转角度,只需要将计算得到的 -A 加上 180度即可。
在小游戏制作工具中的移动方向(也叫旋转角度)指的是以水平向右为 0 度,然后逆时针旋转指定的度数,此时这个方向就是要移动的方向。
最后,看一下关于旋转角度计算的积木逻辑。
实话讲,当点击屏幕左侧这个加上180度的计算,我在做的时候是完全靠猜的,点击右侧是比较直观的,但是点击左侧的时候就看不出来了,但是我知道的是一定是某一个值(90?180?270?360?)的加减,所以就挨个尝试,试到 180 的时候就试出来了。所以你看到的上方的分析图,完全属于事后分析。在游戏开发的过程中,一时想不出来并不要紧,我们笨人也是有方法的,这个方式就是猜测加不断尝试。
如何处理泡泡的移动和反弹
泡泡的移动比较简单,我们直接在循环中不停的让它前向移动即可。
对于泡泡碰到两侧墙面的反弹,就又需要计算了。
如图,是泡泡碰到右侧或左侧反弹后移动角度的计算,是的,这个公式我又是靠猜的,所以这里不进行事后分析了,反正就是那几个特殊的角度数值,不是加就是减,挨个尝试总能试出来的。
最后,来看一下发射的泡泡的积木逻辑。
预览一下,看看泡泡发射移动和反弹的效果。
如何处理泡泡的停靠
如果说上方的这些发射,移动,反弹都属于开胃小菜的话,那么我们接下来要上正餐了,请集中你的注意力,跟上文章的思路。
在泡泡的发射,移动和反弹的过程中,我们全部使用的是实时的计算来实现的,没有使用反弹,物理移动等方式。为什么呢?因为对于泡泡龙这个游戏来说,是需要非常精准的,泡泡碰到墙壁后一定会反弹,泡泡碰到任何一个其它的泡泡时,一定会停靠,这其中不允许有失误(见过有泡泡龙游戏泡泡碰到墙壁后没有反弹而是飞出去的吗?),但是物理碰撞和物理移动是有可能有失误状况出现的,所以我们直接放弃了使用物理移动和碰撞检测,而是全部都采用实时计算的方式,因为这种方式不会出现失误。
对于泡泡的停靠,我们仍然是需要使用实时的计算方式,来算出泡泡在何时进行停靠。
如图,蓝色的泡泡被发射出去了,它会沿着发射的方向一直移动,直到它碰到任何一个其它的泡泡时停止。
其实,使用碰撞检测是最简单的方式,检测一下这个飞行的泡泡,只要它碰到其它的任何一个泡泡,就让它停止。但是,我们上方说过,碰撞检测并不能保证精准,可能会出现下面这样的问题。
这种情况在游戏里是不允许发生的,我们不能让一个泡泡穿透到另一个泡泡的里面。
为了保证碰撞的精准,就需要使用实时的计算来把两个球是否相碰给算出来。
如图,这就是计算两个泡泡是否碰上的方法,我们只需要计算当前两个泡泡之间的距离,然后判断这个距离是否在碰撞距离之内,如果是的话,就可以说这两个泡泡碰上了。
计算两点间的距离,我们可以使用这个公式。
最后,因为我们无法预知玩家将会向哪个方向发射泡泡,所以在计算碰撞时,我们需要计算整个屏幕中所有的泡泡,挨个地计算它与移动的泡泡的距离是否在碰撞距离之内,只要任何一个泡泡满足碰撞条件,那么这个移动的泡泡就应该进行停靠了。
最后,来看一下发射泡泡的所有积木逻辑。
注意其中的用于计算碰撞的双层逻辑循环,这里用到的是逻辑循环而不是重复执行(不记得这两种循环的区别的话,可以参考一下这篇文章),因为我们需要在泡泡移动过程中的每一帧,都进行一次计算,直到满足碰撞条件时为止。注意其中的两种退出的使用,退出逻辑循环退出的是当前的计算,退出循环退出的是泡泡的移动。当泡泡的移动循环退出时,泡泡也就停止了。
最后,预览一下看看泡泡的停靠。
总结一下,今天我们了解了泡泡龙游戏中泡泡的发射,移动,反弹和停靠。其中涉及到了很多的数学计算,我想这又会让不少人头疼了。
分享一下我自己在游戏开发的过程中遇到很多数学计算时的方法。
首先,你要克服自己内心对于数学的恐惧,可以这样想,这最多不过是初中的数学知识(其实绝大部分游戏开发中用到的数学知识都不会超过初中数学的内容),虽然早就忘干净了,但是没关系,现查现用也来得及,你肯定能搞的定,要先在心理上克服它。
越过心里这一关之后,下一步就简单了。拿出纸和笔,画个草图,写写画画(对于数学,在纸上写写画画绝对是最好的学习方式了),然后推导推导公式。不用怕推导错了,因为我们还要拿这些公式到游戏里去验证。不得不说这就是游戏开发的一个好处,你完全可以自己去验证自己的猜想,而且游戏的运行结果会很明确的告诉你,你的猜想是对的还是错的。
最后,就是秘诀了。大胆的去猜测,然后在游戏里去试验。你的游戏又试不坏,你总是可以通过多次的尝试来找到那个最终的正确结果。
我是会做游戏也会教你做游戏的小蚂蚁,想学习做游戏的话,关注我就对啦!欢迎关注公众号【小蚂蚁教你做游戏】,领取全网最全的微信小游戏开发原创教程资料。
泡泡龙游戏开发系列教程(三)相关推荐
- unity2d游戏开发系列教程:三、场景布置,增加怪物和机关
目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 第一节.场景草地布置 先查看一下资源文件里都有什么,一会就要用到的 打开 ...
- HTML5游戏开发系列教程5(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...
- unity2d游戏开发系列教程:四、一个2D游戏所需要的主要功能(游戏框架)
目录 unity2d游戏开发系列教程:一.环境安装 unity2d游戏开发系列教程:二.新建工程并熟悉Unity编辑器常用功能 unity2d游戏开发系列教程:三.场景布置,增加怪物和机关 原文下载 ...
- unity2d游戏开发系列教程:一、环境安装
从这篇文章开始,一步一步教大家从0开始通过2DGameKit项目进行2D游戏开发 第一步.环境安装 1.先使用手机下载Unity Connect并注册登陆 2.进入unity官网https://uni ...
- unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能
目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
- 微信小程序开发系列教程三:微信小程序的调试方法
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...
- 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游戏开发系列教程 中国象棋01 工程文件概述
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 上一篇博 ...
最新文章
- Python的零基础超详细讲解(第十天)-Python的input()函数
- Intellij-Cannot download Sources解决方法
- UA MATH523A 实分析3 积分理论例题 Fubini定理计算简单二重积分的一个例题
- 【算法数据结构Java实现】Java实现动态规划(背包问题)
- 通过Playbook部署LAMP(5)
- WSAAccept()函数使用解析
- 以LeNet-5为例理解CNN
- 程序员有必要参加软考吗?大一可以考的编程证书还有哪些
- php zblog 侧边栏样式_免费ZBLOG双栏图文自媒体主题 支持自定义侧边模块
- getHandel redis_redis 使用 get 命令读取 bitmap 类型的数据
- ZOJ - 2865 A very easy task
- 数据库截取字段 转换成int型函数
- 海康rtsp视频流媒体服务器搭建(去除flash插件):rtsp > nginx-rtmp > http-flv > flv.js
- Hebb和Delta学习规则
- EXCEL-解决表格被锁定和分组的冲突
- PHP+ffmpeg音频格式转化踩坑实录
- 同学们 给你十个理由别去买iPad
- 安装linux之后没有网
- 运算符之 --- 取余运算 %
- 东小店南少:让你终身收益的三个营销思维,看完不再迷茫!