乒乓球比赛的碰撞检测策略

时间:2013-06-10 01:33:16

标签: java geometry collision-detection

我正在尝试实施一个简单的乒乓球游戏。我希望球能够改变X方向或Y方向,这取决于击球的哪一侧。

球以每秒3个像素的速度移动,宽度为22,高度为22.桨叶的宽度和高度为32个。

对于球的碰撞检测,我应该创建一个矩形并检查与中心点的碰撞吗?

或者我可以在球周围创建4个矩形来表示边,具有适当的宽度,假设球每帧移动3个像素。

另一个选择是创建一个方法,检查球的运动方向至少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像素每帧

1 个答案:

答案 0 :(得分:0)

因为你正在使用的形状如此简单,为什么不完美呢?在执行命中检测时,为球拍使用矩形,为球使用圆圈。首先检查逐帧的冲突;以你正在使用的速度,你不应该为未来的碰撞“展望未来”。

相关问题