首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL_Keycodes太大,无法存储

SDL_Keycodes太大,无法存储
EN

Stack Overflow用户
提问于 2015-06-13 06:42:44
回答 1查看 1K关注 0票数 4

在搜索SDL 2中一次检测多个键的方法时,我看到了SDL1.x的这段代码:

代码语言:javascript
复制
//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>中实现它,但是有了up按钮的Segmentation fault: 11

这就是我看这个的时候:https://wiki.libsdl.org/SDLKeycodeLookup

大多数“特殊”键,包括箭头、函数、符号等等,都有数十亿的小数表示。

即使打开了简单的代码printf("%d\n", e.key.keysym.sym);,比如up按钮也会给出:

代码语言:javascript
复制
1073741906
Segmentation fault: 11

我在Mac上,如果它与错误代码有任何区别的话。

那么,SDL 2中有什么解决方案呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-13 07:20:56

首先,bool不默认为C++中的任何内容,您需要对它们进行初始化。它们看起来总是true的事实是,它们的大小是byte。这意味着它们的大小介于0255之间。只有0的意思是false,所以这是true255 / 256机会。

至于您的解决方案,您只需将std::map定义为:

代码语言:javascript
复制
std::map<SDLKey, bool> keyMap;

一个std::map最初是空的,所以当您试图查找它时,您需要检查这些项是否实际存在。

代码语言:javascript
复制
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; 
}

当您试图设置一个项时,如果它不存在,它将自动创建:

代码语言:javascript
复制
bool SetIsKeyDown(SDLKey key, bool isDown)
{
    keyMap[key] = isDown
}

因此,std::map最初是空的,这意味着您不需要填充它。你可以,如果你想,但它不是必需的,因为它是一个数组。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30815857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档