我正在为UWP编写一个简单的2D游戏引擎。我有一个从XNA获取的代码片段,检查是否按下某个键(见下文),我正在尝试做类似的事情。
事实上,在我的游戏引擎中,我宁愿不使用专用事件处理程序(KeyDown等),而只是检查游戏循环中的按键 - 如果可以的话。这样做的一个原因是我可以控制例如如果持续按下按键(使用计时器和模式),子弹会发射的频率。它还可以让键彼此独立,例如向上和向右箭头键为玩家1提供对角线移动,而另一个玩家(使用相同的键盘)使用键A和W在另一个方向上移动他/她的角色,他们偶尔都会发射激光枪。最后,我一直考虑使用与我的其余游戏代码分开工作的事件处理程序,导致缺乏控制。对于KeyPress事件,我认为尤其如此。
我找到的代码如下:
public void DrawHelp()
{
if (Keyboard.GetState().IsKeyDown(Keys.Tab))
{
..这就是我正在尝试使用的东西。但是,对于我来说,在Intellisense中没有出现Keyboard类词(尽管默认情况下附加了Windows.UI.Xaml.Input; using)。
我所想的基本上是一系列if语句(代码错误 - 它只是为了展示我想要的东西):
int counter = 0;
// Raised every tick while the DispatcherTimer is active.
private void EachTick(object sender, object e)
{
TrackKeyboard();
CalculateMoves();
Physics.CollisionDetection();
DrawGame();
}
private void TrackKeyboard()
{
if (Keyboard.GetState().IsKeyDown(Keys.P)) PauseGame();
if (counter % 10 == 0) //control movements
{
if (Keyboard.GetState().IsKeyDown(Keys.Down)) AddSpeed("Player1", 0, -1);
if (Keyboard.GetState().IsKeyDown(Keys.Left)) AddSpeed("Player1", -1, 0);
if (Keyboard.GetState().IsKeyDown(Keys.Up)) AddSpeed("Player1", -1, 0);
if (Keyboard.GetState().IsKeyDown(Keys.Right)) AddSpeed("Player1", 0, 1);
if (Keyboard.GetState().IsKeyDown(Keys.W)) AddSpeed("Player2", -1, 0);
if (Keyboard.GetState().IsKeyDown(Keys.D)) AddSpeed("Player2", 0, 1);
if (Keyboard.GetState().IsKeyDown(Keys.S)) AddSpeed("Player2", -1, 0);
if (Keyboard.GetState().IsKeyDown(Keys.A)) AddSpeed("Player2", 0, 1);
}
if (counter % 5 == 0) //fire
{
if (Keyboard.GetState().IsKeyDown(Keys.Space)) Fire("Player1");
if (Keyboard.GetState().IsKeyDown(Keys.X)) Fire("Player2");
}
}
那么,是否有可能在UWP中写这样的东西,如果是这样的话:怎么样?
我已经对Bing和Google进行了一些搜索,但是关于UWP的信息仍然很少。
我在CodeProject上发现了一个类似的问题(https://www.codeproject.com/Questions/1107441/How-do-I-register-events-from-two-players-in-UWP),但我的回答太难了,无论如何,我更倾向于在游戏循环中包含这些代码,如上所述上方。
(另请告诉我,如果由于某些我可能不知道的技术原因,我试图采取的路线是愚蠢的。)
非常感谢新年快乐!
皮特
答案 0 :(得分:1)
在UWP中,您应该使用以下方法从CoreWindow
检查密钥状态:
Window.Current.CoreWindow.GetKeyState(VirtualKey).HasFlag(CoreVirtualKeyStates);
您必须指定要获取信息的密钥和状态,例如:
if(Window.Current.CoreWindow.GetKeyState(VirtualKey.Escape).HasFlag(CoreVirtualKeyStates.Down))
{
// Escape key pressed
}
您不仅要比较GetKeyState
方法返回的值,还要这样:
Window.Current.CoreWindow.GetKeyState(VirtualKey) == CoreVirtualKeyStates.Down;
因为当按下该键时它可以返回CoreVirtualKeyStates.Down | CoreVirtualKeyStates.Locked
,然后条件将为假。