【问题标题】:SDL_Keycodes are too big for storageSDL_Keycodes 太大而无法存储
【发布时间】:2015-06-13 06:42:44
【问题描述】:

在 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 中有哪些解决方案?

【问题讨论】:

  • 您可以使用std::map,这样您就不会遇到这个问题。不过,我认为SDL2 对您没有什么特别的帮助。
  • @olevegard 完美!你介意把它写成答案吗?

标签: c++ segmentation-fault sdl-2 signed-integer


【解决方案1】:

首先,bools 不默认为C++ 中的任何内容,您需要对其进行初始化。它们似乎总是true 的事实是它们的大小是byte。这意味着它们的大小介于 0255 之间。只有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 最初为空的事实意味着您不需要填充它。如果你愿意,你可以,但它不像数组那样需要。

【讨论】:

  • 在编辑中更改了一些内容。 it 是一个 std::pair,第一个对象包含键,第二个对象包含值,因此,return (*it); 将不起作用,return it-&gt;second; 将起作用。此外,如果 NOT 找到 it 将等于 keyMap.end();,因此正确的代码是 if( it == keyMap.end();。不过感谢您的出色回答:)
  • @ThatPixelCherry 谢谢,我应该学会在提交之前通过编译器运行我的代码...
  • 哈哈没问题:)
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2014-10-11
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多