【发布时间】:2013-06-10 01:33:16
【问题描述】:
我正在尝试实现一个简单的乒乓球游戏。我希望球根据击球的哪一侧来改变 X 方向或 Y 方向。
球以每秒 3 个像素的速度移动,宽度为 22,高度为 22。球拍的宽度和高度为 32。
对于球的碰撞检测,我应该只创建一个矩形并检查与中心点的碰撞吗?
如果球以每帧 3 个像素的速度移动,我可以在球周围创建 4 个矩形来表示边,并具有适当的宽度。
另一种选择是创建一个方法来检查球运动方向上至少 2 个像素的碰撞。
如果球向右移动,并且 x 位置为 16,则下一帧将为 19。 我是否应该创建一个方法来检查 x 是否为 16、17 和 18,以确保如果发生碰撞,它将撞击右侧并且不会导致球实际进入立方体?
@Sig
我现在把它作为我的碰撞检测
if(Rect.intersects(balls.get(j).ball, levelBlocks.blocks.get(i).rect))
{
//Bottom
if(balls.get(j).yPos <= levelBlocks.blocks.get(i).yPos - (32/2))
{
balls.get(j).ySpeed = balls.get(j).ySpeed * -1;
}
//Top
if(balls.get(j).yPos >= levelBlocks.blocks.get(i).yPos + (32/2))
{
balls.get(j).ySpeed = balls.get(j).ySpeed * -1;
}
//Left
if(balls.get(j).xPos < levelBlocks.blocks.get(i).xPos)
{
balls.get(j).xSpeed = balls.get(j).xSpeed * -1;
}
//Right
if(balls.get(j).xPos > levelBlocks.blocks.get(i).xPos)
{
balls.get(j).xSpeed = balls.get(j).xSpeed * -1;
}
这可行,但不是 100%,它似乎仍然有点不对劲。如果球同时击中两个方块,它会反转反转,因此方向会再次返回。
然后我把它改成了这个
if(Rect.intersects(balls.get(j).ball, levelBlocks.blocks.get(i).rect))
{
//Bottom
if(balls.get(j).yPos <= levelBlocks.blocks.get(i).yPos - (32/2))
{
collision = 2;
}
//Top
if(balls.get(j).yPos >= levelBlocks.blocks.get(i).yPos + (32/2))
{
collision = 2;
}
//Left
if(balls.get(j).xPos <= levelBlocks.blocks.get(i).xPos + (32/2))
{
collision = 1;
}
//Right
if(balls.get(j).xPos >= levelBlocks.blocks.get(i).xPos + (32/2))
{
collision = 1;
}
temp = levelBlocks.blocks.get(i);
levelBlocks.blocks.remove(i);
combo.blocksDestroied += 1;
Assets.score += 10 * combo.comboMultiplier;
}
}
if(collision == 1)
{
balls.get(j).xSpeed = balls.get(j).xSpeed * -1;
collision = 0;
}
if(collision == 2)
{
balls.get(j).ySpeed = balls.get(j).ySpeed * -1;
collision = 0;
}
这确实有效,但球会时不时地开始随机穿过方块,看起来很奇怪,真的很困惑它为什么这样做,但我确实觉得这是因为 3 像素每帧
【问题讨论】:
-
我会从 3 个矩形开始,一个用于球,一个用于每个桨。然后它将检测是否发生任何碰撞并反转 x/y 增量
-
好吧,我有块,如果它从左侧、顶部、右侧或底部击中一个块,我希望 X 或 Y 根据碰撞而反转,我有一个基本版本,如下所示你已经说过的那个。
-
看看这个example 然后
-
MadProgrammer,我正在查看您提供的链接中的代码,您正在使用 if (collision.intersects(bounds)) 我认为这是使用 Android API 构建的,或者自定义方法有什么冲突?还是 Java API?
-
不,使用标准 Java 库。这基本上是
Rectangle,但可以是任何Shape对象。
标签: java geometry collision-detection