我有一个简单的 WinForms 游戏,玩家可以在表单上驾驶汽车。可以有更多的汽车,每辆汽车都由不同的玩家驾驶。
当一个键被按下时,Form1_KeyDown 被触发。现在我需要确定:
- 哪个玩家按下了键
- 钥匙代表什么(例如上,下,向左..)
我提出的唯一解决方案是为每个玩家创建一个 Keys 数组,其中每个索引都意味着不同的命令(例如,array[0] = go up,array[1] = go down,等等)
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 获取索引而无需再通过一次循环来查找索引代表什么?