1

だから私は 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;
}
4

1 に答える 1

2

あなたの問題はgetNextLocation()、 for each ループで衝突チェックが直接続いて呼び出していることだと思います。deleteBikes自転車 A がループで最初に処理される場合、その位置が更新され、自転車 B と衝突していることが判明し、おそらく削除されます ( else ステートメントの後でリストをどうするかはわかりません)。ループがバイク B に移動すると、衝突する別のバイクはなくなります。

コードは次のようにする必要があります。

  1. バイクをループして、グリッド上の位置を更新します。
  2. バイクをループし、それぞれが衝突しているかどうかを確認し、衝突ロジックを実行します。
  3. 各バイクを新しい位置に描画します。

ステップ 2 で自転車が衝突した場合、自転車は自転車のリストから削除され (または何らかの方法でフラグが付けられ)、ステップ 3 では描画されません。すべての衝突ロジックが処理されるまで、描画は延期されます。

于 2012-04-07T06:24:51.327 に答える