clean up EditMode transitions

don't explicitly draw and update Actors - add as children so that Z ordering is correct
This commit is contained in:
Chris Danford
2005-03-18 19:44:01 +00:00
parent b6fe07c1d2
commit c10dc7eab2
2 changed files with 87 additions and 112 deletions
+85 -109
View File
@@ -528,7 +528,7 @@ void ScreenEdit::Init()
m_pSteps->GetNoteData( noteData );
m_EditMode = MODE_EDITING;
TransitionEditMode( MODE_EDITING );
GAMESTATE->m_bPastHereWeGo = false;
GAMESTATE->m_bEditing = true;
@@ -546,22 +546,28 @@ void ScreenEdit::Init()
g_iShiftAnchor = -1;
this->AddChild( &m_Background );
m_SnapDisplay.SetXY( EDIT_X, PLAYER_Y_STANDARD );
m_SnapDisplay.Load( PLAYER_1 );
m_SnapDisplay.SetZoom( 0.5f );
this->AddChild( &m_SnapDisplay );
m_NoteDataEdit.CopyAll( noteData );
m_NoteFieldEdit.SetXY( EDIT_X, PLAYER_Y );
m_NoteFieldEdit.SetZoom( 0.5f );
m_NoteDataEdit.CopyAll( noteData );
m_NoteFieldEdit.Init( GAMESTATE->m_pPlayerState[PLAYER_1], PLAYER_HEIGHT*2 );
m_NoteFieldEdit.Load( &m_NoteDataEdit, -240, 800 );
this->AddChild( &m_NoteFieldEdit );
m_NoteDataRecord.CopyAll( noteData );
m_NoteFieldRecord.SetXY( EDIT_X, PLAYER_Y );
m_NoteDataRecord.CopyAll( noteData );
m_NoteFieldRecord.Init( GAMESTATE->m_pPlayerState[PLAYER_1], 350 );
m_NoteFieldRecord.Load( &m_NoteDataRecord, -150, 350 );
this->AddChild( &m_NoteFieldRecord );
m_Clipboard.SetNumTracks( m_NoteDataEdit.GetNumTracks() );
@@ -577,6 +583,9 @@ void ScreenEdit::Init()
m_Player.Load( noteData );
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = PC_HUMAN;
m_Player.SetXY( PLAYER_X, PLAYER_Y );
this->AddChild( &m_Player );
this->AddChild( &m_Foreground );
m_textHelp.LoadFromFont( THEME->GetPathF("Common","normal") );
m_textHelp.SetXY( HELP_TEXT_X, HELP_TEXT_Y );
@@ -585,6 +594,7 @@ void ScreenEdit::Init()
m_textHelp.SetZoom( 0.5f );
m_textHelp.SetText( HELP_TEXT );
m_textHelp.SetShadowLength( 0 );
this->AddChild( &m_textHelp );
m_textInfo.LoadFromFont( THEME->GetPathF("Common","normal") );
m_textInfo.SetXY( INFO_TEXT_X, INFO_TEXT_Y );
@@ -592,16 +602,20 @@ void ScreenEdit::Init()
m_textInfo.SetVertAlign( Actor::align_top );
m_textInfo.SetZoom( 0.5f );
m_textInfo.SetShadowLength( 0 );
//m_textInfo.SetText(); // set this below every frame
this->AddChild( &m_textInfo );
m_soundChangeLine.Load( THEME->GetPathS("ScreenEdit","line") );
m_soundChangeSnap.Load( THEME->GetPathS("ScreenEdit","snap") );
m_soundMarker.Load( THEME->GetPathS("ScreenEdit","marker") );
this->SortByDrawOrder();
m_soundChangeLine.Load( THEME->GetPathS("ScreenEdit","line"), true );
m_soundChangeSnap.Load( THEME->GetPathS("ScreenEdit","snap"), true );
m_soundMarker.Load( THEME->GetPathS("ScreenEdit","marker"), true );
m_soundMusic.Load( m_pSong->GetMusicPath() );
m_soundAssistTick.Load( THEME->GetPathS("ScreenEdit","assist tick") );
m_soundAssistTick.Load( THEME->GetPathS("ScreenEdit","assist tick"), true );
this->HandleScreenMessage( SM_DoUpdateTextInfo );
}
@@ -702,41 +716,15 @@ void ScreenEdit::Update( float fDeltaTime )
if( m_EditMode == MODE_RECORDING || m_EditMode == MODE_PLAYING )
{
if( PREFSMAN->m_bEditorShowBGChangesPlay )
{
m_Background.Update( fDeltaTime );
m_Foreground.Update( fDeltaTime );
}
// check for end of playback/record
if( GAMESTATE->m_fSongBeat > NoteRowToBeat(m_NoteFieldEdit.m_iEndMarker) + 4 ) // give a one measure lead out
{
if( m_EditMode == MODE_RECORDING )
{
TransitionFromRecordToEdit();
}
else if( m_EditMode == MODE_PLAYING )
{
TransitionToEdit();
}
TransitionEditMode( MODE_EDITING );
GAMESTATE->m_fSongBeat = NoteRowToBeat( m_NoteFieldEdit.m_iEndMarker );
}
}
m_SnapDisplay.Update( fDeltaTime );
m_NoteFieldEdit.Update( fDeltaTime );
m_textHelp.Update( fDeltaTime );
m_textInfo.Update( fDeltaTime );
if( m_EditMode == MODE_RECORDING )
m_NoteFieldRecord.Update( fDeltaTime );
if( m_EditMode == MODE_PLAYING )
{
m_Player.Update( fDeltaTime );
}
//LOG->Trace( "ScreenEdit::Update(%f)", fDeltaTime );
ScreenWithMenuElements::Update( fDeltaTime );
@@ -785,47 +773,13 @@ void ScreenEdit::UpdateTextInfo()
void ScreenEdit::DrawPrimitives()
{
switch( m_EditMode )
{
case MODE_EDITING:
{
m_sprOverlay->Draw();
m_textHelp.Draw();
m_textInfo.Draw();
m_SnapDisplay.Draw();
// HACK: Make NoteFieldEdit draw using the trailing beat
float fSongBeat = GAMESTATE->m_fSongBeat; // save song beat
GAMESTATE->m_fSongBeat = m_fTrailingBeat; // put trailing beat in effect
m_NoteFieldEdit.Draw();
GAMESTATE->m_fSongBeat = fSongBeat; // restore real song beat
}
break;
case MODE_RECORDING:
if( PREFSMAN->m_bEditorShowBGChangesPlay )
m_Background.Draw();
m_sprOverlay->Draw();
m_NoteFieldRecord.Draw();
if( PREFSMAN->m_bEditorShowBGChangesPlay )
m_Foreground.Draw();
break;
case MODE_PLAYING:
if( PREFSMAN->m_bEditorShowBGChangesPlay )
m_Background.Draw();
m_sprOverlay->Draw();
m_Player.Draw();
if( PREFSMAN->m_bEditorShowBGChangesPlay )
m_Foreground.Draw();
break;
default:
ASSERT(0);
}
// HACK: Draw using the trailing beat
float fSongBeat = GAMESTATE->m_fSongBeat; // save song beat
GAMESTATE->m_fSongBeat = m_fTrailingBeat; // put trailing beat in effect
ScreenWithMenuElements::DrawPrimitives();
GAMESTATE->m_fSongBeat = fSongBeat; // restore real song beat
}
void ScreenEdit::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
@@ -1355,7 +1309,7 @@ void ScreenEdit::InputRecord( const DeviceInput& DeviceI, const InputEventType t
{
if( EditB == EDIT_BUTTON_RETURN_TO_EDIT )
{
TransitionFromRecordToEdit();
TransitionEditMode( MODE_EDITING );
return;
}
@@ -1397,7 +1351,7 @@ void ScreenEdit::InputPlay( const DeviceInput& DeviceI, const InputEventType typ
switch( EditB )
{
case EDIT_BUTTON_RETURN_TO_EDIT:
TransitionToEdit();
TransitionEditMode( MODE_EDITING );
break;
case EDIT_BUTTON_TOGGLE_ASSIST_TICK:
GAMESTATE->m_SongOptions.m_bAssistTick ^= 1;
@@ -1443,44 +1397,66 @@ void ScreenEdit::InputPlay( const DeviceInput& DeviceI, const InputEventType typ
}
/* Switch to editing. */
void ScreenEdit::TransitionToEdit()
void ScreenEdit::TransitionEditMode( EditMode em )
{
m_sprOverlay->PlayCommand( "Edit" );
/* Important: people will stop playing, change the BG and start again; make sure we reload */
m_Background.Unload();
m_Foreground.Unload();
m_EditMode = MODE_EDITING;
GAMESTATE->m_bPastHereWeGo = false;
m_soundMusic.StopPlaying();
m_soundAssistTick.StopPlaying(); /* Stop any queued assist ticks. */
EditMode old = m_EditMode;
/* Make sure we're snapped. */
GAMESTATE->m_fSongBeat = Quantize( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_SnapDisplay.GetNoteType()) );
switch( em )
{
case MODE_EDITING:
m_sprOverlay->PlayCommand( "Edit" );
/* Playing and recording have lead-ins, which may start before beat 0;
* make sure we don't stay there if we escaped out early. */
GAMESTATE->m_fSongBeat = max( GAMESTATE->m_fSongBeat, 0 );
/* Important: people will stop playing, change the BG and start again; make sure we reload */
m_Background.Unload();
m_Foreground.Unload();
/* Stop displaying course attacks, if any. */
GAMESTATE->RemoveAllActiveAttacks();
GAMESTATE->RebuildPlayerOptionsFromActiveAttacks( PLAYER_1 );
GAMESTATE->m_pPlayerState[PLAYER_1]->m_CurrentPlayerOptions = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions;
}
GAMESTATE->m_bPastHereWeGo = false;
m_soundMusic.StopPlaying();
m_soundAssistTick.StopPlaying(); /* Stop any queued assist ticks. */
void ScreenEdit::TransitionFromRecordToEdit()
{
TransitionToEdit();
/* Make sure we're snapped. */
GAMESTATE->m_fSongBeat = Quantize( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_SnapDisplay.GetNoteType()) );
// delete old TapNotes in the range
m_NoteDataEdit.ClearRange( m_NoteFieldEdit.m_iBeginMarker, m_NoteFieldEdit.m_iEndMarker );
/* Playing and recording have lead-ins, which may start before beat 0;
* make sure we don't stay there if we escaped out early. */
GAMESTATE->m_fSongBeat = max( GAMESTATE->m_fSongBeat, 0 );
m_NoteDataEdit.CopyRange( m_NoteDataRecord, m_NoteFieldEdit.m_iBeginMarker, m_NoteFieldEdit.m_iEndMarker, m_NoteFieldEdit.m_iBeginMarker );
/* Stop displaying course attacks, if any. */
GAMESTATE->RemoveAllActiveAttacks();
GAMESTATE->RebuildPlayerOptionsFromActiveAttacks( PLAYER_1 );
GAMESTATE->m_pPlayerState[PLAYER_1]->m_CurrentPlayerOptions = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions;
m_NoteDataRecord.ClearAll();
if( old == MODE_RECORDING )
{
// delete old TapNotes in the range
m_NoteDataEdit.ClearRange( m_NoteFieldEdit.m_iBeginMarker, m_NoteFieldEdit.m_iEndMarker );
m_NoteDataEdit.CopyRange( m_NoteDataRecord, m_NoteFieldEdit.m_iBeginMarker, m_NoteFieldEdit.m_iEndMarker, m_NoteFieldEdit.m_iBeginMarker );
m_NoteDataRecord.ClearAll();
}
break;
case MODE_RECORDING:
break;
case MODE_PLAYING:
break;
default:
ASSERT(0);
}
//
// Show/hide depending on em
//
m_Background.SetHidden( !PREFSMAN->m_bEditorShowBGChangesPlay || em == MODE_EDITING );
m_textHelp.SetHidden( em != MODE_EDITING );
m_textInfo.SetHidden( em != MODE_EDITING );
m_SnapDisplay.SetHidden( em != MODE_EDITING );
m_NoteFieldEdit.SetHidden( em != MODE_EDITING );
m_NoteFieldRecord.SetHidden( em != MODE_RECORDING );
m_Player.SetHidden( em != MODE_PLAYING );
m_Foreground.SetHidden( !PREFSMAN->m_bEditorShowBGChangesPlay || em == MODE_EDITING );
m_EditMode = em;
}
void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
@@ -2149,7 +2125,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
SOUND->PlayMusic("");
m_EditMode = MODE_PLAYING;
TransitionEditMode( MODE_PLAYING );
m_sprOverlay->PlayCommand( "Play" );
GAMESTATE->m_bPastHereWeGo = true;
@@ -2201,7 +2177,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
SOUND->PlayMusic("");
m_EditMode = MODE_RECORDING;
TransitionEditMode( MODE_RECORDING );
m_sprOverlay->PlayCommand( "Record" );
GAMESTATE->m_bPastHereWeGo = true;