如何解决我如何在类和类之间发生冲突?
这是我目前的代码... 我们有主类、眼睛类、敌人类、人脸类和消息类。 所以我的问题是我如何进行碰撞,或者我必须为面部类和敌人类做什么,当它们接触时游戏就会停止。 我希望你明白!有人帮忙吗?欣赏
----------------------------------------------
解决方法
以下是一些可能对您有用的线索。
首先你提到了一个 Person
类,但它不在你共享的代码中,所以我假设你认为一个敌人接触了这个人,如果它接触了 Face
或其中之一Eye
。
这里根据你对display()
、Enemy
和Face
的{{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,这是一种存储对象位置组件 PVector
和 x
的方法。>
在此函数中,您需要计算 y
和 p1
之间的距离,这是您两个圆的位置。您可以使用 p2
类的 dist()
方法执行此操作,您需要将此距离与直径 PVector
和 d1
的总和进行比较。
此函数运行后,您可以使用需要检查碰撞的对象(即第一只眼睛和所有敌人,第二只眼睛和所有敌人以及脸部和所有敌人)调用它。
然后当该函数返回 d2
时,您就会知道您可以停止游戏了:有很多不同的方法可以做到这一点,因此由您决定走哪条路。第一个简单的测试方法是使用 noLoop()
停止处理循环。
上一部分是关于您需要创建什么的基础,现在这里有一些建议可能对您有所帮助:
-
一旦你的函数
true
被写出来,你就可以写一个新的方法到collideCircles()
类,像这样Face
这个函数会接受一个敌人数组,它会迭代这个数组并调用boolean collideWithEnemies(Enemy[] enemies)
3 次。collideCircles()
和p1
将始终是当前敌人,而x1
、p2
将依次是每只眼睛和脸部的位置和直径。然后,您可以在将计算碰撞的每个新帧以这种方式从d2
调用此函数。 -
正如我在前一点所建议的,如果您使用数组(参见 the doc),您的代码会更容易使用,您可以使用它们来存储敌人和您使用的
draw()
在rect()
(我假设是墙) -
在有两个属性
draw()
和x
的每个类中,您可以改用y
,这是一个好习惯,因为它会简化您的代码,并且'将能够使用PVector
类的所有现有方法(计算距离、角度和许多其他东西) -
为了改进您的
PVector
方法,您可以创建一个类collideCircles
,它只有一个CircularObject
和PVector position
。函数签名将变为int diameter
。然后你可以让你的类boolean collideCicle(CircularObject c1,CircularObject c2)
、Face
和Eye
继承自这个类(参见 the doc),这样你就可以调用 {{1} } 直接使用您的对象,例如Enemy
-
我描述的检查碰撞的函数有效但效率低下。有几个敌人和两只眼睛,事情应该可以无缝地工作,但如果你的项目长大了,你会看到一些放缓。有很多方法可以改善这一点。改进函数的一种简单方法是知道
collideCircles
isColliding = collideCircles(face,enemy1)
方法使用平方根计算(因为两点之间的距离的公式,其中涉及平方根)并且这是昂贵的.为了避免这种平方根计算,您可以直接计算圆之间的平方距离 (PVector
) 并检查圆直径的平方和。如果您需要更高效的东西,则需要使用特定的数据结构,例如 Quadtrees,但这并不像我之前描述的方法那样简单。 -
最后,您的代码格式不正确,这使得阅读非常困难(您的缩进不一致,您有很多无用的空行等)您正在使用的 IDE 或文本编辑器可能有自动格式化功能,您应该使用它,之后您会感觉更自在地编写和阅读代码。
最后一点:处理中的碰撞检测是相当普遍的事情,您应该查看在线资源日志 here 是一个示例,其中包含圆形碰撞和一些额外的物理反弹球,{{3} } youtube频道有很多关于碰撞的惊人资料,一个好的搜索引擎也应该返回数以千计的相关资料。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。