From 1a35d29f19e3fd623d48691b900762b5cc7a6cdd Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Tue, 17 Nov 2020 17:30:23 +0100 Subject: [PATCH] Improvements to the startup animations and game launching logic. --- es-app/src/SystemScreensaver.cpp | 2 +- es-app/src/views/SystemView.h | 2 + es-app/src/views/ViewController.cpp | 62 ++++++++++++++++--- es-app/src/views/ViewController.h | 8 ++- .../src/views/gamelist/BasicGameListView.cpp | 2 +- .../views/gamelist/DetailedGameListView.cpp | 17 +++-- .../src/views/gamelist/DetailedGameListView.h | 3 + .../src/views/gamelist/GridGameListView.cpp | 19 +----- .../src/views/gamelist/VideoGameListView.cpp | 36 ++--------- 9 files changed, 83 insertions(+), 68 deletions(-) diff --git a/es-app/src/SystemScreensaver.cpp b/es-app/src/SystemScreensaver.cpp index 20b120246..d49565885 100644 --- a/es-app/src/SystemScreensaver.cpp +++ b/es-app/src/SystemScreensaver.cpp @@ -233,12 +233,12 @@ void SystemScreensaver::launchGame() { if (mCurrentGame != nullptr) { // Launching game + ViewController::get()->triggerGameLaunch(mCurrentGame); ViewController::get()->goToGameList(mCurrentGame->getSystem()); IGameListView* view = ViewController::get()-> getGameListView(mCurrentGame->getSystem()).get(); view->setCursor(mCurrentGame); ViewController::get()->cancelViewTransitions(); - ViewController::get()->launch(mCurrentGame); } } diff --git a/es-app/src/views/SystemView.h b/es-app/src/views/SystemView.h index d1006eeb5..edfc1ab1c 100644 --- a/es-app/src/views/SystemView.h +++ b/es-app/src/views/SystemView.h @@ -69,6 +69,8 @@ public: std::vector getHelpPrompts() override; virtual HelpStyle getHelpStyle() override; + CarouselType getCarouselType() { return mCarousel.type; }; + protected: void onCursorChanged(const CursorState& state) override; virtual void onScroll() override { diff --git a/es-app/src/views/ViewController.cpp b/es-app/src/views/ViewController.cpp index 6d8f1692a..c5cf8a63c 100644 --- a/es-app/src/views/ViewController.cpp +++ b/es-app/src/views/ViewController.cpp @@ -29,6 +29,7 @@ #include "Settings.h" #include "Sound.h" #include "SystemData.h" +#include "SystemView.h" #include "Window.h" ViewController* ViewController::sInstance = nullptr; @@ -54,7 +55,8 @@ ViewController::ViewController( mWrappedViews(false), mFadeOpacity(0), mCancelledAnimation(false), - mLockInput(false) + mLockInput(false), + mGameToLaunch(nullptr) { mState.viewing = NOTHING; } @@ -172,6 +174,11 @@ void ViewController::restoreViewPosition() void ViewController::goToSystemView(SystemData* system, bool playTransition) { + bool applicationStartup = false; + + if (mState.viewing == NOTHING) + applicationStartup = true; + // Restore the X position for the view, if it was previously moved. if (mWrappedViews) restoreViewPosition(); @@ -198,11 +205,33 @@ void ViewController::goToSystemView(SystemData* system, bool playTransition) mCurrentView->setRenderView(true); PowerSaver::setState(true); - if (playTransition) + // Application startup animation. + if (applicationStartup) { + mCamera.translation() = -mCurrentView->getPosition(); + if (Settings::getInstance()->getString("TransitionStyle") == "slide") { + if (getSystemListView()->getCarouselType() == CarouselType::HORIZONTAL || + getSystemListView()->getCarouselType() == CarouselType::HORIZONTAL_WHEEL) + mCamera.translation().y() += Renderer::getScreenHeight(); + else + mCamera.translation().x() -= Renderer::getScreenWidth(); + updateHelpPrompts(); + } + else if (Settings::getInstance()->getString("TransitionStyle") == "fade") { + if (getSystemListView()->getCarouselType() == CarouselType::HORIZONTAL || + getSystemListView()->getCarouselType() == CarouselType::HORIZONTAL_WHEEL) + mCamera.translation().y() += Renderer::getScreenHeight(); + else + mCamera.translation().x() += Renderer::getScreenWidth(); + } + else { + updateHelpPrompts(); + } + } + + if (playTransition || applicationStartup) playViewTransition(); else playViewTransition(true); - } void ViewController::goToNextGameList() @@ -306,14 +335,29 @@ void ViewController::goToGameList(SystemData* system) mWrappedViews = true; } + mCurrentView = getGameListView(system); + + // Application startup animation, if starting in a gamelist rather than in the system view. + if (mState.viewing == NOTHING) { + mCamera.translation() = -mCurrentView->getPosition(); + if (Settings::getInstance()->getString("TransitionStyle") == "slide") { + mCamera.translation().y() -= Renderer::getScreenHeight(); + updateHelpPrompts(); + } + else if (Settings::getInstance()->getString("TransitionStyle") == "fade") { + mCamera.translation().y() += Renderer::getScreenHeight() * 2; + } + else { + updateHelpPrompts(); + } + } + mState.viewing = GAME_LIST; mState.system = system; if (mCurrentView) mCurrentView->onHide(); - mCurrentView = getGameListView(system); - if (mCurrentView) { mCurrentView->onShow(); mCurrentView->setRenderView(true); @@ -387,7 +431,7 @@ void ViewController::onFileChanged(FileData* file, bool reloadGameList) it->second->onFileChanged(file, reloadGameList); } -void ViewController::launch(FileData* game, Vector3f center) +void ViewController::launch(FileData* game) { if (game->getType() != GAME) { LOG(LogError) << "tried to launch something that isn't a game."; @@ -404,7 +448,6 @@ void ViewController::launch(FileData* game, Vector3f center) stopAnimation(1); // Make sure the fade in isn't still playing. mWindow->stopInfoPopup(); // Make sure we disable any existing info popup. - mLockInput = true; // Until a proper game launch screen is implemented, at least this will let the // user know that something is actually happening (in addition to the launch sound, @@ -583,6 +626,11 @@ void ViewController::update(int deltaTime) mCurrentView->update(deltaTime); updateSelf(deltaTime); + + if (mGameToLaunch) { + launch(mGameToLaunch); + mGameToLaunch = nullptr; + } } void ViewController::render(const Transform4x4f& parentTrans) diff --git a/es-app/src/views/ViewController.h b/es-app/src/views/ViewController.h index a931511b5..30e88fa1d 100644 --- a/es-app/src/views/ViewController.h +++ b/es-app/src/views/ViewController.h @@ -59,9 +59,8 @@ public: void stopScrolling(); void onFileChanged(FileData* file, bool reloadGameList); - - void launch(FileData* game, Vector3f centerCameraOn = - Vector3f(Renderer::getScreenWidth() / 2.0f, Renderer::getScreenHeight() / 2.0f, 0)); + void triggerGameLaunch(FileData* game) { mGameToLaunch = game; mLockInput = true; }; + bool getGameLaunchTriggered() { return (mGameToLaunch != nullptr); }; bool input(InputConfig* config, Input input) override; void update(int deltaTime) override; @@ -109,6 +108,8 @@ private: ViewController(Window* window); static ViewController* sInstance; + void launch(FileData* game); + void playViewTransition(bool instant = false); int getSystemId(SystemData* system); // Restore view position if it was moved during wrap around. @@ -125,6 +126,7 @@ private: float mFadeOpacity; bool mCancelledAnimation; // Needed only for the Fade transition style. bool mLockInput; + FileData* mGameToLaunch; State mState; }; diff --git a/es-app/src/views/gamelist/BasicGameListView.cpp b/es-app/src/views/gamelist/BasicGameListView.cpp index d42b7c3d4..004cecff2 100644 --- a/es-app/src/views/gamelist/BasicGameListView.cpp +++ b/es-app/src/views/gamelist/BasicGameListView.cpp @@ -189,7 +189,7 @@ std::string BasicGameListView::getQuickSystemSelectLeftButton() void BasicGameListView::launch(FileData* game) { - ViewController::get()->launch(game); + ViewController::get()->triggerGameLaunch(game); } void BasicGameListView::remove(FileData *game, bool deleteFile) diff --git a/es-app/src/views/gamelist/DetailedGameListView.cpp b/es-app/src/views/gamelist/DetailedGameListView.cpp index ab01fa202..cf3cc9104 100644 --- a/es-app/src/views/gamelist/DetailedGameListView.cpp +++ b/es-app/src/views/gamelist/DetailedGameListView.cpp @@ -14,7 +14,7 @@ #include "SystemData.h" #define FADE_IN_START_OPACITY 0.5f -#define FADE_IN_TIME 300 +#define FADE_IN_TIME 650 DetailedGameListView::DetailedGameListView( Window* window, @@ -435,11 +435,7 @@ void DetailedGameListView::updateInfoPanel() void DetailedGameListView::launch(FileData* game) { - Vector3f target(Renderer::getScreenWidth() / 2.0f, Renderer::getScreenHeight() / 2.0f, 0); - if (mImage.hasImage()) - target = Vector3f(mImage.getCenter().x(), mImage.getCenter().y(), 0); - - ViewController::get()->launch(game, target); + ViewController::get()->triggerGameLaunch(game); } std::vector DetailedGameListView::getMDLabels() @@ -470,6 +466,15 @@ std::vector DetailedGameListView::getMDValues() return ret; } +void DetailedGameListView::update(int deltaTime) +{ + BasicGameListView::update(deltaTime); + mImage.update(deltaTime); + + if (ViewController::get()->getGameLaunchTriggered() && mImage.isAnimationPlaying(0)) + mImage.finishAnimation(0); +} + void DetailedGameListView::onShow() { mLastUpdated = nullptr; diff --git a/es-app/src/views/gamelist/DetailedGameListView.h b/es-app/src/views/gamelist/DetailedGameListView.h index f43262ca7..d53a46000 100644 --- a/es-app/src/views/gamelist/DetailedGameListView.h +++ b/es-app/src/views/gamelist/DetailedGameListView.h @@ -24,6 +24,9 @@ public: virtual const char* getName() const override { return "detailed"; } virtual void launch(FileData* game) override; +protected: + virtual void update(int deltaTime) override; + private: void updateInfoPanel(); diff --git a/es-app/src/views/gamelist/GridGameListView.cpp b/es-app/src/views/gamelist/GridGameListView.cpp index 87c8a6d1e..1a3023e31 100644 --- a/es-app/src/views/gamelist/GridGameListView.cpp +++ b/es-app/src/views/gamelist/GridGameListView.cpp @@ -533,24 +533,7 @@ void GridGameListView::addPlaceholder(FileData* firstEntry) void GridGameListView::launch(FileData* game) { - float screenWidth = (float) Renderer::getScreenWidth(); - float screenHeight = (float) Renderer::getScreenHeight(); - - Vector3f target(screenWidth / 2.0f, screenHeight / 2.0f, 0); - - if (mMarquee.hasImage() && - (mMarquee.getPosition().x() < screenWidth && mMarquee.getPosition().x() > 0.0f && - mMarquee.getPosition().y() < screenHeight && mMarquee.getPosition().y() > 0.0f)) - target = Vector3f(mMarquee.getCenter().x(), mMarquee.getCenter().y(), 0); - else if (mImage.hasImage() && - (mImage.getPosition().x() < screenWidth && mImage.getPosition().x() > 2.0f && - mImage.getPosition().y() < screenHeight && mImage.getPosition().y() > 2.0f)) - target = Vector3f(mImage.getCenter().x(), mImage.getCenter().y(), 0); - else if (mVideo->getPosition().x() < screenWidth && mVideo->getPosition().x() > 0.0f && - mVideo->getPosition().y() < screenHeight && mVideo->getPosition().y() > 0.0f) - target = Vector3f(mVideo->getCenter().x(), mVideo->getCenter().y(), 0); - - ViewController::get()->launch(game, target); + ViewController::get()->triggerGameLaunch(game); } void GridGameListView::remove(FileData *game, bool deleteFile) diff --git a/es-app/src/views/gamelist/VideoGameListView.cpp b/es-app/src/views/gamelist/VideoGameListView.cpp index f95081999..884994dcb 100644 --- a/es-app/src/views/gamelist/VideoGameListView.cpp +++ b/es-app/src/views/gamelist/VideoGameListView.cpp @@ -478,38 +478,7 @@ void VideoGameListView::updateInfoPanel() void VideoGameListView::launch(FileData* game) { - float screenWidth = static_cast(Renderer::getScreenWidth()); - float screenHeight = static_cast(Renderer::getScreenHeight()); - - Vector3f target(screenWidth / 2.0f, screenHeight / 2.0f, 0); - - if (mMarquee.hasImage() && - (mMarquee.getPosition().x() < screenWidth && mMarquee.getPosition().x() > 0.0f && - mMarquee.getPosition().y() < screenHeight && mMarquee.getPosition().y() > 0.0f)) - target = Vector3f(mMarquee.getCenter().x(), mMarquee.getCenter().y(), 0); - - else if (mThumbnail.hasImage() && - (mThumbnail.getPosition().x() < screenWidth && mThumbnail.getPosition().x() > 2.0f && - mThumbnail.getPosition().y() < screenHeight && mThumbnail.getPosition().y() > 2.0f)) - target = Vector3f(mThumbnail.getCenter().x(), mThumbnail.getCenter().y(), 0); - - else if (mImage.hasImage() && - (mImage.getPosition().x() < screenWidth && mImage.getPosition().x() > 2.0f && - mImage.getPosition().y() < screenHeight && mImage.getPosition().y() > 2.0f)) - target = Vector3f(mImage.getCenter().x(), mImage.getCenter().y(), 0); - - else if (mHeaderImage.hasImage() && - (mHeaderImage.getPosition().x() < screenWidth && - mHeaderImage.getPosition().x() > 0.0f && - mHeaderImage.getPosition().y() < screenHeight && - mHeaderImage.getPosition().y() > 0.0f)) - target = Vector3f(mHeaderImage.getCenter().x(), mHeaderImage.getCenter().y(), 0); - - else if (mVideo->getPosition().x() < screenWidth && mVideo->getPosition().x() > 0.0f && - mVideo->getPosition().y() < screenHeight && mVideo->getPosition().y() > 0.0f) - target = Vector3f(mVideo->getCenter().x(), mVideo->getCenter().y(), 0); - - ViewController::get()->launch(game, target); + ViewController::get()->triggerGameLaunch(game); } std::vector VideoGameListView::getMDLabels() @@ -549,6 +518,9 @@ void VideoGameListView::update(int deltaTime) BasicGameListView::update(deltaTime); mVideo->update(deltaTime); + + if (ViewController::get()->getGameLaunchTriggered() && mVideo->isAnimationPlaying(0)) + mVideo->finishAnimation(0); } void VideoGameListView::onShow()