Как реализовать ввод без входа в консольную игру C ++ - PullRequest
0 голосов
/ 19 января 2019

Я застрял с вводом без ввода ввода. Я попытался использовать kbhit () + getch () из conio.h, и он не работает в моей системе (Win10 и Ubuntu - unistd.h и termios.h). Программа просто пропускает блок с этими функциями.
Затем я использовал GetAsynkKeyState из windows.h. Он работает в игре (уровень), хотя глючит, но не в меню. Программа также пропускает (или что-то) блок с отправкой ввода.
Вход в меню:

// The menu interface
bool Menu::SelectLevel() {
    cout << "Select the level:" << endl;
    size_t arrow_pos = 0;
    // Prints level's names and char to exit the game
    for (size_t i = 0; i <= _levels.size(); ++i) {
        // Draw arrow before selected level
        if (i == arrow_pos) {
            cout << '>' << i + 1 << " - " << _levels[i].first[0] << endl;;
        }
        // Draw arrow before the exit select
        else if (i == _levels.size() && i == arrow_pos) {
            cout << '>' << "Exit" << endl;
        }
        // Draw the exit option
        else if (i == _levels.size()) {
            cout << ' ' << "Exit" << arrow_pos << endl;
        }
        // Draw levels list
        else {
            cout << ' ' << i + 1 << " - " << _levels[i].first[0] << endl;
        }
    }
    // Input from keyboard TODO DOESN'T WORK!:
    // If 's' pressed move arrow down
    PoollingDelay(1);
    if (GetAsyncKeyState(0x53) & 0x8000) {
        ++arrow_pos;
        // If arrow reached top it goes to the bottom
        if (arrow_pos == _levels.size() + 1) {
            arrow_pos = 0;
        }
    }
    // If 'w' pressed move arrow up
    else if (GetAsyncKeyState(0x57) & 0x8000) {
        --arrow_pos;
        // If arrow reached bottom it goes to the top
        if (arrow_pos == 65535) {
            arrow_pos = _levels.size() + 1;
        }
    }
    // If Return pressed
    else if (GetAsyncKeyState(VK_RETURN) & 0x8000) {
        // Don't think it would be worthy
        if (arrow_pos < 1 || arrow_pos > _levels.size() - 1) {
            throw runtime_error("Wrong select: " + to_string(arrow_pos));
        }
        // If player tired of this shit
        if (arrow_pos == _levels.size() - 1) {
            ClearTerminal();
            return false;
        }
        // Play
        PlayLevel(arrow_pos);
    }
    ClearTerminal();
    return true;
}

Уровень ввода:

// TO DO DOESN'T WORK!:
void Level::ReadCommand() {
    PoollingDelay(100);
    if (GetAsyncKeyState(0x57)) {
        Move(_NORTH);
    }
    else if (GetAsyncKeyState(0x41)) {
        Move(_WEST);
    }
    else if (GetAsyncKeyState(0x53)) {
        Move(_SOUTH);
    }
    else if (GetAsyncKeyState(0x44)) {
        Move(_EAST);
    }
    else if (GetAsyncKeyState(0x45)) {
        throw runtime_error(exit_the_lvl);
    }
}

1 Ответ

0 голосов
/ 19 января 2019

Краткий ответ: вы не можете использовать только C ++ и его стандартную библиотеку.

Это потому, что язык не предназначен для обработки аппаратных событий низкого уровня.Для этого вам нужно полагаться на отдельную библиотеку, предназначенную для обработки ввода-вывода.Многие из них более или менее просты для интеграции.Для простых игр подойдет SDL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...