При поиске способов обнаружения нескольких ключей одновременно в SDL 2 я наткнулся на этот фрагмент кода для SDL 1.x:
//author: Rob Loach
// Global key buffer
bool keys[256];
while(SDL_PollEvent(&mainEvent))
{
if(mainEvent.type == SDL_KEYDOWN)
{
keys[mainEvent.key.keysym.sym] = true;
}
else if(mainEvent.type == SDL_KEYUP)
{
keys[mainEvent.key.keysym.sym] = false;
}
}
Я попытался реализовать его в SDL2 и std::array<bool, 256>
, но у меня было Segmentation fault: 11
с кнопкой вверх.
Вот когда я посмотрел на это: https://wiki.libsdl.org/SDLKeycodeLookup.
Большинство «специальных» клавиш, включая стрелки, функции, символы и т. Д., Имеют десятичные представления в миллиардах.
Даже с простым кодом printf("%d\n", e.key.keysym.sym);
на, скажем, кнопка вверх дает:
1073741906
Segmentation fault: 11
Я на Mac, если это имеет какое-либо значение с кодами ошибок.
Итак, какие решения есть в SDL 2?
Прежде всего, bool
не по умолчанию ничего в C++
нужно их инициализировать. Тот факт, что они, кажется, всегда true
это то, что они byte
по размеру. Это означает, что они имеют размер между 0
а также 255
включительно. Только 0
будет означать false
так что это 255 / 256
шанс true
,
Что касается вашего решения, вы бы просто определить свой std::map
как это:
std::map<SDLKey, bool> keyMap;
std::map
изначально пуст, поэтому вам нужно проверить, что элементы действительно существуют, когда вы пытаетесь найти их.
bool IsKeyDown(SDLKey key)
{
// Look for element
auto it = keyMap.find(key);
if (it == keyMap.end())
// No element found, which means this key hasn't been pressed
return false;
// 'it' is an iterator, so we use * to return its value
return it->second;
}
Когда вы пытаетесь установить элемент, он автоматически создается, если он не существует:
bool SetIsKeyDown(SDLKey key, bool isDown)
{
keyMap[key] = isDown
}
Так что факт std::map
изначально пусто означает, что вам не нужно заполнять его. Вы можете, если хотите, но это не обязательно, как с массивом.