所以,我很无聊并决定在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显示:
###################
# #
# @ # #
######## #
# #
# #
# #
# #
# #
# #
# #
###################
答案 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.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;
}
}