processing - 如何在班级和班级之间进行碰撞?
问题描述
这是我到目前为止的代码......我们有主类、眼睛类、敌人类、面部类和消息类。所以我的问题是我如何进行碰撞,或者我必须为面部类和敌人类做什么,当它们接触时游戏将停止。我希望你明白!有人帮忙吗?欣赏<3
----------------------------------------------
解决方案
以下是一些可能对您有用的线索。
首先,您提到了一个Person
类,但它不在您共享的代码中,因此我假设您认为如果敌人接触Face
了 s 或其中之一,则认为敌人已经接触了该人Eye
。
这里根据您的display()
功能Enemy
,所有对象都是一些圆圈(即水平Face
和垂直直径使用相同的直径)。所以你想要做的是检测圆圈之间的碰撞,这非常简单: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)
如果您不熟悉PVector
该类,请查看此文档,这是一种存储对象位置组件的x
方法y
。
在此函数中,您需要计算两个圆之间的距离p1
以及p2
两个圆的位置。您可以使用类的dist()
方法来做到这一点,PVector
并且您需要将此距离与直径d1
和的总和进行比较d2
。
一旦这个函数工作,你可以调用它来检查你需要检查碰撞的对象(即第一只眼睛和所有的敌人,第二只眼睛和所有的敌人,脸和所有的敌人)。
然后当这个函数返回时true
,你会知道你可以停止你的游戏:有很多不同的方法可以做到这一点,所以由你决定走哪条路。第一种简单的测试方法是使用noLoop()
which 停止处理循环。
上一部分是关于您需要创建的基础,现在这里有一些建议可能会对您有所帮助:
编写函数后,您可以像这样向类
collideCircles()
编写一个新方法,该函数将采用一个敌人数组,它将遍历该数组并调用3 次。和将永远是当前的敌人,,将依次是每只眼睛和脸部的位置和直径。然后,您可以在每个将计算碰撞的新帧中以这种方式调用此函数。Face
boolean collideWithEnemies(Enemy[] enemies)
collideCircles()
p1
x1
p2
d2
draw()
正如我在上一点中建议的那样,如果您使用数组(请参阅文档) ,您的代码会更容易使用,您可以使用它们来存储敌人和
rect()
您使用的敌人draw()
(我假设是墙壁)在每个有两个属性的类中
x
,y
您可以改用 aPVector
这是一个好习惯,因为它会简化您的代码,并且您将能够使用PVector
该类的所有现有方法(计算距离、角度和地块其他东西)为了改进你的
collideCircles
方法,你可以创建一个CircularObject
只有一个PVector position
和的类int diameter
。函数签名将变为boolean collideCicle(CircularObject c1, CircularObject c2)
. 然后你可以拥有你的类Face
,Eye
并Enemy
从这个类继承(参见文档),这样你就可以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 频道有很多令人惊叹的材料关于碰撞和一个好的搜索引擎也应该返回数以千计的相关材料。
推荐阅读
- java - 无法自动装配没有找到类型的 bean
- sqlite - 无法导航到特定列 sqlite
- r - 为 autoplot.lm 添加一个通用标题
- javascript - 如何修复 gatsbyjs 中的“未知参数'slug'”?
- python - 在网络浏览器上上传 Python
- scala - Apache Commons CompressorInputStream 和 HDFS Gzip 文件错误 No Compressor found for the stream signature
- docker - 如何为两个分组的后端只获取一个 traefik 前端?
- buildfire - BuildFire:未定义 buildfire
- python-3.x - 如何从python中的字符串中删除引号?
- git - “承诺”和“未修改”是一样的吗?