Как обработать несколько нажатий клавиш сразу с SDL?

Одно место я натыкался на него, находится в контейнерах, которые выделяют непрерывный буфер и затем заполняют его объектами как требуется. Как упомянуто, станд.:: вектор мог бы сделать это, и я знаю некоторые версии MFC, CArray и/или CList сделали это (потому что это - то, где я сначала натыкался на него). Буферный сверхметод назначения является очень полезной оптимизацией, и новое размещение является в значительной степени единственным способом создать объекты в том сценарии. Это также используется иногда для построения объектов в блоках памяти, выделенных за пределами прямого кода.

я использовал его в подобной способности, хотя это часто не подходит. Это - полезный инструмент для панели инструментов C++, все же.

12
задан Tim 10 August 2009 в 03:17
поделиться

4 ответа

Хорошим подходом будет написать обработчик клавиатуры («ввод»), который будет обрабатывать события ввода и сохранять состояние события в какой-то структуре (ассоциативный массив звучит хорошо - key [keyCode ]).

Каждый раз, когда обработчик клавиатуры получает событие «нажата клавиша», он устанавливает ключ как включенный (true), а когда он получает событие нажатия клавиши, он устанавливает его как отключенный (false).

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

Некоторый быстрый псевдокод:

class KeyboardHandler {
    handleKeyboardEvent(SDL Event) {
        keyState[event.code] = event.state;
    }

    bool isPressed(keyCode) {
        return (keyState[keyCode] == PRESSED);
    }

    bool isReleased(keyCode) {
        return (keyState[keyCode] == RELEASED);
    }

    keyState[];
}

...

while(SDL Pull events)
{
    switch(event.type) {
        case SDL_KEYDOWN:
        case SDL_KEYUP:
                keyHandler.handleKeyboardEvent(event);
            break;
        case SDL_ANOTHER_EVENT:
                ...
            break;
    }   
}

// When you need to use it:
if(keyHandler.isPressed(SOME_KEY) && keyHandler.isPressed(SOME_OTHER_KEY))
    doStuff(TM);
14
ответ дан 2 December 2019 в 03:49
поделиться

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

SDL_GetKeyState ()

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

18
ответ дан 2 December 2019 в 03:49
поделиться

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

Таким образом, вместо (псевдокода):

on keydown:
    case left_key:
        object.setMovement(left)
    case forward_key:
        object.setMovement(forward)

вместо этого у вас будет что-то вроде (снова псевдокод):

on keydown:
    case left_key:
        keystates[left] = true
        object.updateMovement(keystates)
    case forward_key:
        keystates[forward] = true
        object.updateMovement(keystates)

on keyup:
    case left_key:
        keystates[left] = false
        object.updateMovement(keystates)
    case forward_key:
        keystates[forward] = false
        object.updateMovement(keystates)

Тогда процедура updateMovement будет смотреть на keystates и вычислить составное перемещение на основе состояний всех клавиш перемещения вместе.

3
ответ дан 2 December 2019 в 03:49
поделиться

Хорошим подходом будет написание обработчика клавиатуры («ввод»), который будет обрабатывать события ввода и сохранять события состояние в какой-то структуре (ассоциативный массив звучит хорошо - key [keyCode]).

Каждый раз, когда обработчик клавиатуры получает событие «нажата клавиша», он устанавливает ключ как включенный (истина), а когда он получает событие нажатия клавиши, он устанавливает его как отключенное (ложное).

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

0
ответ дан 2 December 2019 в 03:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: