我正在使用C#的Monogame,我注意到有一行代码把我搞糊涂了。
if (Keyboard.GetState().IsKeyDown(Keys.W))
{
}根据我的理解,"Keyboard“是一个类,"GetState()”是"Keyboard“类中的一个方法。然而,"GetState()“方法如何访问"IsKeyDown(Keys.W)”这似乎是另一种方法。一个方法如何使用点运算符来访问另一个方法。
发布于 2018-07-21 09:46:15
正如评论中提到的,这只是一个方法链接的例子。使用一个方法的结果调用下一个方法,依此类推。
为了让它变得非常清楚,让我们把代码拆开看看到底是怎么回事。
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时可能会导致一些奇怪的bug的情况。特别是当你拿着“前一个状态”的副本来检查关键点是否在帧之间改变了状态的时候。
所以,即使你可以像这样的方法链,在这种情况下我也不推荐这样做。如果每一帧只调用一次GetState,并在游戏代码中重用该状态,那么麻烦就会少得多。
https://stackoverflow.com/questions/51434313
复制相似问题