From 1666359218bd31d2f8e3626f2fc23ba27ef98057 Mon Sep 17 00:00:00 2001 From: emb <> Date: Thu, 26 Nov 2015 22:05:16 -0600 Subject: [PATCH] Support user input (partially) --- RetroFE/Source/CMakeLists.txt | 13 ++++++++ RetroFE/Source/Lua/LuaEvent.cpp | 6 ++-- RetroFE/Source/RetroFE.cpp | 24 ++++++++++---- RetroFE/Source/RetroFE.h | 5 ++- RetroFE/Source/StateMachine.cpp | 59 +++++++++++++++++++++++++++++++-- RetroFE/Source/StateMachine.h | 21 +++++++++--- 6 files changed, 110 insertions(+), 18 deletions(-) diff --git a/RetroFE/Source/CMakeLists.txt b/RetroFE/Source/CMakeLists.txt index 5a749b5..b292dd9 100644 --- a/RetroFE/Source/CMakeLists.txt +++ b/RetroFE/Source/CMakeLists.txt @@ -94,6 +94,13 @@ set(RETROFE_HEADERS "${RETROFE_DIR}/Source/Collection/CollectionInfo.h" "${RETROFE_DIR}/Source/Collection/CollectionInfoBuilder.h" "${RETROFE_DIR}/Source/Collection/Item.h" + "${RETROFE_DIR}/Source/Control/InputHandler.h" + "${RETROFE_DIR}/Source/Control/JoyAxisHandler.h" + "${RETROFE_DIR}/Source/Control/JoyButtonHandler.h" + "${RETROFE_DIR}/Source/Control/JoyHatHandler.h" + "${RETROFE_DIR}/Source/Control/KeyboardHandler.h" + "${RETROFE_DIR}/Source/Control/MouseButtonHandler.h" + "${RETROFE_DIR}/Source/Control/UserInput.h" "${RETROFE_DIR}/Source/Database/Configuration.h" "${RETROFE_DIR}/Source/Database/DB.h" "${RETROFE_DIR}/Source/Database/Metadata.h" @@ -123,6 +130,12 @@ set(RETROFE_SOURCES "${RETROFE_DIR}/Source/Collection/CollectionInfo.cpp" "${RETROFE_DIR}/Source/Collection/CollectionInfoBuilder.cpp" "${RETROFE_DIR}/Source/Collection/Item.cpp" + "${RETROFE_DIR}/Source/Control/JoyAxisHandler.cpp" + "${RETROFE_DIR}/Source/Control/JoyButtonHandler.cpp" + "${RETROFE_DIR}/Source/Control/JoyHatHandler.cpp" + "${RETROFE_DIR}/Source/Control/KeyboardHandler.cpp" + "${RETROFE_DIR}/Source/Control/MouseButtonHandler.cpp" + "${RETROFE_DIR}/Source/Control/UserInput.cpp" "${RETROFE_DIR}/Source/Database/Configuration.cpp" "${RETROFE_DIR}/Source/Database/DB.cpp" "${RETROFE_DIR}/Source/Database/MetadataDatabase.cpp" diff --git a/RetroFE/Source/Lua/LuaEvent.cpp b/RetroFE/Source/Lua/LuaEvent.cpp index 6f5886e..65001fe 100644 --- a/RetroFE/Source/Lua/LuaEvent.cpp +++ b/RetroFE/Source/Lua/LuaEvent.cpp @@ -19,15 +19,15 @@ void LuaEvent::trigger(lua_State *l, std::string type, void *value) bool LuaEvent::isBusy(lua_State *l, std::string type) { - bool retval = true; + bool retval = false; lua_getglobal(l, type.c_str()); if(lua_pcall(l, 0, 1, 0) == 0) { if(lua_isboolean(l, -1)) { - if(!lua_toboolean(l, -1)) + if(lua_toboolean(l, -1)) { - retval = false; + retval = true; } } lua_pop(l, 1); diff --git a/RetroFE/Source/RetroFE.cpp b/RetroFE/Source/RetroFE.cpp index 5d470cf..ec5c019 100644 --- a/RetroFE/Source/RetroFE.cpp +++ b/RetroFE/Source/RetroFE.cpp @@ -15,10 +15,8 @@ */ #include "RetroFE.h" -#include "StateMachine.h" -#include "Utility/Log.h" -#include "Utility/Utils.h" #include "SDL.h" +#include "StateMachine.h" #include "Graphics/Component/Image.h" #include "Graphics/Component/Component.h" #include "Lua/LuaAnimate.h" @@ -27,6 +25,8 @@ #include "Lua/LuaImage.h" #include "Lua/LuaLog.h" #include "Lua/LuaEvent.h" +#include "Utility/Log.h" +#include "Utility/Utils.h" #include #ifdef __linux @@ -157,6 +157,7 @@ RetroFE::RetroFE(Configuration &c) , db_(c.absolutePath + "/meta.db") , mdb_(NULL) , cib_(NULL) +, input_(c) { } @@ -171,13 +172,13 @@ RetroFE::~RetroFE() void RetroFE::run() { if(!SDL::initialize(config_)) return; - + input_.initialize(); db_.initialize(); mdb_ = new MetadataDatabase(db_, config_); cib_ = new CollectionInfoBuilder(config_, *mdb_); mdb_->initialize(); initializeLua(); - StateMachine state(lua_.state, &luaEvent_); + StateMachine state(lua_.state, &luaEvent_, &input_); reloadLuaScripts(); // events.triggerOnInit(lua_.state); @@ -185,7 +186,18 @@ void RetroFE::run() double currentTime = 0; double lastTime = 0; double deltaTime = 0; + while(!quit) { + SDL_Event e; + + if (SDL_PollEvent(&e)) + { +// if(input_.update(e)) +// { +// attract_.reset(); +// } + } + lastTime = currentTime; @@ -205,7 +217,7 @@ void RetroFE::run() LuaCollection::update(lua_.state); - state.update((float)deltaTime); + state.update((float)deltaTime, &e); SDL_LockMutex(SDL::getMutex()); SDL_SetRenderDrawColor(SDL::getRenderer(), 0x0, 0x0, 0x00, 0xFF); diff --git a/RetroFE/Source/RetroFE.h b/RetroFE/Source/RetroFE.h index ad0164a..221ba81 100644 --- a/RetroFE/Source/RetroFE.h +++ b/RetroFE/Source/RetroFE.h @@ -16,12 +16,14 @@ #pragma once #include "Graphics/Animate/AnimationManager.h" #include "Collection/CollectionInfoBuilder.h" + #include "Database/DB.h" #include "Database/Configuration.h" #include "Database/MetadataDatabase.h" +#include "Graphics/Component/ComponentFactory.h" #include "Lua/Lua.h" #include "Lua/LuaEvent.h" -#include "Graphics/Component/ComponentFactory.h" +#include "Control/UserInput.h" #include #include @@ -47,4 +49,5 @@ private: DB db_; MetadataDatabase *mdb_; CollectionInfoBuilder *cib_; + UserInput input_; }; diff --git a/RetroFE/Source/StateMachine.cpp b/RetroFE/Source/StateMachine.cpp index 40673bd..fe24c3f 100644 --- a/RetroFE/Source/StateMachine.cpp +++ b/RetroFE/Source/StateMachine.cpp @@ -1,14 +1,18 @@ #include "StateMachine.h" -StateMachine::StateMachine(lua_State *l, LuaEvent *e) +StateMachine::StateMachine(lua_State *l, LuaEvent *e, UserInput *i) : luaState_(l) , luaEvent_(e) +, input_(i) , state_(ON_STARTUP_ENTER) +, nextState_(ON_IDLE_ENTER) { } -void StateMachine::update(float dt) +void StateMachine::update(float dt, SDL_Event *e) { + input_->update(*e); + switch(state_) { case ON_STARTUP_ENTER: luaEvent_->trigger(luaState_, "startuponEnter"); @@ -16,7 +20,6 @@ void StateMachine::update(float dt) break; case ON_STARTUP_UPDATE: -//todo: only do it if the main system is not busy luaEvent_->trigger(luaState_, "startuponUpdate"); if(!luaEvent_->isBusy(luaState_, "startupisBusy")) { @@ -34,5 +37,55 @@ void StateMachine::update(float dt) state_ = ON_IDLE_ENTER; } break; + + case ON_IDLE_ENTER: + luaEvent_->trigger(luaState_, "idleEnter"); + state_ = ON_IDLE_UPDATE; + break; + + case ON_IDLE_UPDATE: + luaEvent_->trigger(luaState_, "idleUpdate"); + + if(!luaEvent_->isBusy(luaState_, "idleisBusy")) { + if(input_->keystate(UserInput::KeyCodeUp)) { + state_ = ON_IDLE_EXIT; + nextState_ = ON_SCROLL_ENTER; + } + } + break; + case ON_IDLE_EXIT: + luaEvent_->trigger(luaState_, "idleExit"); + state_ = ON_IDLE_EXIT_WAIT; + break; + + case ON_IDLE_EXIT_WAIT: + if(!luaEvent_->isBusy(luaState_, "idleisBusy")) { + state_ = nextState_; + } + break; + case ON_SCROLL_ENTER: + luaEvent_->trigger(luaState_, "scrollonEnter"); + state_ = ON_SCROLL_UPDATE; + break; + + case ON_SCROLL_UPDATE: + luaEvent_->trigger(luaState_, "scrollUpdate"); + + if(!luaEvent_->isBusy(luaState_, "scrollisBusy")) { + state_ = ON_SCROLL_EXIT; + } + break; + + case ON_SCROLL_EXIT: + luaEvent_->trigger(luaState_, "scrollonExit"); + state_ = ON_SCROLL_EXIT_WAIT; + break; + + case ON_SCROLL_EXIT_WAIT: + if(!luaEvent_->isBusy(luaState_, "scrollisBusy")) { + state_ = ON_IDLE_ENTER; + } + break; + } } diff --git a/RetroFE/Source/StateMachine.h b/RetroFE/Source/StateMachine.h index cdb621c..8963051 100644 --- a/RetroFE/Source/StateMachine.h +++ b/RetroFE/Source/StateMachine.h @@ -2,17 +2,19 @@ #include "Lua/Lua.h" #include "Lua/LuaEvent.h" +#include "Control/UserInput.h" class StateMachine { public: - StateMachine(lua_State *l, LuaEvent *e); + StateMachine(lua_State *l, LuaEvent *e, UserInput *i); void initialize(); - void update(float dt); + void update(float dt, SDL_Event *e); private: lua_State *luaState_; LuaEvent *luaEvent_; + UserInput *input_; enum { ON_STARTUP_ENTER, @@ -25,7 +27,16 @@ private: ON_COLLECTION_EXIT, ON_COLLECTION_EXIT_WAIT, - ON_STARTUP_EXIT_DONE, - ON_IDLE_ENTER - } state_; + ON_IDLE_ENTER, + ON_IDLE_UPDATE, + ON_IDLE_EXIT, + ON_IDLE_EXIT_WAIT, + + ON_SCROLL_ENTER, + ON_SCROLL_UPDATE, + ON_SCROLL_EXIT, + ON_SCROLL_EXIT_WAIT + + } state_, nextState_; + }; \ No newline at end of file