小游戏开发 Mario (8) 碰撞

作者 : 开心源码 本文共927个字,预计阅读时间需要3分钟 发布时间: 2022-05-12 共170人阅读

继续上次的游戏碰撞检测的主题,上次我们通过方法 testCollision 来检查两个物体能否碰撞,假如发生碰撞就返回 true 否则返回 false。这种检测可用于判断角色与子弹或者与怪物接触时,但是假如一个运动的角色与墙壁呀或者与者障碍物接触时,角色是无法穿过障碍物,或者停留在障碍物内部,角色会退回一个位置。角色碰撞后回到什么位置是今天重点探讨的内容。

这里会用到数学中学到的向量概念,向量是有大小和方法。我们用一个向量表示运动角色与障碍物中心的连接线,有点不精确,为了便于大家了解,暂时看作一条线段,如下图(连接绿色和蓝色小块中心的连线)

红色线段两端分别是角色(绿色)和障碍物(蓝色)的中心点。假如这条线端在坐标的 x? 轴和 y 轴上都会有投影。.

vector_x 和 vector_y 分别代表向量在 x 轴和 y 轴上的分向量。

现在注意一下,在下图中,当绿色小块从左侧向蓝色小块方向运动,当碰撞时 vector_x 应该大于 vector_y。从其余三个方向向蓝色小块运动碰撞的场景,大家可以自己尝试画一下,推一下其中规律。

不难看出当 vector_x 大于 vector_y 说明绿色小块是从重左右两侧来与蓝色小块进行碰撞。当?vector_y 大于 vector_x 说明绿色小块是从重上下两侧来与蓝色小块进行碰撞。所以我们可以笼统出四个象限,通过绿色小块运动方向和?vector_x 和 vector_y 关系可以划分为四个区域。

通过上面总结,我们可以很好了解下面的两个图,虚线小块是蓝色小块碰撞时快照,绿色小块表示碰撞后弹回的位置

上代码

在 Rectangle 中创立 resolveCollision 方法如下图,代码中 vector_y 和 vectory_x 平方后进行比较,为了比较其绝对值。当 vector_y 大于 vector_x 并说明是上下方向上进行的碰撞,vector_y > 0 表示从下方向上进行碰撞所以会中止在蓝色小块下方。其余三种情况可以自己看一看,就不逐个说明了。

而后我们在 if(palyer.testCollision(tile)) 中调用 resolveCollision 方法,说明其前提条件是两个小块已经发生碰撞。

今天就到这里,下周我们回到 mario 游戏开发,将这些理论应用到开发中进行实践。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 小游戏开发 Mario (8) 碰撞

发表回复