Как обновить консоль без мерцания и получить ввод с клавиатуры в C ++ - PullRequest
2 голосов
/ 21 марта 2020

Я пишу простую консольную игру, и у меня возникают проблемы с мерцанием консоли (я думаю, что система ("cls") может быть проблемой?). Я пытался использовать двойные буферы, но я все испортил, я думаю. Я знаю, что функция Move () не работает полностью правильно, но этого достаточно, чтобы показать движение на консоли. Я также не уверен насчет kbhit и getch, так как их использование не рекомендуется. Какие есть хорошие альтернативы?

    void Snake::DrawBuffer()
{
    for (int i = 0; i < HEIGHT; i++)
    {
        for (int j = 0; j < WIDTH; j++)
        {
            std::cout << buffer[WIDTH * i + j];
        }
        std::cout << '\n';
    }
}

void Snake::WriteNextBuffer()
{
    for (int i = 0; i < WIDTH * HEIGHT; i++)
        nextbuffer[i] = ' ';

    for (int i = 0; i < length; i++)
        nextbuffer[body[i]] = 'o';

}

void Snake::WriteBuffer()
{
    for (int i = 0; i < WIDTH * HEIGHT; i++)
    {
        buffer[i] = nextbuffer[i];
    }
}

void Snake::Move()
{
    char key;

    if (_kbhit())
        key = _getch();
    else
        key = lastkey;
    switch (key)
    {
    case 'w':
        if (lastkey != 's')
        {
            body.pop_back();
            body.emplace(body.begin(), head - WIDTH);
        }
        break;
    case 's':
        if (lastkey != !'w')
        {
            body.pop_back();
            body.emplace(body.begin(), head + WIDTH);
        }
        break;
    case 'a':
        if (lastkey != 'd')
        {
            body.pop_back();
            body.emplace(body.begin(), head - 1);
        }
        break;
    case 'd':
        if (lastkey != 'a')
        {
            body.pop_back();
            body.emplace(body.begin(), head + 1);
        }
        break;
    }
    head = body[0];
    lastkey = key;
}

void Snake::Frame()
{
    Move();
    WriteNextBuffer();
    WriteBuffer();
    DrawBuffer();
}

void Snake::Game()
{
    while (1)
    {
        Frame();
        system("cls");
    }
}
...