我在将Monogame用于C#,并且发现一行代码使我感到困惑。
if (Keyboard.GetState().IsKeyDown(Keys.W))
{
}
好吧,以我的理解,“ Keyboard”是类,而“ GetState()”是“ Keyboard”类中的方法。但是,方法“ GetState()”如何访问 “ IsKeyDown(Keys.W)”这似乎是另一种方法。一个方法如何使用点运算符访问另一个方法。
答案 0 :(得分:2)
如注释中所述,这只是方法链接的一种情况。使用一个方法的结果调用下一个方法,依此类推。
要使其非常清晰,让我们将代码分开看一下是怎么回事。
var keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.W))
{
}
实际上,这里发生了很多事情。在MonoGame中,Keyboard
类是静态的,因此可以从任何地方调用其方法。当您调用GetState()
时,它将返回KeyboardState
类的实例,该实例保存了在调用方法时键状态的副本。
IsKeyDown
方法返回一个bool
,这就是为什么可以在if
语句中使用它来检查键是否真正按下的原因。
希望将原始代码与分解后的代码进行比较,您将看到如何在各种情况下使用方法链接。有时,这样分解代码会使代码更易于理解,而有时,将多个链接方法结合在一起也很容易理解(您通常会在LINQ代码中找到它)。
但是,这里有一个重要的区别。当您想一次检查多个按键组合时会发生什么?这段代码:
if (Keyboard.GetState().IsKeyDown(Keys.W))
{
}
if (Keyboard.GetState().IsKeyDown(Keys.S))
{
}
实际上与以下代码不同:
var keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.W))
{
}
if (keyboardState.IsKeyDown(Keys.S))
{
}
原因是,每次调用该方法时,调用Keyboard.GetState()
确实可以获取键盘状态。从技术上讲,这意味着在调用GetState
之间,按键状态可能已更改。
在大多数情况下,这并不重要,因为代码执行得足够快,因此不会引起注意。但是了解这一区别很重要,因为我已经看到了在代码的两个不同部分调用GetState
时会出现一些奇怪的错误的情况。特别是如果您持有“先前状态”的副本以检查关键帧之间的状态是否已更改。
因此,即使您可以这样的方法链,在这种情况下我也不推荐使用。如果每帧只调用一次GetState
,并在整个游戏代码中重复使用该状态,那么您的头痛将大大减轻。