如何检查特定的碰撞点

时间:2014-11-30 18:49:03

标签: c#

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

我有一个球在桌子周围弹跳(从墙壁反弹),它也可以从球拍上反弹。然而,当它从桨叶反弹时,它总是以相同的角度反弹。

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

如果有人可以帮我弄清楚如何指定控件的部分(在本例中是一个图片框),我将非常感激。

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

我不会实现任何基于物理的物理角度反射,我只是指定直接值。

我知道你可以使用ball.Bounds.IntersectsWith(paddle.bounds),但这只是任何碰撞。是否可以指定与左边缘,右边缘相交的东西。还是等等?

再次,抱歉混淆。

编辑2:希望这会清除一些事情,这里是我的代码,用于从当前的桨中弹出。桨只是一个图片框,“球”只是图片框内的图像。

** pcbPluto是'球。

        //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;
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

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

因此,不要找到确切的碰撞点,而是尝试对其进行分类; (只是一个建议)只是将划分为网格(我会说7x7就足够了;选择奇数)并将这些部分分类为左边缘,右边缘等。当然,一些正方形将被排除。< / p>