Move lyric display into an actor
Use Commands for tween in/out; queue a whole lyric line at once (simpler)
This commit is contained in:
@@ -0,0 +1,83 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "LyricDisplay.h"
|
||||||
|
|
||||||
|
#include "GameState.h"
|
||||||
|
#include "ThemeManager.h"
|
||||||
|
|
||||||
|
#define IN_COMMAND THEME->GetMetric("LyricDisplay","InCommand")
|
||||||
|
#define OUT_COMMAND THEME->GetMetric("LyricDisplay","OutCommand")
|
||||||
|
|
||||||
|
float g_TweenInTime, g_TweenOutTime;
|
||||||
|
|
||||||
|
LyricDisplay::LyricDisplay()
|
||||||
|
{
|
||||||
|
// We need to use the Color Tag that's in m_pCurSong->m_LyricSegments[?].m_sColor
|
||||||
|
// But since the value there is in Hex, need to convert to RageColor I guess.
|
||||||
|
// Until that gets done, this will default to white (&HFFFFFF)
|
||||||
|
|
||||||
|
m_textLyrics.LoadFromFont( THEME->GetPathTo("Fonts","normal") );
|
||||||
|
m_textLyrics.SetDiffuse( RageColor(1,1,1,1) );
|
||||||
|
this->AddChild(&m_textLyrics);
|
||||||
|
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LyricDisplay::Init()
|
||||||
|
{
|
||||||
|
m_textLyrics.SetText("");
|
||||||
|
m_iCurLyricNumber = 0;
|
||||||
|
|
||||||
|
/* Update global cache: */
|
||||||
|
g_TweenInTime = Actor::GetCommandLength(IN_COMMAND);
|
||||||
|
g_TweenOutTime = Actor::GetCommandLength(OUT_COMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LyricDisplay::Update( float fDeltaTime )
|
||||||
|
{
|
||||||
|
ActorFrame::Update( fDeltaTime );
|
||||||
|
|
||||||
|
// Make sure we don't go over the array's boundry
|
||||||
|
if( m_iCurLyricNumber >= GAMESTATE->m_pCurSong->m_LyricSegments.size() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
Song *song = GAMESTATE->m_pCurSong;
|
||||||
|
const float fStartTime = (song->m_LyricSegments[m_iCurLyricNumber].m_fStartTime) - g_TweenInTime;
|
||||||
|
|
||||||
|
if(GAMESTATE->m_fMusicSeconds < fStartTime)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const float MaxDisplayTime = 10;
|
||||||
|
|
||||||
|
float fShowLength = MaxDisplayTime;
|
||||||
|
|
||||||
|
if(m_iCurLyricNumber+1 < GAMESTATE->m_pCurSong->m_LyricSegments.size())
|
||||||
|
{
|
||||||
|
/* Clamp this lyric to the beginning of the next. */
|
||||||
|
const float Distance =
|
||||||
|
song->m_LyricSegments[m_iCurLyricNumber+1].m_fStartTime -
|
||||||
|
song->m_LyricSegments[m_iCurLyricNumber].m_fStartTime;
|
||||||
|
const float TweenBufferTime = g_TweenInTime + g_TweenOutTime;
|
||||||
|
|
||||||
|
fShowLength = min(fShowLength, Distance - TweenBufferTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_textLyrics.SetText( GAMESTATE->m_pCurSong->m_LyricSegments[m_iCurLyricNumber].m_sLyric );
|
||||||
|
// m_textLyrics.SetDiffuse(COLOR);
|
||||||
|
|
||||||
|
m_textLyrics.StopTweening();
|
||||||
|
m_textLyrics.Command(IN_COMMAND);
|
||||||
|
m_textLyrics.BeginTweening( fShowLength ); /* sleep */
|
||||||
|
m_textLyrics.Command(OUT_COMMAND);
|
||||||
|
|
||||||
|
m_iCurLyricNumber++;
|
||||||
|
|
||||||
|
/*I figure for longer lines of text, the Lyric display object should
|
||||||
|
be scaled down, if needed, by the .ScaleTo() function. But somehow
|
||||||
|
it jus ain't working for me at all.. anyone able to do this
|
||||||
|
properly?? We prolly should also add detection of where to put
|
||||||
|
the Lyric object, if the arrows are on reverse? Jus an idea,
|
||||||
|
but it kinda defeats the purpose of the Lyric object X/Y being a
|
||||||
|
theme element :)
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef LYRIC_DISPLAY_H
|
||||||
|
#define LYRIC_DISPLAY_H
|
||||||
|
|
||||||
|
#include "ActorFrame.h"
|
||||||
|
#include "Song.h"
|
||||||
|
#include "BitmapText.h"
|
||||||
|
|
||||||
|
class LyricDisplay: public ActorFrame {
|
||||||
|
public:
|
||||||
|
LyricDisplay();
|
||||||
|
void Update(float fDeltaTime);
|
||||||
|
|
||||||
|
/* Call when song changes: */
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
private:
|
||||||
|
BitmapText m_textLyrics;
|
||||||
|
unsigned m_iCurLyricNumber;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user