首页 > 解决方案 > 如何在班级和班级之间进行碰撞?

问题描述

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

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

标签: processingcollision

解决方案


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

首先,您提到了一个Person类,但它不在您共享的代码中,因此我假设您认为如果敌人接触Face了 s 或其中之一,则认为敌人已经接触了该人Eye

这里根据您的display()功能Enemy,所有对象都是一些圆圈(即水平Face和垂直直径使用相同的直径)。所以你想要做的是检测圆圈之间的碰撞,这非常简单:Eyeellipse()

取两个位置为(x1, y1)(x2, y2)直径为d1和的圆d2。如果它们的位置之间的距离小于它们的直径之和,那么这些圆圈就会发生碰撞isColliding = dist((x1, y1), (x2, y2)) <= d1 + d2(如果你不确定这是真的,你可以拿一张纸和一支铅笔画出碰撞而不碰撞的圆圈,你应该验证这个属性很快)。

所以你需要做的第一件事是编写一个函数,它将接受四个参数并返回一个布尔值,如下所示:

boolean collideCircles(PVector p1, int d1, PVector p2, int d2)

如果您不熟悉PVector该类,请查看此文档,这是一种存储对象位置组件的x方法y

在此函数中,您需要计算两个圆之间的距离p1以及p2两个圆的位置。您可以使用类的dist()方法来做到这一点,PVector并且您需要将此距离与直径d1和的总和进行比较d2

一旦这个函数工作,你可以调用它来检查你需要检查碰撞的对象(即第一只眼睛和所有的敌人,第二只眼睛和所有的敌人,脸和所有的敌人)。

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


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

  • 编写函数后,您可以像这样向类collideCircles()编写一个新方法,该函数将采用一个敌人数组,它将遍历该数组并调用3 次。和将永远是当前的敌人,,将依次是每只眼睛和脸部的位置和直径。然后,您可以在每个将计算碰撞的新帧中以这种方式调用此函数。Faceboolean collideWithEnemies(Enemy[] enemies)collideCircles()p1x1p2d2draw()

  • 正如我在上一点中建议的那样,如果您使用数组(请参阅文档) ,您的代码会更容易使用,您可以使用它们来存储敌人和rect()您使用的敌人draw()(我假设是墙壁)

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

  • 为了改进你的collideCircles方法,你可以创建一个CircularObject只有一个PVector position和的类int diameter。函数签名将变为boolean collideCicle(CircularObject c1, CircularObject c2). 然后你可以拥有你的类FaceEyeEnemy从这个类继承(参见文档),这样你就可以collideCircles直接用你的对象调用,比如isColliding = collideCircles(face, enemy1)

  • 我描述的用于检查碰撞的功能有效,但效率低下。有几个敌人和两只眼睛,事情应该可以无缝地运行,但是如果你的项目长大了,你会看到一些慢下来。有很多方法可以改善这一点。改进函数的一种简单方法是知道该PVector dist()方法使用平方根计算(因为两点之间的距离公式涉及平方根),这是昂贵的。为避免这种平方根计算,您可以直接计算圆之间的平方距离 ( sqrdDist = (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y)) 并检查圆直径的平方和。如果您需要更高效的东西,则需要使用特定的数据结构,例如四叉树,但这并不像我之前描述的方法那样简单。

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

最后一点:处理中的碰撞检测是相当普遍的事情,并且有一个在线资源日志,您应该在这里查看一个带有圆形碰撞和一些额外物理反弹球的示例,编码火车youtube 频道有很多令人惊叹的材料关于碰撞和一个好的搜索引擎也应该返回数以千计的相关材料。


推荐阅读