C# - 控制台 如何获取每帧的输入

本文关键字:输入 获取 控制台 何获取 | 更新日期: 2023-09-27 17:56:36

所以,我很无聊,决定用C#写一个ASCII游戏来取乐,我有绘图,清除,更新等。虽然,我被困在一个部分,输入。我想在每一帧都获得输入,而无需播放器按回车键,到目前为止,播放器必须按回车键,但它什么也没做。

这是我的代码:

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()空白中看到的那样,它每帧都会获得输入,但我只想获取一次,即执行移动方法或稍后将实现的内容。

BTW地图.txt显示以下内容:

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

# #

# @ # #

######## #

# #

# #

# #

# #

# #

# #

# #

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

C# - 控制台 如何获取每帧的输入

Console.ReadLine将等待回车键继续使应用程序成为模态。相反,你想要的是处理 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;
    }    
}

我不确定我是否正确理解了这个问题,但如果我理解了,您可以使用 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;
   }
}