如何检查特定的碰撞点

本文关键字:碰撞 何检查 检查 | 更新日期: 2023-09-27 18:32:43

我正在为 C# 开发一个小乒乓球游戏。我对如何进行碰撞有大致的想法,但是我在指定桨上的特定位置时遇到困难。

我有一个球,它在形状周围反弹(从墙壁上反弹(,它也可以从球拍上反弹。但是,当它从桨上反弹时,它总是以相同的角度反弹。

我想做的是指定桨的部分(例如,左角、右角、中间(,并根据它击中桨的位置来改变角度。

如果有人能帮助我弄清楚如何指定控件的各个部分(在本例中为图片框(,我将不胜感激。

编辑:对不起,我相信我不是很清楚。我想知道的是我如何检查球击中球拍的位置。

不会实现任何基于物理角度反射的花哨,我只会分配直接值。

我知道你可以用球。Bounds.IntersectsWith(paddle.bounds(,但这只是任何碰撞。是否可以指定诸如"与左边缘、右边缘相交"等内容?

再次,对不起,造成混乱。

编辑2:希望这会清除一些问题,这是我当前从桨上反弹的代码。球拍只是一个图片盒,而"球"只是图片盒内的图像。

**pcb冥王星是"球"。

        //bounce off user/ai paddles 
        if (this.pcbPluto.Bounds.IntersectsWith(this.pcbUser.Bounds))
        {
            //if it hits user's paddle, reverse y direction
            intDirectionY *= -1;
        }
        else if (this.pcbPluto.Bounds.IntersectsWith(pcbComputer.Bounds))
        {
            //if it hits computer's paddle, reverse direction
            intDirectionY *= -1; 
        }

如您所见,截至当前点击用户或计算机的桨时,我只是反转垂直运动。这样做的问题是,无论球击中球拍的位置如何,角度都是静态的。

我想做的是,如果球碰到球拍的某些区域,角度会有所不同。例如,如果它撞到边缘,它可能会以更陡的角度出去,如果它撞到中间部分,可能是 30 的角度等。

再次,对不起,造成混乱。

最后编辑:让它工作!下面是我用来指定球击中图片框的"位置"的方法,并在此基础上更改了反射角度。

public void AiBallBouncer()
    {
        //variable declaration and assignment
        double dblComputerRelativeLocation = 0;
        dblComputerRelativeLocation = Math.Abs((((double)pcbComputer.Left - (double)pcbAsteroid.Left) / (double)pcbAsteroid.Width));
        //check for if the ball bounces on the paddles
        if (pcbAsteroid.Bounds.IntersectsWith(pcbComputer.Bounds))
        {
            //check for which angle of reflection to use 
            if (dblComputerRelativeLocation <= 0.1)
            {
                //reverse direction
                intDirectionY *= -1;
                //set new angle 
                intAngle = 30;
                //increase speed 
                intSpeed += 2;
            }
            else if (dblComputerRelativeLocation <= 0.2)
            {
                //reverse direction 
                intDirectionY *= -1;
                //set new angle 
                intAngle = 35;
            }
            else if (dblComputerRelativeLocation <= 0.4)
            {
                //reverse direction
                intDirectionY *= -1;
                //set new angle 
                intAngle = 50;
                //set speed back to normal
                intSpeed = 5;
            }
            else if (dblComputerRelativeLocation <= 0.6)
            {
                //reverse direction
                intDirectionY *= -1;
                //set new angle 
                intAngle = 60;
                //set speed back to normal
                intSpeed = 5;
            }
            else if (dblComputerRelativeLocation <= 0.8)
            {
                //reverse direction
                intDirectionY *= -1;
                //set new angle 
                intAngle = 50;
            }
            else if (dblComputerRelativeLocation <= 0.9)
            {
                //reverse direction
                intDirectionY *= -1;
                //set new angle 
                intAngle = 35;
            }
            else if (dblComputerRelativeLocation <= 1.0)
            {
                //reverse direction
                intDirectionY *= -1;
                //set new angle 
                intAngle = 30;
                //increase speed 
                intSpeed += 2;
            }
        }
    }

如何检查特定的碰撞点

我可以说,在开发游戏时,优先级是"看起来正确"和"感觉正确",而不是数学正确性(例如,如果你从两个相同游戏盒的图形卡中获得渲染的形状 - 无论它们是什么 - 你会看到看起来彼此完全相同的绿色阴影,实际上在某些位上是不同的;形状在数学上并不相同(。

因此,与其找到确切的碰撞点并尝试对其进行分类;(只是一个建议(只需将桨分成一个网格(我会说 7x7 就足够了;并选择奇数(并将这些部分分类为左边缘、右边缘等。当然,一些正方形将被排除在外。