【发布时间】:2011-02-03 21:26:34
【问题描述】:
我正在尝试创建一种处理两个对象之间所有可能碰撞的好方法。通常情况下,一个会移动并撞到另一个,然后应该“弹回”。
到目前为止,我所做的(我正在创建一个典型的游戏,你有一块木板并在砖块上反弹一个球)是检查矩形是否相交,如果相交,则反转 Y 速度。
这是一个非常丑陋且临时的解决方案,从长远来看是行不通的,由于这种处理在游戏中很常见,我真的很想为未来的项目找到一种很好的方法。感谢任何链接或有用的信息。
下面是我的碰撞处理函数现在的样子。
protected void collision()
{
#region Boundaries
if (bal.position.X + bal.velocity.X >= viewportRect.Width ||
bal.position.X + bal.velocity.X <= 0)
{
bal.velocity.X *= -1;
}
if (bal.position.Y + bal.velocity.Y <= 0)
{
bal.velocity.Y *= -1;
}
#endregion
bal.rect = new Rectangle((int)bal.position.X+(int)bal.velocity.X-bal.sprite.Width/2, (int)bal.position.Y-bal.sprite.Height/2+(int)bal.velocity.Y, bal.sprite.Width, bal.sprite.Height);
player.rect = new Rectangle((int)player.position.X-player.sprite.Width/2, (int)player.position.Y-player.sprite.Height/2, player.sprite.Width, player.sprite.Height);
if (bal.rect.Intersects(player.rect))
{
bal.position.Y = player.position.Y - player.sprite.Height / 2 - bal.sprite.Height / 2;
if (player.position.X != player.prevPos.X)
{
bal.velocity.X -= (player.prevPos.X - player.position.X) / 2;
}
bal.velocity.Y *= -1;
}
foreach (Brick b in brickArray.list)
{
b.rect.X = Convert.ToInt32(b.position.X-b.sprite.Width/2);
b.rect.Y = Convert.ToInt32(b.position.Y-b.sprite.Height/2);
if (bal.rect.Intersects(b.rect))
{
b.recieveHit();
bal.velocity.Y *= -1;
}
}
brickArray.removeDead();
}
【问题讨论】:
-
要从中得到什么,我认为您必须更准确地说明您想要什么行为。说“这真的很丑而且暂时”并没有削减它。
-
Bal 的意思是一个球,它应该准确地反弹它以直角撞击的任何表面,当速度太高时不会“传送”通过它等。