SDL_Key-коды слишком велики для хранения

При поиске методов обнаружения нескольких ключей одновременно в 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?

1 ответ

Решение

Прежде всего, 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 изначально пусто означает, что вам не нужно заполнять его. Вы можете, если хотите, но это не обязательно, как с массивом.

Другие вопросы по тегам