VaiShankar Ответов: 2

Как использовать таймер/ задержку для перемещения объекта или персонажа в окне консоли?


Я пытаюсь создать консольную игру, в которой символ "м", как в "Марсианине", и символ "С", как в "SpaceCreature", остаются противоположными на обоих концах оси X и перемещаются вверх и вниз по оси Y.

Я использую клавиши со стрелками, чтобы заставить "м" двигаться вверх и вниз. Но буква "С" тоже должна двигаться, но сама по себе, когда движется буква "М". Мне нужно заставить букву " С "двигаться в более медленном темпе, чтобы следовать за буквой "М".

Что я уже пробовал:

На данный момент я вижу, как " М "движется вверх и вниз с помощью клавиш со стрелками, а "с" также движется одновременно.

Мне нужно заставить букву " С " двигаться медленнее. Я попробовал нить.Сон, но это просто заставляет " S " исчезнуть и появиться снова, как Глюк. Я думаю, что мне нужно использовать что-то под названием "консоль.keyAvailable", но мне трудно понять, где разместить эту функцию.

//X and Y get set constructors are defined in the abstract class:-SpaceObject 

public override void Draw()  //In both classes Martian and SpaceCreature
{
   Console.SetCursorPosition(X, Y);
   Console.WriteLine("S");  
   //In Martian class:- Console.WriteLine("M");
}
static void Main(string[] args)
{
   var m = new Martian(100, 10);
   var s = new SpaceShip(100, 10);

   const int MaxY = 25;

   m.Draw();  //Abstract override void method
   s.X = m.X + 100;
   s.Y = m.Y;
   s.Draw(); //Abstract override void method

   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();
      }
   }
} 

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Вы вообще не используете таймер. В очень простом способе сделать это, вы можете просто использовать текущую дату и время.Теперь оцените и запланируйте следующий ход. В цикле рисования, если запланированное время еще не наступило, вы не перемещаете символ.

// Schedule the next move for a half second from now.
DateTime schedMove = DateTime.Now().AddMilliseconds(500);

и в вашем взгляде, где вы определяете, нужно ли вам перемещать своего персонажа или нет, проверьте, не больше ли сейчас запланированной даты-времени:
if (DateTime.Now() >= schedMove)
{
    // Move your character coordinates.
    ...
    // Schedule the next move.
    schedMove = DateTime.Now().AddMilliseconds(500);

    // Draw your characters.
 }


Рейтинг:
2

Gerry Schmitz

Цитата:
Мне нужно заставить букву " С "двигаться в более медленном темпе, чтобы следовать за буквой "М".


Обновите оба одновременно; но обновите "S" с меньшим коэффициентом.

Если м авансам х, тогда s заранее на определенный процент от X.

Или, если M использует X шагов или "кадров" для продвижения, то пусть S использует только (X-1) шагов в том же временном интервале (остановитесь на один шаг вместо движения).