Одно место я натыкался на него, находится в контейнерах, которые выделяют непрерывный буфер и затем заполняют его объектами как требуется. Как упомянуто, станд.:: вектор мог бы сделать это, и я знаю некоторые версии MFC, CArray и/или CList сделали это (потому что это - то, где я сначала натыкался на него). Буферный сверхметод назначения является очень полезной оптимизацией, и новое размещение является в значительной степени единственным способом создать объекты в том сценарии. Это также используется иногда для построения объектов в блоках памяти, выделенных за пределами прямого кода.
я использовал его в подобной способности, хотя это часто не подходит. Это - полезный инструмент для панели инструментов C++, все же.
Хорошим подходом будет написать обработчик клавиатуры («ввод»), который будет обрабатывать события ввода и сохранять состояние события в какой-то структуре (ассоциативный массив звучит хорошо - 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);
SDL отслеживает текущее состояние всех ключей. Вы можете получить доступ к этому состоянию через:
Итак, на каждой итерации вы можете обновлять движения на основе состояния ключа. Чтобы сделать движение плавным, вы должны обновить величину движения в зависимости от времени, прошедшего между обновлениями.
Вместо того, чтобы смотреть только на события нажатия клавиш, любое решение, которое будет заботиться о нескольких клавишах одновременно, должно будет смотреть как на события нажатия клавиш, так и на события нажатия клавиш, и отслеживать состояние рассматриваемых ключей.
Таким образом, вместо (псевдокода):
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
и вычислить составное перемещение на основе состояний всех клавиш перемещения вместе.
Хорошим подходом будет написание обработчика клавиатуры («ввод»), который будет обрабатывать события ввода и сохранять события состояние в какой-то структуре (ассоциативный массив звучит хорошо - key [keyCode]).
Каждый раз, когда обработчик клавиатуры получает событие «нажата клавиша», он устанавливает ключ как включенный (истина), а когда он получает событие нажатия клавиши, он устанавливает его как отключенное (ложное).
Затем вы можете проверить сразу несколько клавиш, не вызывая события напрямую, и вы сможете повторно использовать клавиатуру по всему кадру, не передавая ее подпрограммам.