だから私は C#.NET で Tron LightBike ゲームを作ろうとしていますが、2 人のプレイヤーが同時に衝突 (または正面衝突) すると問題が発生します。
プレーヤーを初期化する方法は次のとおりです...
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 に追加される順序を変更すると (青が 2 番目に追加されます)、赤が優先されます。衝突をチェックしている方法と関係があると思います。具体的には、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;
}