diff --git a/Engine.cc b/Engine.cc index f423d25..621b545 100644 --- a/Engine.cc +++ b/Engine.cc @@ -256,6 +256,11 @@ int Engine::loadModel(const string & name, bool static_data, float scale) return 0; } +bool Engine::isKeyDown(const std::string & key) +{ + return m_keysDown.find(key) != m_keysDown.end(); +} + /* called by SDL when the update timer expires */ Uint32 Engine::updateCallback(Uint32 interval, void * param) { @@ -336,6 +341,10 @@ void Engine::update() void Engine::key_event(int keysym, bool pressed) { + if (pressed) + m_keysDown[sdl_keymap[keysym]] = true; + else + m_keysDown.erase(sdl_keymap[keysym]); lua_getfield(m_luaState, LUA_GLOBALSINDEX, pressed ? "key_pressed_event" : "key_released_event"); if (lua_type(m_luaState, -1) == LUA_TFUNCTION) diff --git a/Engine.h b/Engine.h index 653b703..032c4f4 100644 --- a/Engine.h +++ b/Engine.h @@ -84,6 +84,7 @@ class Engine void endFrame(); int loadModel(const std::string & name, bool static_data, float scale = 1.0f); + bool isKeyDown(const std::string & key); /* lua services */ int setCamera(lua_State * L); @@ -119,6 +120,7 @@ class Engine bool m_autoStartFrame; bool m_autoEndFrame; bool m_autoDrawObjects; + std::map m_keysDown; }; extern Engine * g_engine; diff --git a/ag.cc b/ag.cc index ffba979..13d1a72 100644 --- a/ag.cc +++ b/ag.cc @@ -36,6 +36,7 @@ namespace ag { "setAutoStartFrame", setAutoStartFrame }, { "setAutoEndFrame", setAutoEndFrame }, { "setAutoDrawObjects", setAutoDrawObjects }, + { "isKeyDown", isKeyDown }, { NULL, NULL } }; luaL_register(L, "ag", functions); @@ -245,6 +246,16 @@ namespace ag return 0; } + int isKeyDown(lua_State * L) + { + int argc = lua_gettop(L); + if (argc == 1 && lua_isstring(L, 1)) + lua_pushboolean(L, g_engine->isKeyDown(lua_tostring(L, 1))); + else + lua_pushboolean(L, false); + return 1; + } + namespace object { static Engine::Object * getObject(lua_State * L, int index) diff --git a/ag.h b/ag.h index 9fd8d02..557f395 100644 --- a/ag.h +++ b/ag.h @@ -22,6 +22,7 @@ namespace ag int setAutoStartFrame(lua_State * L); int setAutoEndFrame(lua_State * L); int setAutoDrawObjects(lua_State * L); + int isKeyDown(lua_State * L); namespace object { diff --git a/tests/ballstairs.lua b/tests/ballstairs.lua index 7afb271..a79ff62 100755 --- a/tests/ballstairs.lua +++ b/tests/ballstairs.lua @@ -2,6 +2,9 @@ function update_event() ballx, bally, ballz = ball:getPosition() ag.setCamera(7, -6, 15, ballx, bally, ballz, 0, 0, 1) + if (ag.isKeyDown("m")) then + ball:setPosition(-7, 7.4, 12) + end end function key_pressed_event(key)