Java游戏中的碰撞检测?
我正在开发一个游戏,在这个游戏中,我遇到了运动图像碰撞检测的问题。游戏中有一艘宇宙飞船和一些小行星(障碍物)。我想检测它们之间的碰撞。如何实现这一点?对于矩形以外的任何对象,碰撞检测通常都很棘手 我过去的做法是为每个对象提供图像和遮罩。例如,一个像来自的木星2号宇宙飞船这样的物体会有以下图像和遮罩:Java游戏中的碰撞检测?,java,collision-detection,Java,Collision Detection,我正在开发一个游戏,在这个游戏中,我遇到了运动图像碰撞检测的问题。游戏中有一艘宇宙飞船和一些小行星(障碍物)。我想检测它们之间的碰撞。如何实现这一点?对于矩形以外的任何对象,碰撞检测通常都很棘手 我过去的做法是为每个对象提供图像和遮罩。例如,一个像来自的木星2号宇宙飞船这样的物体会有以下图像和遮罩: X 00000100000 XXXXXXX 00111111100 X X 01111111110 X
X 00000100000
XXXXXXX 00111111100
X X 01111111110
X X 11111111111
X X 01111111110
XXXXXXX 00111111100
XXX 00001110000
图像是在屏幕上显示的,而遮罩是用于碰撞检测的。您会注意到,遮罩中的1基本上是图像的轮廓和内容
检测碰撞的方式:
- 检查矩形是否重叠。否则,就不可能发生碰撞
- 否则,创建一个包含遮罩的1号对象矩形
- 构造另一个由遮罩组成的对象2矩形
- 按位和矩形2与矩形1的重叠部分
- 如果矩形1中还有任何1位,则表示存在冲突
....xx....
..xx..xx..
.x......x.
.x......x.
x........x
x........x
.x......x.
.x......x.
..xx..xx..
....xx.**y.....
.y......
yyyyyyyy
.y......
..y.....
您可以看到,即使矩形重叠(请参见**y
),箭头实际上并未与气球接触。通过对掩码应用按位AND操作,这些位将最终为零,从而导致无冲突
@kyoryu在他的评论中提出了一个有趣的观点。有些游戏很适合用较小的矩形组成对象,并且可以简化基于矩形组件的碰撞检测(无需担心像素的完美性)。例如,我们的老朋友太空入侵者(实际上是游戏中对抗太空入侵者的防御者)可能由两个矩形组成,X和Y,导弹由Z制成:
YYYY .Z.
YYYY .Z.
XXXXXXXXXXXX .Z.
XXXXXXXXXXXX ZZZ
XXXXXXXXXXXX .Z.
XXXXXXXXXXXX
这可以归结为对导弹与两个空间入侵者矩形的简单矩形检查——考虑到导弹的大小,即使你接触到
字符之一,你也可能称之为碰撞(考虑它们是近程导弹,而不是撞击种类的导弹).对于像这样的简单游戏,我发现使用圆圈可以很容易地检测碰撞。我们可以利用
我们可以通过知道,如果两个圆心之间的距离小于组合半径,那么它们一定会发生碰撞来检测两个圆之间的碰撞,对吗?然后可以执行如下碰撞检查:
distX ^ 2 + distY ^ 2 <= (radius1 + radious2) ^ 2 == COLLISION!
distX^2+distY^2检测两幅图像的X和Y,然后进行一些计算,减去每幅图像的宽度和高度(如果它们大小不同),以获得正确的X和Y坐标。
例如:
|-------
| |
| |
| |
|_______|
` |
|
|
|
comming down
|---------|
| |
| |
| |
|---------|
Minus width and height to find out correct x and y
|-------
| |
| |
| |
|_______|
` |
|
|
|
交付
|---------|
| |
| |
| |
|---------|
减去宽度和高度,找出正确的x和y
和盒子碰撞很容易。如果只看x轴,两个框有三种可能的排列方式:
重叠
第一个盒子在第二个盒子的左边
第一个盒子在第二个盒子的右边
如果第一个长方体位于第二个长方体的左侧,则表示其最右侧的点必须位于第二个长方体最左侧的点的左侧
first.right < second.left
first.left > second.right
如果两者都不正确,则框在x轴上重叠
然后,可以对y平面重复此操作(用“左”和“右”替换“上”和“下”),以确定长方体是否也在y轴上重叠-如果重叠,则它们正在碰撞!对于2d游戏中的简单碰撞,这就是你真正需要做的
更大的问题可能会出现,这取决于您拥有多少不同的对象,因为碰撞检测的原始实现是一个O(N^2)算法。如果您愿意这样做,JBox2D是一个令人惊叹的物理引擎,旨在帮助解决这一问题。它为你处理所有的物理问题,你所要做的就是在它告诉你的地方画图
我个人现在一直在使用它。我确实发现开始使用它有点困难,但一旦你开始记住如何制作一个物体,它就会变得非常容易
你可以下载它
还有一些关于基础知识的视频。他使用的库有点“松散”,但您可以轻松理解基本知识。您可以使用Java内置的矩形交点。它甚至适用于旋转的矩形
创建矩形并确保它遵循对象的旋转和位置
每一帧对其调用rectangle.intersects(rectangle)
方法以确定其是否相交
使用多个矩形可以为形状怪异的图像创建更好的点击框。通常,对于这样的游戏,矩形就是您所需要的全部。大多数阿卡迪类型的游戏只使用矩形,事实上,使用的矩形不一定与它们所代表的东西大小相同(通常对玩家来说更小,而对敌人来说更大)。每像素精度几乎从来都不是必需的。这一点很好,@kyoryu,但即使是最简单的游戏也会有由多个矩形组成的对象(否则图形将非常糟糕)。这些规则仍然有效,只是检测构成对象的矩形之间的碰撞,而不是检测像素碰撞(逻辑结束位置)。所示的球体示例不适合矩形,因为矩形具有弯曲的性质。通常精灵的渲染和碰撞不会以1:1的比例映射。当渲染任意细节的精灵时,在大多数2d游戏中,会使用collis
first.left > second.right