微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何在类和类之间发生冲突?

如何解决我如何在类和类之间发生冲突?

这是我目前的代码... 我们有主类、眼睛类、敌人类、人脸类和消息类。 所以我的问题是我如何进行碰撞,或者我必须为面部类和敌人类做什么,当它们接触时游戏就会停止。 我希望你明白!有人帮忙吗?欣赏

----------------------------------------------

解决方法

以下是一些可能对您有用的线索。

首先你提到了一个 Person 类,但它不在你共享的代码中,所以我假设你认为一个敌人接触了这个人,如果它接触了 Face 或其中之一Eye

这里根据你对display()EnemyFace的{​​{1}}函数,所有对象都是一些圆(即Eye用于相同直径的水平和垂直直径)。那么您正在尝试做的是检测圆圈之间的碰撞,这非常简单:

取两个位置为 ellipse()(x1,y1),直径为 (x2,y2)d1 的圆。如果这些圆的位置之间的距离小于它们的直径之和 d2(如果你不确定这是真的,你可以拿一张纸和一支铅笔画圆碰撞而不碰撞,您应该很快验证此属性)。

因此,您首先需要编写一个函数,该函数将接受四个参数并返回一个布尔值,如下所示:

isColliding = dist((x1,y1),(x2,y2)) <= d1 + d2

如果您不熟悉 boolean collideCircles(PVector p1,int d1,PVector p2,int d2) 类,请查看 this documentation,这是一种存储对象位置组件 PVectorx 的方法。>

在此函数中,您需要计算 yp1 之间的距离,这是您两个圆的位置。您可以使用 p2 类的 dist() 方法执行此操作,您需要将此距离与直径 PVectord1 的总和进行比较。

此函数运行后,您可以使用需要检查碰撞的对象(即第一只眼睛和所有敌人,第二只眼睛和所有敌人以及脸部和所有敌人)调用它。

然后当该函数返回 d2 时,您就会知道您可以停止游戏了:有很多不同的方法可以做到这一点,因此由您决定走哪条路。第一个简单的测试方法是使用 noLoop() 停止处理循环。


上一部分是关于您需要创建什么的基础,现在这里有一些建议可能对您有所帮助:

  • 一旦你的函数 true 被写出来,你就可以写一个新的方法到 collideCircles() 类,像这样 Face 这个函数会接受一个敌人数组,它会迭代这个数组并调用 boolean collideWithEnemies(Enemy[] enemies) 3 次。 collideCircles()p1 将始终是当前敌人,而 x1p2 将依次是每只眼睛和脸部的位置和直径。然后,您可以在将计算碰撞的每个新帧以这种方式从 d2 调用此函数。

  • 正如我在前一点所建议的,如果您使用数组(参见 the doc),您的代码会更容易使用,您可以使用它们来存储敌人和您使用的 draw()rect()(我假设是墙)

  • 在有两个属性 draw()x 的每个类中,您可以改用 y,这是一个好习惯,因为它会简化您的代码,并且'将能够使用 PVector 类的所有现有方法(计算距离、角度和许多其他东西)

  • 为了改进您的 PVector 方法,您可以创建一个类 collideCircles,它只有一个 CircularObjectPVector position。函数签名将变为 int diameter。然后你可以让你的类 boolean collideCicle(CircularObject c1,CircularObject c2)FaceEye 继承自这个类(参见 the doc),这样你就可以调用 {{1} } 直接使用您的对象,例如 Enemy

  • 我描述的检查碰撞的函数有效但效率低下。有几个敌人和两只眼睛,事情应该可以无缝地工作,但如果你的项目长大了,你会看到一些放缓。有很多方法可以改善这一点。改进函数的一种简单方法是知道 collideCircles isColliding = collideCircles(face,enemy1) 方法使用平方根计算(因为两点之间的距离的公式,其中涉及平方根)并且这是昂贵的.为了避免这种平方根计算,您可以直接计算圆之间的平方距离 (PVector) 并检查圆直径的平方和。如果您需要更高效的东西,则需要使用特定的数据结构,例如 Quadtrees,但这并不像我之前描述的方法那样简单。

  • 最后,您的代码格式不正确,这使得阅读非常困难(您的缩进不一致,您有很多无用的空行等)您正在使用的 IDE 或文本编辑器可能有自动格式化功能,您应该使用它,之后您会感觉更自在地编写和阅读代码。

最后一点:处理中的碰撞检测是相当普遍的事情,您应该查看在线资源日志 here 是一个示例,其中包含圆形碰撞和一些额外的物理反弹球,{{3} } youtube频道有很多关于碰撞的惊人资料,一个好的搜索引擎也应该返回数以千计的相关资料。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。