0

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

вот как это выглядит

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;

namespace test { class player { public int x = 1; public int previousX = 1; public void SetPosition() { Console.SetCursorPosition(previousX, 5); Console.Write(' '); Console.SetCursorPosition(x, 5); Console.Write('0'); previousX = x; } } class Program { static void Main() { Console.CursorVisible = false;

        player p1 = new player();
        p1.x = 1;
        p1.previousX = 1;

        while (true)
        {
            p1.SetPosition();

            while (Console.KeyAvailable == false) { }
            if (Console.KeyAvailable == true)
                p1.x = ChangePlayerPossition(Console.ReadKey(true).Key, p1.x);
        }
    }

    // Изменение координат
    static int ChangePlayerPossition(ConsoleKey key, int x)
    {
        switch (key)
        {
            case ConsoleKey.LeftArrow:
                if (x - 1 > 5) { x--; }
                break;
            case ConsoleKey.RightArrow:
                if (x + 1 < 70) { x++; }
                break;
        }

        return x;
    } 



}

}

Может выглядит криво, не спорю. Я думал, что тут этой штуки не будет. Как бы не так

вот как это тут работает

игрок передвигается на 1 позицию вперед, застывает, а потом начинает двигаться, пока не отожму клавишу...

Может тут дело в реализации и нужно в потоки лезть? Или тут уже ничего не поможет? Вам лично было бы нормально играть в игру с такой темой (как на первой гифке? (тип, может так оставить? :D))

strigrt
  • 101
  • 1
    Просто ремарка про while (Console.KeyAvailable == false). Я же вроде вам писал пример. Надо писать while (!Console.KeyAvailable), то же самое про if (Console.KeyAvailable). А то вы пишете что-то типа while (true == true), когда можно писать просто while (true). – aepot Apr 19 '21 at 21:34
  • 1
    Видимо у вас в коде отрисовка идёт только при нажатии клавиши, а нужно делать не так. –  Apr 20 '21 at 03:01
  • видимо придется изучать потоки – strigrt Apr 20 '21 at 05:25
  • @aepot а как это реализовать? Я просто пытался, но чето не то выходит... Тип, там главный поток считывает нажата ли кнопка. Если нажата, то мы запускаем поток с повторением кадров, а если отжата, то ставим его на паузу? – strigrt Apr 20 '21 at 05:29
  • 1
    Как это реализовать, я уже вам говорил и ссылку на решение давал. – aepot Apr 20 '21 at 05:54

0 Answers0