Я пытаюсь создать оконную игру консоли С#, в которой я перемещаю объект «M» по оси x с помощью клавиш со стрелками вверх и вниз.
Я не могу понять, как заставить другой объект говорить «S», чтобы следовать за мной вверх и вниз, где бы ни находился объект «M». «M» будет расположен слева от окна консоли, то есть X = 0. Тогда как «S» должен быть расположен на противоположной границе, то есть X = 100.
Я использовал общедоступные свойства int X и Y в абстрактном классе. Более того, я использую абстрактный метод, чтобы заставить объекты двигаться.
Есть два производных класса Martian и SpaceShip. У меня работает движение клавиши со стрелкой объекта «M». Мне просто нужно закодировать класс космического корабля, чтобы объект «S» следовал за «M».
//In Martian Class
public override void Draw()
{
int x = 0;
int y = 0;
X = x;
Y = y;
ConsoleKeyInfo keyInfo;
while(true)
{
keyInfo = Console.ReadKey(true);
Console.Clear();
switch (keyInfo.Key)
{
case ConsoleKey.UpArrow:
Y--;
Console.SetCursorPosition(X,Y);
Console.WriteLine("M");
break;
case ConsoleKey.DownArrow:
Y++;
Console.SetCursorPosition(X,Y);
Console.WriteLine("M");
break;
}
}
}
//In SpaceShip Class
public override void Draw()
{
//How do I make the "S" follow "M"?
}
Я ожидаю, что «S» будет следовать за «M» по вертикали, но будет располагаться напротив границ окна.
Любая помощь приветствуется. Заранее спасибо.
Я думаю, что ваши методы Draw делают многое. Они должны отвечать только за отрисовку объекта на экране. Перемещение объектов и управление клавиатурой должно выполняться где-то еще.
Вот мое решение:
using System;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
Martian m = new Martian();
SpaceShip s = new SpaceShip();
const int MaxY = 100;
m.Draw();
s.X = m.X + 100;
s.Y = m.Y;
s.Draw();
ConsoleKeyInfo keyInfo;
while (true)
{
keyInfo = Console.ReadKey(true);
Console.Clear();
switch (keyInfo.Key)
{
case ConsoleKey.UpArrow:
if (m.Y > 0)
{
m.Y--;
}
break;
case ConsoleKey.DownArrow:
if (m.Y < MaxY)
{
m.Y++;
}
break;
}
m.Draw();
s.X = m.X + 100;
s.Y = m.Y;
s.Draw();
}
}
}
public abstract class GameObject
{
public int X { get; set; }
public int Y { get; set; }
public abstract void Draw();
}
public class Martian : GameObject
{
public override void Draw()
{
Console.SetCursorPosition(X, Y);
Console.WriteLine("M");
}
}
public class SpaceShip : GameObject
{
public override void Draw()
{
Console.SetCursorPosition(X, Y);
Console.WriteLine("S");
}
}
}
Вот это да. Благодаря тонну. Теперь я понимаю. Но мне также нужна многопоточность или таймер для перемещения символа S немного позже. Например, S следует за M через 1 или 2 секунды позже. Не могли бы вы рассказать мне, как это сделать? Более того, можно ли все это поместить в отдельный класс, а не использовать в основном классе?