3

我目前正在使用 c# 开发 roguelike。世界、玩家等都在控制台内渲染。但是当控制台中的更改太多时,它就会滞后。为了绕过这个,我试图让程序等待播放器取消按下播放器正在按下的键。有人知道如何制作这个吗?糟糕,没有类似的东西Console.ReadKeyUp()

while(Console.KeyAvailable){
}

好像不行。。。

这是一段代码:

public void move(){
            if(!MainClass.loading){
                switch(Console.ReadKey().Key){
                    case ConsoleKey.NumPad8:
                        //walk up
                        break;
                    case ConsoleKey.NumPad4:
                        //walk left
                        break;
                    case ConsoleKey.NumPad6:
                        //walk right
                        break;
                    case ConsoleKey.NumPad2:
                        //walk down
                        break;
                    case ConsoleKey.NumPad7:
                        //walk left up
                        break;
                    case ConsoleKey.NumPad9:
                        //walk right up
                        break;
                    case ConsoleKey.NumPad1:
                        //walk left down
                        break;
                    case ConsoleKey.NumPad3:
                        //walk right down
                        break;
                    case ConsoleKey.NumPad5:
                        //eat
                        break;
                }

            }

        }

这就是它的样子:

在此处输入图像描述

4

1 回答 1

2

如果不将此应用程序重构为事件驱动格式(带有消息循环的隐藏窗口等),您最好的选择可能是挖掘 WinAPI 中可用的各种功能。像这样的东西可能会起作用:

 [DllImport("user32.dll")]
 [return: MarshalAs(UnmanagedType.Bool)]
 static extern bool GetKeyboardState(byte [] lpKeyState);

您可以使用此函数查询完整的键盘状态 - 它返回一个包含键盘状态的 256 字节数组。有关更多示例, 请参见:here 。

例如,您还可以使用Console.ReadKey()然后阻塞直到GetKeyState()返回相关键的低阶0

 [DllImport("user32.dll")]
 static extern short GetKeyState(VirtualKeyStates nVirtKey);

有关更多信息和示例,请参见:此处。

MSDN:GetKeyState获取键盘状态

于 2013-04-08T15:39:39.547 回答