move "rolling numbers" functionality out of ScoreDisplayNormal
This commit is contained in:
@@ -275,7 +275,8 @@ Actor.cpp Actor.h ActorCollision.h ActorFrame.cpp ActorFrame.h \
|
|||||||
ActorScroller.cpp ActorScroller.h ActorUtil.cpp ActorUtil.h \
|
ActorScroller.cpp ActorScroller.h ActorUtil.cpp ActorUtil.h \
|
||||||
AutoActor.cpp AutoActor.h \
|
AutoActor.cpp AutoActor.h \
|
||||||
BitmapText.cpp BitmapText.h Model.cpp Model.h \
|
BitmapText.cpp BitmapText.h Model.cpp Model.h \
|
||||||
ModelManager.cpp ModelManager.h ModelTypes.cpp ModelTypes.h Quad.h Sprite.cpp Sprite.h
|
ModelManager.cpp ModelManager.h ModelTypes.cpp ModelTypes.h Quad.h \
|
||||||
|
RollingNumbers.cpp RollingNumbers.h Sprite.cpp Sprite.h
|
||||||
|
|
||||||
GlobalSingletons = \
|
GlobalSingletons = \
|
||||||
AnnouncerManager.cpp AnnouncerManager.h Bookkeeper.cpp Bookkeeper.h CryptManager.cpp CryptManager.h \
|
AnnouncerManager.cpp AnnouncerManager.h Bookkeeper.cpp Bookkeeper.h CryptManager.cpp CryptManager.h \
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "RollingNumbers.h"
|
||||||
|
#include "RageUtil.h"
|
||||||
|
#include "XmlFile.h"
|
||||||
|
|
||||||
|
RollingNumbers::RollingNumbers()
|
||||||
|
{
|
||||||
|
m_sFormat = "%9.0f";
|
||||||
|
m_fApproachSeconds = 0.2f;
|
||||||
|
|
||||||
|
m_fCurrentNumber = 0;
|
||||||
|
m_fTargetNumber = 0;
|
||||||
|
m_fScoreVelocity = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollingNumbers::LoadFromNode( const CString& sDir, const XNode* pNode )
|
||||||
|
{
|
||||||
|
BitmapText::LoadFromNode( sDir, pNode );
|
||||||
|
|
||||||
|
pNode->GetAttrValue( "Format", m_sFormat );
|
||||||
|
pNode->GetAttrValue( "ApproachSeconds", m_fApproachSeconds );
|
||||||
|
|
||||||
|
UpdateText();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollingNumbers::Update( float fDeltaTime )
|
||||||
|
{
|
||||||
|
if( m_fCurrentNumber != m_fTargetNumber )
|
||||||
|
{
|
||||||
|
fapproach( m_fCurrentNumber, m_fTargetNumber, m_fScoreVelocity * fDeltaTime );
|
||||||
|
UpdateText();
|
||||||
|
}
|
||||||
|
|
||||||
|
BitmapText::Update( fDeltaTime );
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollingNumbers::SetTargetNumber( float fTargetNumber )
|
||||||
|
{
|
||||||
|
m_fTargetNumber = fTargetNumber;
|
||||||
|
m_fScoreVelocity = (m_fTargetNumber-m_fCurrentNumber) / m_fApproachSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollingNumbers::UpdateText()
|
||||||
|
{
|
||||||
|
SetText( ssprintf(m_sFormat, m_fCurrentNumber) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (c) 2001-2004 Chris Danford
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
||||||
|
* whom the Software is furnished to do so, provided that the above
|
||||||
|
* copyright notice(s) and this permission notice appear in all copies of
|
||||||
|
* the Software and that both the above copyright notice(s) and this
|
||||||
|
* permission notice appear in supporting documentation.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||||
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||||
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
||||||
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||||
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/* RollingNumbers - animates from one number to another by scrolling its digits. */
|
||||||
|
|
||||||
|
#ifndef RollingNumbers_H
|
||||||
|
#define RollingNumbers_H
|
||||||
|
|
||||||
|
#include "BitmapText.h"
|
||||||
|
|
||||||
|
|
||||||
|
class RollingNumbers : public BitmapText
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RollingNumbers();
|
||||||
|
|
||||||
|
void LoadFromNode( const CString& sDir, const XNode* pNode );
|
||||||
|
|
||||||
|
virtual void Update( float fDeltaTime );
|
||||||
|
|
||||||
|
void SetTargetNumber( float fTargetNumber );
|
||||||
|
|
||||||
|
void UpdateText();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Loaded attributes
|
||||||
|
//
|
||||||
|
// Time between the call to SetTargetNumber and m_fCurrentNumber ==
|
||||||
|
// m_fTargetNumber. Used to calculate m_fScoreVelocity.
|
||||||
|
float m_fApproachSeconds;
|
||||||
|
CString m_sFormat;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculated
|
||||||
|
//
|
||||||
|
float m_fCurrentNumber; // currently showing this
|
||||||
|
float m_fTargetNumber; // approach this
|
||||||
|
float m_fScoreVelocity; // approach target at this speed
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (c) 2001-2004 Chris Danford
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
||||||
|
* whom the Software is furnished to do so, provided that the above
|
||||||
|
* copyright notice(s) and this permission notice appear in all copies of
|
||||||
|
* the Software and that both the above copyright notice(s) and this
|
||||||
|
* permission notice appear in supporting documentation.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||||
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||||
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
||||||
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||||
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
@@ -24,16 +24,7 @@ ScoreDisplayNormal::ScoreDisplayNormal()
|
|||||||
// init the text
|
// init the text
|
||||||
m_text.LoadFromFont( THEME->GetPathF("ScoreDisplayNormal","numbers") );
|
m_text.LoadFromFont( THEME->GetPathF("ScoreDisplayNormal","numbers") );
|
||||||
m_text.SetShadowLength( 0 );
|
m_text.SetShadowLength( 0 );
|
||||||
|
m_text.UpdateText();
|
||||||
m_iScore = 0;
|
|
||||||
|
|
||||||
m_iTrailingScore = 0;
|
|
||||||
m_iScoreVelocity = 0;
|
|
||||||
|
|
||||||
CString s;
|
|
||||||
for( int i=0; i<NUM_SCORE_DIGITS; i++ )
|
|
||||||
s += ' ';
|
|
||||||
m_text.SetText( s );
|
|
||||||
this->AddChild( &m_text );
|
this->AddChild( &m_text );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,63 +40,38 @@ void ScoreDisplayNormal::Init( const PlayerState* pPlayerState )
|
|||||||
|
|
||||||
void ScoreDisplayNormal::SetScore( int iNewScore )
|
void ScoreDisplayNormal::SetScore( int iNewScore )
|
||||||
{
|
{
|
||||||
m_iScore = iNewScore;
|
|
||||||
|
|
||||||
// play some games to display the correct score -- the actual internal score does not change at all
|
|
||||||
// but the displayed one can (ie: displayed score for subtracrive is MaxScore - score)
|
|
||||||
|
|
||||||
// TODO: Remove use of PlayerNumber.
|
// TODO: Remove use of PlayerNumber.
|
||||||
PlayerNumber pn = m_pPlayerState->m_PlayerNumber;
|
PlayerNumber pn = m_pPlayerState->m_PlayerNumber;
|
||||||
|
|
||||||
|
// Play some games to display the correct score -- the actual internal
|
||||||
|
// score does not change at all but the displayed one can (ie: displayed
|
||||||
|
// score for subtracrive is MaxScore - score).
|
||||||
|
|
||||||
if( m_pPlayerState->m_CurrentPlayerOptions.m_ScoreDisplay == PlayerOptions::SCORING_SUBTRACT )
|
|
||||||
|
int iMaxScore = g_CurStageStats.m_player[pn].iMaxScore;
|
||||||
|
int iCurMaxScore = g_CurStageStats.m_player[pn].iCurMaxScore;
|
||||||
|
|
||||||
|
switch( m_pPlayerState->m_CurrentPlayerOptions.m_ScoreDisplay )
|
||||||
{
|
{
|
||||||
m_iScore = g_CurStageStats.m_player[pn].iMaxScore - ( g_CurStageStats.m_player[pn].iCurMaxScore - iNewScore );
|
case PlayerOptions::SCORING_ADD:
|
||||||
|
// nothing to do
|
||||||
|
break;
|
||||||
|
case PlayerOptions::SCORING_SUBTRACT:
|
||||||
|
iNewScore = iMaxScore - ( iCurMaxScore - iNewScore );
|
||||||
|
break;
|
||||||
|
case PlayerOptions::SCORING_AVERAGE:
|
||||||
|
if( iCurMaxScore == 0 ) // don't divide by zero fats
|
||||||
|
{
|
||||||
|
iNewScore = 0;
|
||||||
}
|
}
|
||||||
else if( m_pPlayerState->m_CurrentPlayerOptions.m_ScoreDisplay == PlayerOptions::SCORING_AVERAGE )
|
|
||||||
{
|
|
||||||
if( g_CurStageStats.m_player[pn].iCurMaxScore == 0 ) // don't divide by zero fats
|
|
||||||
m_iScore = 0;
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float scoreRatio = (float) iNewScore / (float) g_CurStageStats.m_player[pn].iCurMaxScore;
|
float fScoreRatio = iNewScore / (float)iCurMaxScore;
|
||||||
m_iScore = (int) ( scoreRatio * g_CurStageStats.m_player[pn].iMaxScore );
|
iNewScore = fScoreRatio * iMaxScore;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int iDelta = m_iScore - m_iTrailingScore;
|
m_text.SetTargetNumber( iNewScore );
|
||||||
|
|
||||||
m_iScoreVelocity = int(float(iDelta) / SCORE_TWEEN_TIME); // in score units per second
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScoreDisplayNormal::SetText( CString s )
|
|
||||||
{
|
|
||||||
m_text.SetText( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ScoreDisplayNormal::Update( float fDeltaTime )
|
|
||||||
{
|
|
||||||
ScoreDisplay::Update( fDeltaTime );
|
|
||||||
|
|
||||||
if( m_iTrailingScore != m_iScore )
|
|
||||||
{
|
|
||||||
// adjust for when player fails
|
|
||||||
int increment = int(m_iScoreVelocity * fDeltaTime);
|
|
||||||
if (m_iScoreVelocity != 0 && increment == 0) increment = 1;
|
|
||||||
|
|
||||||
int iDeltaBefore = m_iScore - m_iTrailingScore;
|
|
||||||
m_iTrailingScore += increment;
|
|
||||||
int iDeltaAfter = m_iScore - m_iTrailingScore;
|
|
||||||
|
|
||||||
if( (iDeltaBefore < 0 && iDeltaAfter > 0) ||
|
|
||||||
(iDeltaBefore > 0 && iDeltaAfter < 0) ) // the sign changed
|
|
||||||
{
|
|
||||||
m_iTrailingScore = m_iScore;
|
|
||||||
m_iScoreVelocity = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_text.SetText( ssprintf("%*.0i", NUM_SCORE_DIGITS, m_iTrailingScore) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#define SCORE_DISPLAY_NORMAL_H
|
#define SCORE_DISPLAY_NORMAL_H
|
||||||
|
|
||||||
#include "ScoreDisplay.h"
|
#include "ScoreDisplay.h"
|
||||||
#include "BitmapText.h"
|
#include "RollingNumbers.h"
|
||||||
#include "Sprite.h"
|
#include "Sprite.h"
|
||||||
|
|
||||||
class ScoreDisplayNormal : public ScoreDisplay
|
class ScoreDisplayNormal : public ScoreDisplay
|
||||||
@@ -14,18 +14,12 @@ public:
|
|||||||
|
|
||||||
virtual void Init( const PlayerState* pPlayerState );
|
virtual void Init( const PlayerState* pPlayerState );
|
||||||
|
|
||||||
virtual void Update( float fDeltaTime );
|
|
||||||
|
|
||||||
virtual void SetScore( int iNewScore );
|
virtual void SetScore( int iNewScore );
|
||||||
virtual void SetText( CString s );
|
virtual void SetText( CString s ) { m_text.SetText(s); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Sprite m_sprFrame;
|
Sprite m_sprFrame;
|
||||||
BitmapText m_text;
|
RollingNumbers m_text;
|
||||||
|
|
||||||
int m_iScore; // the actual score
|
|
||||||
int m_iTrailingScore; // what is displayed temporarily
|
|
||||||
int m_iScoreVelocity; // how fast trailing approaches real score
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1766,6 +1766,14 @@ SOURCE=.\Quad.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\RollingNumbers.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\RollingNumbers.h
|
||||||
|
# End Source File
|
||||||
|
# End Group
|
||||||
|
|
||||||
SOURCE=.\Sprite.cpp
|
SOURCE=.\Sprite.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|||||||
@@ -2285,6 +2285,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\
|
|||||||
<File
|
<File
|
||||||
RelativePath="Quad.h">
|
RelativePath="Quad.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="RollingNumbers.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="RollingNumbers.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Sprite.cpp">
|
RelativePath=".\Sprite.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
|||||||
Reference in New Issue
Block a user