繁体   English   中英

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

[英]Collision detection strategy for a pong game

我正在尝试实现一个简单的乒乓球游戏。 我想根据击球的哪一侧来改变X方向或Y方向。

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

为了检测球上的碰撞,我是否应该只创建一个矩形并检查与中心点的碰撞?

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

另一种选择是创建一种方法,该方法将检查球的运动方向上至少2个像素的碰撞。

如果球向右移动,并且x位置是16,则下一帧将是19。如果我创建一种方法来检查x的16、17和18,以确保是否发生碰撞,它将击中右侧而不导致球实际进入立方体内?

@西格

我现在将其作为碰撞检测

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个像素

因为您使用的形状是如此简单,所以为什么不完美呢? 执行击中检测时,对桨板使用矩形,对球使用圆形。 首先逐帧检查冲突; 以您的工作速度,您无需为将来的碰撞“展望未来”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM