Tron Game中的碰撞时间检测

时间:2012-04-07 02:37:11

标签: c# multithreading collision

所以我试图在C#.NET中制作一个Tron LightBike游戏,但当两个玩家同时相互碰撞(或碰撞时)时,我遇到了一个问题。

以下是我如何初始化玩家...

bikes = new ArrayList();
bikes.Add(new LightBike(new Point(500, 10), Color.Blue, "left", new DirectionKeys(Keys.Left, Keys.Down, Keys.Up, Keys.Right))); //blue player facing right
bikes.Add(new LightBike(new Point(10, 10), Color.Red, "right", new DirectionKeys(Keys.A, Keys.S, Keys.W, Keys.D))); //red player facing left
grid = new int[this.Size.Width, this.Size.Height]; //create the grid map
drawThread = new Thread(drawBikes);

似乎第一个添加的球员总是在碰撞时获胜。当我改变将自行车添加到ArrayList的顺序(蓝色再加上第二个)时,红色获胜。我认为这与我检查碰撞的方式有关。我特别认为它与drawBikes中的foreach循环有关...

这是drawBikes方法:

while (true)
{

    ArrayList deleteBikes = new ArrayList();
    foreach (LightBike b in bikes)
    {
        if (isValidLocation(b.getNextLocation()))
        {
            canvas.DrawLine(new Pen(b.color, BIKE_SIZE), b.location, b.getNextLocation());
            b.location = b.getNextLocation();
            grid[b.location.X, b.location.Y] = bikes.IndexOf(b)+1;
        }
        else
        {
            deleteBikes.Add(b);
        }

为什么只有红色球员被移除而不是蓝色球员(因为他们两者应该基本上同时击中对方)?我应该创建更多线程吗?我觉得这是不必要的......

这是我的isValidLocation()代码:

public Boolean isValidLocation(Point x)
{
        if (x.X < this.Size.Width && x.X > 0)
            if (x.Y < this.Size.Height && x.Y > 0)
                if (grid[x.X, x.Y] == 0)
                    return true;

    return false;
}

1 个答案:

答案 0 :(得分:2)

我相信你的问题是你正在调用getNextLocation(),然后在你的每个循环中直接进行碰撞检查。如果自行车A是第一个在循环中处理的,它的位置会更新,发现与自行车B发生碰撞,并且可能已删除(我不知道你在其他地方之后使用deleteBikes列表做了什么声明)。当环路移动到自行车B上时,不再有另一辆自行车碰撞。

您的代码应该:

  1. 绕过自行车并更新他们在网格上的位置。
  2. 在自行车上循环,检查每个自行车是否处于碰撞状态,并执行碰撞逻辑。
  3. 将每辆自行车拉到新位置。
  4. 如果自行车在步骤2中发生碰撞,则会将其从自行车列表中删除(或以某种方式标记),并且不会在步骤3中绘制。 这里的关键是在检查碰撞之前完全更新自行车的位置,并且延迟绘制直到处理完所有碰撞逻辑。