我正在为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;
}
}
}
答案 0 :(得分:0)
我可以说,在开发游戏时,优先考虑“看起来正确”和“感觉正确”,而不是数学正确性(例如,如果你得到渲染的形状,从两个相同的游戏盒的图形卡 - 无论它们是什么 - 你会看到看起来完全相同的绿色阴影,在某些位上实际上是不同的;并且形状在数学上不相同)。
因此,不要找到确切的碰撞点,而是尝试对其进行分类; (只是一个建议)只是将划分为网格(我会说7x7就足够了;选择奇数)并将这些部分分类为左边缘,右边缘等。当然,一些正方形将被排除。< / p>