所以我试图在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;
}
答案 0 :(得分:2)
我相信你的问题是你正在调用getNextLocation()
,然后在你的每个循环中直接进行碰撞检查。如果自行车A是第一个在循环中处理的,它的位置会更新,发现与自行车B发生碰撞,并且可能已删除(我不知道你在其他地方之后使用deleteBikes
列表做了什么声明)。当环路移动到自行车B上时,不再有另一辆自行车碰撞。
您的代码应该:
如果自行车在步骤2中发生碰撞,则会将其从自行车列表中删除(或以某种方式标记),并且不会在步骤3中绘制。 这里的关键是在检查碰撞之前完全更新自行车的位置,并且延迟绘制直到处理完所有碰撞逻辑。