2015-06-13 34 views
4

虽然寻找了检测在SDL一次2多个密钥的方法,我碰到这段代码来找SDL的1.x:SDL_Keycodes太大,无法存储

//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

你可以使用'std :: map',这样你就不会遇到这个问题。具体而言,我不认为SDL2中有很多可以帮助你。 – olevegard

+0

@olevegard完美!你介意将此作为答案吗? –

回答

3

首先,bool s不会默认任何东西C++,您需要初始化它们。他们似乎始终是true的事实是它们的大小为byte。这意味着它们的尺寸介于0255之间(含)。只有0意味着false所以它的一个255/256几率true


至于你的解决方案,你会简单地定义你的std::map就象这样:

std::map<SDLKey, bool> keyMap; 

std::map最初是空的,所以你需要检查的项目确实存在,当你尝试看看它向上。

bool SetIsKeyDown(SDLKey key, bool isDown) 
{ 
    keyMap[key] = isDown 
} 

所以其实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; 
} 

当您尝试设置的项目,它将automtically得到,如果不存在,它创建它。你可以,如果你想,但它不需要像数组一样。

+2

在编辑中更改了一些内容。它是一个std :: pair,第一个对象包含key,第二个对象包含value,因此,return(* it);'不起作用,'return it-> second;'将起作用。另外,'it'将等于'keyMap.end();'如果它是* NOT *,那么正确的代码是'if(it == keyMap.end();'。虽然:) – ThatPixelCherry

+2

@ThatPixelCherry谢谢,我应该学会在我提交之前通过编译器运行我的代码... – olevegard

+0

哈哈没问题:) – ThatPixelCherry