プレイヤーがフォーム上で車を運転できるシンプルな WinForms ゲームがあります。それぞれ異なるプレイヤーが運転する車が増える可能性があります。
キーが押されると、Form1_KeyDown が発生します。今、私は決定する必要があります:
- どのプレイヤーがキーを押したか
- キーは何を表していますか (例: go up, go down, go left..)
私が思いついた唯一の解決策は、各インデックスが異なるコマンドを意味するすべてのプレーヤーの Keys 配列を作成することでした (たとえば、array[0] = 上に移動、array[1] = 下に移動など)。
public Keys[] keyControls = new Keys[5]; // up, down, left, right and fire key codes!
次に、すべての Player とすべての Key を繰り返し処理して、正しいものを見つける必要があるため、次のようになります。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
foreach (Car car in cars)
{
for (int i = 0; i < car.keyControls.length; i++)
{
if (car.keyControls[i] == e.KeyData)
{
// save car, index (for movement type) and double break the loops with flags
}
}
}
// do something with found car and movement index (movement type)
}
しかし、私はできるだけ「素敵な」最適化されたコードを持ちたいので、次のようなLinqを使用することを考えていました:
Cars car = cars.First(t => t.keyControls.Any( m => m == e.KeyData));
しかし、そうなると動きの指標がつかめないので、車をどうするか判断できません。
キーデータを別の「オブジェクト」に保存する必要がありますか? または、ループをもう一度実行してインデックスが何を表しているかを調べることなく、Linq からインデックスを取得することは可能ですか?