控制台应用程序等待按键释放。

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;
                }

            }

        }

下面是它的外观:

请输入图像说明


1
控制台是用于简单但基本的输入和输出功能。相反,为游戏编写GUI界面。(现在已不是DOS时代了!) - Alvin Wong
你所说的控制台是指文本输入/输出吗?!一个游戏世界在控制台内是如何呈现的?! - Mahm00d
4
制作基于文本的控制台游戏并没有错。虽然ASCII艺术已经过时,但这并不妨碍我们怀念一下。 - J...
1
@Hobbit9797 - 你能给我们更多关于你的程序结构的信息吗?你是否使用消息处理器/调度器?展示一些你正在做事情的示例代码。你目前如何处理键盘输入? - J...
1
看起来有很多踩票,我猜是因为他敢做一个控制台游戏。问题在于高傲自大,因为跌得越高,就会摔得越惨! - Liam
显示剩余3条评论
1个回答

2
不对这个应用程序进行重构以转换为事件驱动格式(隐藏窗口和消息循环等),你最好的选择可能是深入挖掘WinAPI中可用的各种函数。类似以下代码可能会起作用:
 [DllImport("user32.dll")]
 [return: MarshalAs(UnmanagedType.Bool)]
 static extern bool GetKeyboardState(byte [] lpKeyState);

您可以使用此功能查询完整的键盘状态 - 它返回一个包含键盘状态的256字节数组。请参见:此处以获取更多信息和示例。
例如,您还可以使用Console.ReadKey(),然后阻塞直到GetKeyState()返回有关所涉及键的低位0
 [DllImport("user32.dll")]
 static extern short GetKeyState(VirtualKeyStates nVirtKey);

请看:这里获取更多信息和示例。
MSDN:GetKeyStateGetKeyboardState

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接