【问题标题】:Collision detection strategy for a pong game乒乓球游戏的碰撞检测策略
【发布时间】: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


【解决方案1】:

因为您正在使用的形状非常简单,为什么不完美呢?执行击球检测时,对桨使用矩形,对球使用圆形。首先逐帧检查冲突;以您正在使用的速度,您不需要为未来的碰撞“展望未来”。

【讨论】:

  • 好吧,我也在尝试在游戏中实现方块,所以取决于哪一边被击中取决于然后反转哪个 X 或 Y 速度,任何示例代码都会很棒:)
  • 您可能会发现this answer on the gamedev stack exchange 很有用。你正在建造的东西听起来很像“突破”,这是一个老式的用球打破砖块的游戏。那篇文章谈到了突破式游戏的命中检测。
  • 是的,我想不出这个词/游戏 :D 我想尝试将 pong 与 breakout 混合使用 :),我会看看那篇文章
  • 酷!如果有用的话,该游戏过去也被称为“arkanoid”。
  • Sigpwned 我已经更新了我的代码,向您展示我添加的内容,但仍然无法正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多