C# - Console如何获取每帧的输入

时间:2016-07-13 05:25:25

标签: c# ascii

所以,我很无聊并决定在C#中编写一个ASCII游戏以获得它的乐趣,而且我有绘图,清理,更新等等。虽然,我只是在一个部分,输入。我希望每一帧都能输入,没有玩家按下回车,到目前为止,玩家必须按Enter键,但它没有做任何事情。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;

namespace ASCII
{
    public static class Game
    {
        static string map = File.ReadAllText("Map.txt");
        public static void Draw()
        {
            Console.CursorVisible = false;
            Console.WriteLine(map);
        }

        public static void Update()
        {
            Clear();
            Input();
        }

        public static void Input()
        {
            string input = Console.ReadLine();

            switch (input)
            {
                case "a":
                    //Do something
                    break;
            }
        }

        public static void Clear()
        {
            Console.Clear();
            Draw();
        }
    }
}

正如你在Input() void中看到的那样,它每帧都会输入,但我只想得到它一次,做一个移动方法或稍后我会实现的东西。

BTW Map.txt显示:

###################

# #

# @ # #

######## #

# #

# #

# #

# #

# #

# #

# #

###################

2 个答案:

答案 0 :(得分:3)

Console.ReadLine将等待enter-key继续使应用程序类型为模态。你想要的是在concole上处理键盘事件。因此,您可以使用ReadKey代替:

var input = Console.ReadKey(true);

switch (input.Key)
{
    case ConsoleKey.A:
        //Do something
        break;
}

要保持移动,您可以循环实现此功能。这里的关键是记住你当前的行动直到下一个关键事件通过

int action = 0;
while(!exit) 
{
    // handle the action
    myPlayer.X += action; // move player left or right depending on the previously pressed key (A or D)

    if(!Console.KeyAvailable) continue;
    var input = Console.ReadKey(true);

    switch (input.Key)
    {
        case ConsoleKey.A:
            action = -1
            break;
        case ConsoleKey.D:
            action = 1
            break;
    }    
}

答案 1 :(得分:1)

我不确定我是否正确理解了这个问题,但如果我这样做了,您可以在阅读之前使用Console.KeyAvailableConsole.ReadKey检查密钥是否可用。

类似于:

public static void Input()
{
   if(!Console.KeyAvailable) return;
   ConsoleKeyInfo key = Console.ReadKey(true);

   switch (key.Key)
   {
      case ConsoleKey.A:
         //Do something
          break;
   }
}