0

我正在尝试实现一个简单的乒乓球游戏。我希望球根据击球的哪一侧来改变 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 个像素

4

1 回答 1

0

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

于 2013-06-10T02:07:26.827 回答