Add the capacity to show subtitles in cutscenes
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@11334 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
2442f3b3a3
commit
137600a5f0
@ -103,7 +103,6 @@ void CutsceneWorld::init()
|
||||
{
|
||||
fprintf(stderr, "[CutsceneWorld] WARNING: cutscene has no duration\n");
|
||||
}
|
||||
|
||||
} // CutsceneWorld
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -151,6 +150,26 @@ void CutsceneWorld::update(float dt)
|
||||
dynamic_cast<CutsceneGUI*>(m_race_gui)->setFadeLevel(0.0f);
|
||||
}
|
||||
|
||||
|
||||
float currFrame = m_time * 30.0f; // We assume 30 FPS
|
||||
const std::vector<Subtitle>& subtitles = m_track->getSubtitles();
|
||||
bool foundSubtitle = false;
|
||||
for (int n = 0; n < subtitles.size(); n++)
|
||||
{
|
||||
if (currFrame >= subtitles[n].getFrom() && currFrame < subtitles[n].getTo())
|
||||
{
|
||||
dynamic_cast<CutsceneGUI*>(m_race_gui)->setSubtitle(subtitles[n].getText());
|
||||
foundSubtitle = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!foundSubtitle)
|
||||
{
|
||||
dynamic_cast<CutsceneGUI*>(m_race_gui)->setSubtitle(core::stringw(L""));
|
||||
}
|
||||
|
||||
|
||||
World::update(dt);
|
||||
World::updateTrack(dt);
|
||||
|
||||
|
@ -36,7 +36,6 @@ class TrackObject;
|
||||
*/
|
||||
class CutsceneWorld : public World
|
||||
{
|
||||
|
||||
scene::ICameraSceneNode* m_camera;
|
||||
|
||||
std::map<float, std::vector<TrackObject*> > m_sounds_to_trigger;
|
||||
|
@ -16,19 +16,27 @@
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
#include "guiengine/engine.hpp"
|
||||
#include "guiengine/scalable_font.hpp"
|
||||
#include "graphics/irr_driver.hpp"
|
||||
#include "states_screens/cutscene_gui.hpp"
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
CutsceneGUI::CutsceneGUI()
|
||||
{
|
||||
m_fade_level = 0.0f;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
CutsceneGUI::~CutsceneGUI()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
void CutsceneGUI::renderGlobal(float dt)
|
||||
{
|
||||
if (m_fade_level > 0.0f)
|
||||
@ -38,10 +46,21 @@ void CutsceneGUI::renderGlobal(float dt)
|
||||
UserConfigParams::m_width,
|
||||
UserConfigParams::m_height));
|
||||
}
|
||||
|
||||
if (m_subtitle.size() > 0)
|
||||
{
|
||||
core::rect<s32> r(0, UserConfigParams::m_height - GUIEngine::getFontHeight()*2,
|
||||
UserConfigParams::m_width, UserConfigParams::m_height);
|
||||
GUIEngine::getFont()->draw(m_subtitle, r,
|
||||
video::SColor(255,255,255,255), true, true, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
void CutsceneGUI::renderPlayerView(const AbstractKart *kart)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
@ -43,6 +43,7 @@ class CutsceneGUI : public RaceGUIBase
|
||||
private:
|
||||
|
||||
float m_fade_level;
|
||||
core::stringw m_subtitle;
|
||||
|
||||
public:
|
||||
|
||||
@ -50,6 +51,7 @@ public:
|
||||
~CutsceneGUI();
|
||||
|
||||
void setFadeLevel(float level) { m_fade_level = level; }
|
||||
void setSubtitle(const core::stringw& subtitle) { m_subtitle = subtitle; }
|
||||
|
||||
virtual void renderGlobal(float dt);
|
||||
virtual void renderPlayerView(const AbstractKart *kart);
|
||||
|
@ -1413,6 +1413,23 @@ void Track::loadTrackModel(World* parent, bool reverse_track,
|
||||
{
|
||||
// handled above
|
||||
}
|
||||
else if (name == "subtitles")
|
||||
{
|
||||
std::vector<XMLNode*> subtitles;
|
||||
node->getNodes("subtitle", subtitles);
|
||||
for (int i = 0; i < subtitles.size(); i++)
|
||||
{
|
||||
int from = -1, to = -1;
|
||||
std::string subtitle_text;
|
||||
subtitles[i]->get("from", &from);
|
||||
subtitles[i]->get("to", &to);
|
||||
subtitles[i]->get("text", &subtitle_text);
|
||||
if (from != -1 && to != -1 && subtitle_text.size() > 0)
|
||||
{
|
||||
m_subtitles.push_back( Subtitle(from, to, _(subtitle_text.c_str())) );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Warning: while loading track '%s', element '%s' was met but is unknown.\n",
|
||||
|
@ -120,6 +120,22 @@ public:
|
||||
};
|
||||
|
||||
|
||||
struct Subtitle
|
||||
{
|
||||
int m_from, m_to;
|
||||
core::stringw m_text;
|
||||
|
||||
Subtitle(int from, int to, core::stringw text)
|
||||
{
|
||||
m_from = from;
|
||||
m_to = to;
|
||||
m_text = text;
|
||||
}
|
||||
int getFrom() const { return m_from; }
|
||||
int getTo() const { return m_to; }
|
||||
const core::stringw& getText() const { return m_text; }
|
||||
};
|
||||
|
||||
/**
|
||||
* \ingroup tracks
|
||||
*/
|
||||
@ -141,6 +157,8 @@ private:
|
||||
|
||||
std::vector<OverworldForceField> m_force_fields;
|
||||
|
||||
std::vector<Subtitle> m_subtitles;
|
||||
|
||||
/** Start transforms of karts (either the default, or the ones taken
|
||||
* from the scene file). */
|
||||
AlignedArray<btTransform> m_start_transforms;
|
||||
@ -484,6 +502,7 @@ public:
|
||||
const std::vector<OverworldChallenge>& getChallengeList() const
|
||||
{ return m_challenges; }
|
||||
|
||||
const std::vector<Subtitle>& getSubtitles() const { return m_subtitles; }
|
||||
|
||||
}; // class Track
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user