Simple tips manager (#4146)
This commit is contained in:
parent
82f83ea1ec
commit
1ade00462d
@ -292,6 +292,9 @@ when the border that intersect at this corner are enabled.
|
||||
<!-- Color used to fade out background when a dialog is shown -->
|
||||
<color type="dialog_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Color used for tips in the loading screen -->
|
||||
<color type="tips_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Text field color -->
|
||||
<color type="text_field" state="background" a="255" r="35" g="35" b="35" />
|
||||
<color type="text_field" state="background_focused" a="255" r="15" g="15" b="15" />
|
||||
|
@ -292,6 +292,9 @@ when the border that intersect at this corner are enabled.
|
||||
<!-- Color used to fade out background when a dialog is shown -->
|
||||
<color type="dialog_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Color used for tips in the loading screen -->
|
||||
<color type="tips_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Text field color -->
|
||||
<color type="text_field" state="background" a="255" r="200" g="200" b="200" />
|
||||
<color type="text_field" state="background_focused" a="255" r="223" g="250" b="245" />
|
||||
|
@ -291,6 +291,9 @@ when the border that intersect at this corner are enabled.
|
||||
<!-- Color used to fade out background when a dialog is shown -->
|
||||
<color type="dialog_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Color used for tips in the loading screen -->
|
||||
<color type="tips_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Text field color -->
|
||||
<color type="text_field" state="background" a="255" r="200" g="200" b="200" />
|
||||
<color type="text_field" state="background_focused" a="255" r="223" g="238" b="248" />
|
||||
|
@ -309,6 +309,9 @@ all types of ttf.
|
||||
<!-- Color used to fade out background when a dialog is shown -->
|
||||
<color type="dialog_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Color used for tips in the loading screen -->
|
||||
<color type="tips_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Text field color -->
|
||||
<color type="text_field" state="background" a="255" r="200" g="200" b="200" />
|
||||
<color type="text_field" state="background_focused" a="255" r="236" g="226" b="201" />
|
||||
|
@ -290,6 +290,9 @@ when the border that intersect at this corner are enabled.
|
||||
<!-- Color used to fade out background when a dialog is shown -->
|
||||
<color type="dialog_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Color used for tips in the loading screen -->
|
||||
<color type="tips_background" state="neutral" a="120" r="0" g="0" b="0" />
|
||||
|
||||
<!-- Text field color -->
|
||||
<color type="text_field" state="background" a="255" r="200" g="200" b="200" />
|
||||
<color type="text_field" state="background_focused" a="255" r="245" g="220" b="235" />
|
||||
|
21
data/tips.xml
Normal file
21
data/tips.xml
Normal file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<tips>
|
||||
<tipset id="general">
|
||||
<tip text="You can change the skin of gui in UI options."/>
|
||||
<tip text="You can show more information in game by enabling some options in UI options"/>
|
||||
<tip text="You can change the font size in UI options"/>
|
||||
<tip text="You can visit https://supertuxkart.net/ for more information of the game."/>
|
||||
</tipset>
|
||||
<tipset id="race">
|
||||
<tip text="Always do short nitro boosts. Re-use the nitro when your speed goes down again."/>
|
||||
<tip text="Only use zipper when it is safe. Long straight lines are the best."/>
|
||||
<tip text="Don't use multiple zippers quickly in row, instead, wait until the speed boost wears off."/>
|
||||
<tip text="Skid more, and you will find you much faster than before."/>
|
||||
<tip text="Using nitro after skidding can make you speed-up longer."/>
|
||||
<tip text="You get a startup boost if you start accelerating during "Set""/>
|
||||
<tip text="If you slow down when a parachute attaches your kart, you will get rid of it quickly."/>
|
||||
<tip text="For safety, try to stay away from other karts unless you have a bubble gum."/>
|
||||
<tip text="Instead of bubblegum, you can also shoot backward a bowling, cake or plunger to kill a basketball."/>
|
||||
<tip text="Try to avoid crashing into other karts unless you want to throw a kart off the track."/>
|
||||
</tipset>
|
||||
</tips>
|
@ -684,6 +684,7 @@ namespace GUIEngine
|
||||
#include "modes/cutscene_world.hpp"
|
||||
#include "modes/world.hpp"
|
||||
#include "states_screens/race_gui_base.hpp"
|
||||
#include "tips/tips_manager.hpp"
|
||||
#include "utils/debug.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
#include "utils/translation.hpp"
|
||||
@ -1357,10 +1358,14 @@ namespace GUIEngine
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
std::vector<irr::video::ITexture*> g_loading_icons;
|
||||
core::stringw g_tips_string;
|
||||
|
||||
void renderLoading(bool clearIcons, bool launching)
|
||||
void renderLoading(bool clearIcons, bool launching, bool update_tips)
|
||||
{
|
||||
#ifndef SERVER_ONLY
|
||||
if(update_tips)
|
||||
g_tips_string = _("Tip: ") + TipsManager::get()->getTip("general");
|
||||
|
||||
if (clearIcons) g_loading_icons.clear();
|
||||
|
||||
g_skin->drawBgImage();
|
||||
@ -1382,6 +1387,10 @@ namespace GUIEngine
|
||||
const int screen_w = frame_size.Width;
|
||||
const int screen_h = frame_size.Height;
|
||||
|
||||
// used in drawing tips
|
||||
const int text_height = getFontHeight() * 1.2f;
|
||||
const int y_from = screen_h - text_height * 0.3f;
|
||||
|
||||
const core::rect< s32 > dest_area =
|
||||
core::rect< s32 >(screen_w/2 - stretched_size/2,
|
||||
screen_h/2 - stretched_size/2,
|
||||
@ -1404,11 +1413,18 @@ namespace GUIEngine
|
||||
SColor(255,255,255,255),
|
||||
true/* center h */, false /* center v */ );
|
||||
|
||||
// Draw a tip during loading
|
||||
core::rect<s32> tipRect(core::position2d<s32>(0, y_from - text_height),
|
||||
core::dimension2d<s32>(screen_w, text_height));
|
||||
GL32_draw2DRectangle(Skin::getColor("tips_background::neutral"), tipRect);
|
||||
Private::g_font->draw(g_tips_string.c_str(), tipRect, Skin::getColor("brighttext::neutral"),
|
||||
true /* hcenter */, true /* vcenter */);
|
||||
|
||||
const int icon_count = (int)g_loading_icons.size();
|
||||
const int icon_size = (int)(std::min(screen_w, screen_h) / 10.0f);
|
||||
const int icon_size = (int)(std::min(screen_w, screen_h) / 12.0f);
|
||||
const int ICON_MARGIN = 6;
|
||||
int x = ICON_MARGIN;
|
||||
int y = screen_h - icon_size - ICON_MARGIN;
|
||||
int y = y_from - icon_size - ICON_MARGIN - text_height * 1.2f;
|
||||
for (int n=0; n<icon_count; n++)
|
||||
{
|
||||
draw2DImage(g_loading_icons[n],
|
||||
@ -1458,7 +1474,7 @@ namespace GUIEngine
|
||||
|
||||
g_device->getVideoDriver()
|
||||
->beginScene(true, true, video::SColor(255,100,101,140));
|
||||
renderLoading(false, true);
|
||||
renderLoading(false, true, false);
|
||||
g_device->getVideoDriver()->endScene();
|
||||
}
|
||||
else
|
||||
|
@ -232,7 +232,7 @@ namespace GUIEngine
|
||||
void render(float dt, bool is_loading = false);
|
||||
|
||||
/** \brief renders a "loading" screen */
|
||||
void renderLoading(bool clearIcons = true, bool launching = false);
|
||||
void renderLoading(bool clearIcons = true, bool launching = false, bool update_tips = true);
|
||||
|
||||
/** \brief to spice up a bit the loading icon : add icons to the loading screen */
|
||||
void addLoadingIcon(irr::video::ITexture* icon);
|
||||
|
@ -197,6 +197,7 @@
|
||||
#include "guiengine/engine.hpp"
|
||||
#include "guiengine/event_handler.hpp"
|
||||
#include "guiengine/dialog_queue.hpp"
|
||||
#include "guiengine/message_queue.hpp"
|
||||
#include "input/device_manager.hpp"
|
||||
#include "input/input_manager.hpp"
|
||||
#include "input/keyboard_device.hpp"
|
||||
@ -243,6 +244,7 @@
|
||||
#include "states_screens/options/user_screen.hpp"
|
||||
#include "states_screens/dialogs/init_android_dialog.hpp"
|
||||
#include "states_screens/dialogs/message_dialog.hpp"
|
||||
#include "tips/tips_manager.hpp"
|
||||
#include "tracks/arena_graph.hpp"
|
||||
#include "tracks/track.hpp"
|
||||
#include "tracks/track_manager.hpp"
|
||||
@ -1792,7 +1794,7 @@ void initRest()
|
||||
|
||||
GUIEngine::init(device, driver, StateManager::get());
|
||||
|
||||
GUIEngine::renderLoading(true, true);
|
||||
GUIEngine::renderLoading(true, true, false);
|
||||
input_manager = new InputManager();
|
||||
// Get into menu mode initially.
|
||||
input_manager->setMode(InputManager::MENU);
|
||||
@ -2025,6 +2027,9 @@ int main(int argc, char *argv[])
|
||||
// ServerConfig will use stk_config for server version testing
|
||||
stk_config->load(file_manager->getAsset("stk_config.xml"));
|
||||
bool no_graphics = !CommandLine::has("--graphical-server");
|
||||
|
||||
TipsManager::create();
|
||||
|
||||
// Load current server config first, if any option is specified than
|
||||
// override it later
|
||||
// Disable sound if found server-config or wan/lan server name
|
||||
|
@ -60,10 +60,12 @@
|
||||
#include "states_screens/main_menu_screen.hpp"
|
||||
#include "states_screens/online/networking_lobby.hpp"
|
||||
#include "states_screens/race_setup_screen.hpp"
|
||||
#include "tips/tips_manager.hpp"
|
||||
#include "tracks/track.hpp"
|
||||
#include "tracks/track_manager.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
#include "utils/translation.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
/** Constructor, initialises internal data structures.
|
||||
@ -141,6 +143,9 @@ void RaceResultGUI::init()
|
||||
m_start_track = 0;
|
||||
m_end_track = (int)tracks.size();
|
||||
}
|
||||
|
||||
core::stringw tips_string = _("Tip: ") + TipsManager::get()->getTip("race");
|
||||
MessageQueue::add(MessageQueue::MT_GENERIC, tips_string);
|
||||
} // init
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
90
src/tips/tips_manager.cpp
Normal file
90
src/tips/tips_manager.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
//
|
||||
// SuperTuxKart - a fun racing game with go-kart
|
||||
// Copyright (C) 2019 dumaosen
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 3
|
||||
// of the License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
#include "tips/tips_manager.hpp"
|
||||
|
||||
#include "io/file_manager.hpp"
|
||||
#include "utils/log.hpp"
|
||||
#include "utils/random_generator.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
#include "utils/translation.hpp"
|
||||
|
||||
TipsManager* TipsManager::m_tips_manager = NULL;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Constructor, which reads data/tips.xml and stores the information
|
||||
* in objects.
|
||||
*/
|
||||
TipsManager::TipsManager()
|
||||
{
|
||||
const std::string file_name = file_manager->getAsset("tips.xml");
|
||||
const XMLNode *root = file_manager->createXMLTree(file_name);
|
||||
unsigned int num_nodes = root->getNumNodes();
|
||||
|
||||
for(unsigned int i = 0; i < num_nodes; i++)
|
||||
{
|
||||
const XMLNode *node = root->getNode(i);
|
||||
addTipSet(node);
|
||||
}
|
||||
|
||||
if(num_nodes != m_all_tip_sets.size())
|
||||
Log::error("TipsManager",
|
||||
"Multiple tipsets with the same id!");
|
||||
|
||||
delete root;
|
||||
} // TipsManager
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
TipsManager::~TipsManager()
|
||||
{
|
||||
m_all_tip_sets.clear();
|
||||
} // ~TipsManager
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void TipsManager::addTipSet(const XMLNode *input)
|
||||
{
|
||||
std::string id;
|
||||
|
||||
if(!input->get("id", &id))
|
||||
Log::error("TipSet",
|
||||
"Undefined id for tipset.");
|
||||
|
||||
for(unsigned int n = 0; n < input->getNumNodes(); n++)
|
||||
{
|
||||
const XMLNode *node = input->getNode(n);
|
||||
if (node->getName() != "tip")
|
||||
continue; // ignore incorrect node
|
||||
|
||||
std::string text;
|
||||
if(!node->get("text", &text))
|
||||
continue; // missing text, ignore node
|
||||
|
||||
// Gettext is used here
|
||||
m_all_tip_sets[id].push_back(_(text.c_str()));
|
||||
}
|
||||
if(m_all_tip_sets[id].size() != input->getNumNodes())
|
||||
Log::error("TipSet",
|
||||
"Incorrect tips for the entries of tipset \"%s\".", id.c_str());
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
irr::core::stringw TipsManager::getTip(std::string id)
|
||||
{
|
||||
RandomGenerator randgen;
|
||||
return m_all_tip_sets[id][randgen.get(m_all_tip_sets[id].size())];
|
||||
} // getTipSet
|
75
src/tips/tips_manager.hpp
Normal file
75
src/tips/tips_manager.hpp
Normal file
@ -0,0 +1,75 @@
|
||||
//
|
||||
// SuperTuxKart - a fun racing game with go-kart
|
||||
// Copyright (C) 2019 dumaosen
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 3
|
||||
// of the License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
#ifndef HEADER_TIPS_MANAGER_HPP
|
||||
#define HEADER_TIPS_MANAGER_HPP
|
||||
|
||||
#include "io/xml_node.hpp"
|
||||
|
||||
#include <assert.h>
|
||||
#include <irrString.h>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
typedef std::vector<irr::core::stringw> TipSet;
|
||||
|
||||
/** This class manages the list of all tips. It reads the
|
||||
* data/tips.xml file, which contains the contents for
|
||||
* each tip.
|
||||
*/
|
||||
class TipsManager
|
||||
{
|
||||
private:
|
||||
/** Pointer to the single instance. */
|
||||
static TipsManager *m_tips_manager;
|
||||
|
||||
std::map<std::string, TipSet> m_all_tip_sets;
|
||||
|
||||
TipsManager ();
|
||||
~TipsManager ();
|
||||
|
||||
void addTipSet(const XMLNode *input);
|
||||
|
||||
public:
|
||||
/** Static function to create the instance of the tips manager. */
|
||||
static void create()
|
||||
{
|
||||
assert(!m_tips_manager);
|
||||
m_tips_manager = new TipsManager();
|
||||
} // create
|
||||
// ------------------------------------------------------------------------
|
||||
/** Static function to get the tips manager. */
|
||||
static TipsManager* get()
|
||||
{
|
||||
assert(m_tips_manager);
|
||||
return m_tips_manager;
|
||||
} // get
|
||||
// ------------------------------------------------------------------------
|
||||
static void destroy()
|
||||
{
|
||||
delete m_tips_manager;
|
||||
m_tips_manager = NULL;
|
||||
} // destroy
|
||||
// ========================================================================
|
||||
/** Get a tip by ID. */
|
||||
irr::core::stringw getTip(std::string id);
|
||||
// ------------------------------------------------------------------------
|
||||
}; // class TipsManager
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user