Передача SDL KeyboardState (Uint8 *) в Lua

Я работаю над своим первым крупным проектом, и я решил интегрировать Lua с моей платформой C ++. Все разработано до сих пор, но единственным способом, которым мне удалось передать массив SDL_GetKeyboardState(NULL) в Lua, является создание таблицы Lua вручную.

void passKeyboard(const Uint8* keyboard){
    std::map<std::string,std::string> kmap;
    kmap.clear();
    kmap["UP"]=toString(keyboard[SDL_GetScancodeFromKey(SDLK_UP)]);
    kmap["DOWN"]=toString(keyboard[SDL_GetScancodeFromKey(SDLK_DOWN)]);
    kmap["LEFT"]=toString(keyboard[SDL_GetScancodeFromKey(SDLK_LEFT)]);
    kmap["RIGHT"]=toString(keyboard[SDL_GetScancodeFromKey(SDLK_RIGHT)]);
    ...
    vbind_SetTable("keyboard",kmap);
}

Теперь код работает и достаточно быстро для моих целей, но это, несомненно, некрасиво. Я даже чувствую себя грязным, глядя на него. Есть ли способ, которым я мог это сделать более элегантно?

Для справки, vbind.h:

void vbind_SetTable(const std::string &name,std::map<std::string,std::string> &t){
    lua_newtable(L);
    for(std::map<std::string,std::string>::iterator it=t.begin();it!=t.end();it++){
        lua_pushstring(L,it->first.c_str());
        std::string value=it->second;
        const char* p=value.c_str();
        char* end;
        long t=strtol(value.c_str(),&end,10);
        if(p!=end&&errno!=ERANGE){
            lua_pushnumber(L,t);
        }
        else{
            lua_pushstring(L,value.c_str());
        }
        lua_settable(L,-3);
    }
    lua_setglobal(L,name.c_str());
}
3 голоса | спросил proctree 16 Mayam15 2015, 00:32:24

1 ответ


1

Сначала вы рассмотрели Sol2 для привязки lua ( https://github.com/ThePhD/sol2)? Это очень легко использовать, мне это нравится.

С его помощью вы можете зарегистрировать функцию для lua, которая берет строку и возвращает bool, если нажата клавиша:

// something like this
bool KeyPressed(const std::string &key_name)
{
    auto key = SDL_GetKeyFromName(key_name.c_str());
    if (key == SDLK_UNKNOWN)
        return false;

    auto state = SDL_GetKeyboardState(NULL);
    return state[SDL_GetScancodeFromKey(key)];
}

С Sol2, супер каждый зарегистрировать функцию для lua (и вы можете легко интегрировать ее с обычным API-интерфейсом lua):

// sol2
sol::state lua;
// Or use sol::state_view(lua_State *L) with
// an existing lua_State
// i.e. 
//    sol::state_view lua(L);
lua.set_function("keypressed", KeyPressed);

Затем в вашем коде lua вы можете использовать функцию KeyPressed, как и следовало ожидать:

if keypressed("Left") then
    -- do stuff
end
ответил Andy M 22 PM00000070000004131 2016, 19:09:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132