如何检查特定的碰撞点
本文关键字:碰撞 何检查 检查 | 更新日期: 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 就足够了;并选择奇数(并将这些部分分类为左边缘、右边缘等。当然,一些正方形将被排除在外。