基本上我想写一个游戏,你可以拍摄东西。我的问题是,当我拍摄时,我无法移动,而对象没有到达控制台的末端,我尝试使用线程使其平行但它弄乱了以前坐标清理控制台。
static void ShootingLaser(int x,int y,string symbol)
{
Drawing(x, y, symbol);
Point basePoint = new Point(x,y);
while (y < Console.WindowWidth - 1)
{
Point lastLaserPoint = new Point(x, y);
y++;
DeletingLastDraw(lastLaserPoint.x, lastLaserPoint.y);
Drawing(x, y, symbol);
Thread.Sleep(30);
}
你觉得伙计们怎么样?你可以帮我弄清楚如何让它在没有烦扰控制台的情况下同时拍摄和移动吗?
答案 0 :(得分:1)
根据您对问题的描述,我猜测您绘制到屏幕并删除的代码看起来像这样:
private static void Drawing(int x, int y, string symbol)
{
Console.SetCursorPosition(x, y);
Console.Write(symbol);
}
private static void DeletingLastDraw(int x, int y)
{
Drawing(x, y, " ");
}
如果是这种情况,那么当多个线程尝试并绘制到屏幕时,光标可能会在Drawing
方法的两行之间移动。
您可以通过确保使用锁定同步绘制到屏幕的任何尝试来阻止这种情况:
private static object consoleLock = new object();
private static void Drawing(int x, int y, string symbol)
{
lock (consoleLock)
{
Console.SetCursorPosition(x, y);
Console.Write(symbol);
}
}
说了这么多之后,我建议不要为激光镜头启动一个单独的线程,而是使用标准的主更新/绘制循环来编写游戏,以便在固定的时间步长内更新场景,然后绘制整个场景。这将允许您处理诸如激光击中某些东西和消失等事情。