diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 827a711..49075b9 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -83,6 +83,7 @@ set(RETROFE_HEADERS "${RETROFE_DIR}/Source/Database/Configuration.h" "${RETROFE_DIR}/Source/Database/DB.h" "${RETROFE_DIR}/Source/Database/MamelistMetadata.h" + "${RETROFE_DIR}/Source/Execute/AttractMode.h" "${RETROFE_DIR}/Source/Execute/Launcher.h" "${RETROFE_DIR}/Source/Graphics/Animate/Tween.h" "${RETROFE_DIR}/Source/Graphics/Animate/TweenTypes.h" @@ -124,6 +125,7 @@ set(RETROFE_SOURCES "${RETROFE_DIR}/Source/Database/Configuration.cpp" "${RETROFE_DIR}/Source/Database/DB.cpp" "${RETROFE_DIR}/Source/Database/MamelistMetadata.cpp" + "${RETROFE_DIR}/Source/Execute/AttractMode.cpp" "${RETROFE_DIR}/Source/Execute/Launcher.cpp" "${RETROFE_DIR}/Source/Graphics/Animate/Tween.cpp" "${RETROFE_DIR}/Source/Graphics/Font.cpp" diff --git a/Source/Execute/AttractMode.cpp b/Source/Execute/AttractMode.cpp new file mode 100644 index 0000000..559f56e --- /dev/null +++ b/Source/Execute/AttractMode.cpp @@ -0,0 +1,49 @@ +/* This file is subject to the terms and conditions defined in + * file 'LICENSE.txt', which is part of this source code package. + */ +#include "AttractMode.h" +#include "../Graphics/Page.h" + +AttractMode::AttractMode() +: IsActive(false) +, ElapsedTime(0) +, ActiveTime(0) +, IdleTime(0) +{ +} + +void AttractMode::SetIdleTime(float time) +{ + IdleTime = time; +} +void AttractMode::Reset() +{ + ElapsedTime = 0; + IsActive = false; + ActiveTime = 0; +} + +void AttractMode::Update(float dt, Page &page) +{ + ElapsedTime += dt; + + // enable attract mode when idling for the expected time. Disable if idle time is set to 0. + if(!IsActive && ElapsedTime > IdleTime && IdleTime > 0) + { + IsActive = true; + ElapsedTime = 0; + ActiveTime = ((float)((1000+rand()) % 5000)) / 1000; + } + + if(IsActive) + { + page.SetScrolling(Page::ScrollDirectionForward); + + if(ElapsedTime > ActiveTime) + { + ElapsedTime = 0; + IsActive = false; + page.SetScrolling(Page::ScrollDirectionIdle); + } + } +} \ No newline at end of file diff --git a/Source/Execute/AttractMode.h b/Source/Execute/AttractMode.h new file mode 100644 index 0000000..ac821e7 --- /dev/null +++ b/Source/Execute/AttractMode.h @@ -0,0 +1,22 @@ +/* This file is subject to the terms and conditions defined in + * file 'LICENSE.txt', which is part of this source code package. + */ +#pragma once + +class Page; + +class AttractMode +{ +public: + AttractMode(); + void SetIdleTime(float time); + void Reset(); + void Update(float dt, Page &page); + +private: + bool IsActive; + float ElapsedTime; + float ActiveTime; + float IdleTime; + +}; diff --git a/Source/RetroFE.cpp b/Source/RetroFE.cpp index dcd1df0..27ac8c1 100644 --- a/Source/RetroFE.cpp +++ b/Source/RetroFE.cpp @@ -27,8 +27,6 @@ RetroFE::RetroFE(CollectionDatabase &db, Configuration &c) , CollectionDB(db) , Input(Config) , KeyInputDisable(0) - , InactiveKeyTime(0) - , AttractMode(false) , CurrentTime(0) , VideoInst(NULL) { @@ -159,7 +157,6 @@ void RetroFE::Run() bool running = true; Item *nextPageItem = NULL; bool adminMode = false; - float attractModeRandomTime = 0; bool selectActive = false; float frameCount = 0; float fpsStartTime = 0; @@ -168,6 +165,7 @@ void RetroFE::Run() Config.GetProperty("attractModeTime", attractModeTime); Config.GetProperty("firstCollection", firstCollection); + Attract.SetIdleTime(static_cast(attractModeTime)); LoadPage(firstCollection); while (running) @@ -287,26 +285,7 @@ void RetroFE::Run() frameCount = 0; } - InactiveKeyTime += deltaTime; - - if(!AttractMode && InactiveKeyTime > attractModeTime && attractModeTime > 0) - { - AttractMode = true; - InactiveKeyTime = 0; - attractModeRandomTime = ((float)((1000+rand()) % 5000)) / 1000; - } - - if(AttractMode) - { - page->SetScrolling(Page::ScrollDirectionForward); - - if(InactiveKeyTime > attractModeRandomTime) - { - InactiveKeyTime = 0; - AttractMode = false; - page->SetScrolling(Page::ScrollDirectionIdle); - } - } + Attract.Update(deltaTime, *page); page->Update(deltaTime); Render(); @@ -353,8 +332,7 @@ RetroFE::RETROFE_STATE RetroFE::ProcessUserInput(Page *page) { const Uint8 *keys = SDL_GetKeyboardState(NULL); - InactiveKeyTime = 0; - AttractMode = false; + Attract.Reset(); if (keys[Input.GetScancode(UserInput::KeyCodePreviousItem)]) { diff --git a/Source/RetroFE.h b/Source/RetroFE.h index 4446a3f..042303e 100644 --- a/Source/RetroFE.h +++ b/Source/RetroFE.h @@ -5,6 +5,7 @@ #include "Collection/Item.h" #include "Control/UserInput.h" +#include "Execute/AttractMode.h" #include "Graphics/FontCache.h" #include "Video/IVideo.h" #include @@ -54,11 +55,10 @@ private: UserInput Input; std::list PageChain; float KeyInputDisable; - float InactiveKeyTime; - bool AttractMode; float CurrentTime; Item *NextPageItem; FontCache FC; IVideo *VideoInst; + AttractMode Attract; };