Improvements to the startup animations and game launching logic.

This commit is contained in:
Leon Styhre 2020-11-17 17:30:23 +01:00
parent 635e7d2cdd
commit 1a35d29f19
9 changed files with 83 additions and 68 deletions

View file

@ -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);
}
}

View file

@ -69,6 +69,8 @@ public:
std::vector<HelpPrompt> getHelpPrompts() override;
virtual HelpStyle getHelpStyle() override;
CarouselType getCarouselType() { return mCarousel.type; };
protected:
void onCursorChanged(const CursorState& state) override;
virtual void onScroll() override {

View file

@ -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)

View file

@ -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;
};

View file

@ -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)

View file

@ -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<TextComponent*> DetailedGameListView::getMDLabels()
@ -470,6 +466,15 @@ std::vector<GuiComponent*> 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;

View file

@ -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();

View file

@ -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)

View file

@ -478,38 +478,7 @@ void VideoGameListView::updateInfoPanel()
void VideoGameListView::launch(FileData* game)
{
float screenWidth = static_cast<float>(Renderer::getScreenWidth());
float screenHeight = static_cast<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 (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<TextComponent*> 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()