2013-04-08 118 views
1

我目前正在研究c#中的roguelike。 世界,玩家等在控制台内呈现。但是当控制台中的变化太多时,它会滞后。 为了绕过这一点,我试图让程序等待玩家解除玩家按下的键。 任何人都有如何做到这一点的想法? 不好,那是不是像Console.ReadKeyUp()控制台应用程序等待keyup

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

      } 

     } 

下面是什么样子:

enter image description here

+1

控制台用于简单但基本的输入和输出功能。改为编写游戏的GUI。 (这不是DOS天!) – 2013-04-08 15:04:16

+0

通过控制台你的意思是*控制台(文本I/O)?!游戏世界如何在控制台内呈现?! – Mahm00d 2013-04-08 15:07:12

+0

这是这样呈现的:http://puu.sh/2whk6 – Hobbit9797 2013-04-08 15:08:13

回答

2

没有重构这个应用程序变成事件驱动的格式(带消息l的隐藏窗口OOP等),你最好的选择是挖掘WinAPI中可用的各种功能。这样的事情可能工作:

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

您可以使用此功能来查询全键盘的状态 - 它返回一个包含键盘的状态的256字节数组。请参阅:here for more和一些示例。

你也可以,例如,使用Console.ReadKey()然后阻塞,直到GetKeyState()回报问题的关键低阶0

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

见:here for more和实例。

MSDN:GetKeyState; GetKeyboardState

相关问题