0

Ok、

私は敵のマトリックスを持っていますEnemy enemyGrid[x, y]

次に、私のコードで、次のように呼び出すことで、敵の1つのインスタンスを取得しますEnemy tmp = enemyGrid[a, b]

しかし、tmpのプロパティを変更した場合、次にオブジェクトをマトリックスから同じオブジェクトtmpにロードしたときに反映されません。

tmpを終了するたびに= null、変更をグリッド内のオブジェクトに反映させる必要がありますか?

何故ですか?tmpはオブジェクトへの参照を保持するだけで、変更はメインオブジェクトで直接行われると思いました。

ありがとう。

コードの更新:

グリッドへの入力:

Enemy [,] spriteGrid = new Enemy[countCols, countRows];
spriteGrid[x, y] = new Enemy();

オブジェクトにアクセスしてプロパティを変更します。

Enemy tmp = spriteGrid[i, j];

tmp.canShoot = true;
tmp.Update(gameTime, game.Window.ClientBounds);
tmp.canShoot = false;

最後の行(canShoot = false)は、グリッドに格納されているオブジェクトに反映されません。

4

1 に答える 1

3

この線

Enemy tmp = enemyGrid[a, b]

マトリックスにオブジェクトのコピーを作成しません。同じオブジェクトインスタンスへのエイリアスを作成します。tmpを変更すると、エイリアスするグリッド内のインスタンスに影響します。

発生している問題を示す短い完全なコードスニペットを投稿してください。

アップデート

サンプルでは、

tmp.canShoot = true;

しかしその後

tmpEnemy.canShoot = false;

2つの異なる変数。

アップデート2

@Amryのコメントも正確です... Enemyクラスではなく構造体である場合、これはまさにこの動作になります。これは、struct値型であるためです。つまり、割り当てによってエイリアスではなくコピーが作成されます。

非常に特殊な場合を除いて、変更可能な構造体(つまり、最初に作成された後に値が変更される可能性がある構造体)を使用しないでください。

于 2012-07-29T03:05:47.720 に答える