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显示以下内容:
###################
# #
# @ # #
######## #
# #
# #
# #
# #
# #
# #
# #
###################
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.KeyAvailable
和 Console.ReadKey
在阅读之前检查密钥是否可用。
所以像这样:
public static void Input()
{
if(!Console.KeyAvailable) return;
ConsoleKeyInfo key = Console.ReadKey(true);
switch (key.Key)
{
case ConsoleKey.A:
//Do something
break;
}
}