美文网首页程序员让前端飞
小游戏开发 Mario (8) 碰撞

小游戏开发 Mario (8) 碰撞

作者: zidea | 来源:发表于2019-01-01 07:35 被阅读14次

继续上次的游戏碰撞检测的主题,上次我们通过方法 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 游戏开发,将这些理论应用到开发中进行实践。

相关文章

  • 小游戏开发 Mario (8) 碰撞

    继续上次的游戏碰撞检测的主题,上次我们通过方法 testCollision 来检查两个物体是否碰撞,如果发生碰撞就...

  • 小游戏开发 Mario (7) 碰撞

    今天先停下来,回看了一下自己发布的 mario 游戏开发分享,发现有些朋友对游戏开发的一些基础知识还不太了解。本周...

  • 小游戏开发 Mario (3)

    在开始新的内容之前,我们先优化一下上一次代码。我们看图中的代码 发现(1)加载图片和(2)加载关卡(level)是...

  • 小游戏开发 Mario (1)

    前言 当下如火如荼的微信小游戏,简单且好玩,自己体验了一下像跳一跳这样的游戏。作为一名开发人员,当然也想自己开发款...

  • 小游戏开发 Mario (6)

    再开始今天新的内容前,我们来修正两个错误。 第一个是我们为重力补上 deltaTime。然后适当地调整 gravi...

  • 小游戏开发 Mario (9)

    上两周主要给大家介绍了游戏中是如何检测游戏角色和游戏角色和障碍物间的碰撞。今天回到 mario 继续写我们 sup...

  • 如何“微创新”一个微信小游戏?

    8月17日,微信小游戏团队发布《致小游戏开发者的一封信》,首次对外全面阐述微信小游戏平台理念,表示优秀的微信小游戏...

  • 你必须先成为你自己,爱才有意义

    Mario:“why are you here?” Mario: “why are you g...

  • Mario

    小时候我也认识他~~,长大了渐渐的远离了。

  • Mario

    “我有一条黑狗,它名叫Mario 。每当这黑狗出现,我就感到空虚,生活也慢了下来。它总不期而至的出现在我的面前。黑...

网友评论

    本文标题:小游戏开发 Mario (8) 碰撞

    本文链接:https://www.haomeiwen.com/subject/gnbwlqtx.html