public void OnSongChange(Song newSong, Song prevSong) { var songList = songEntities.Keys.ToList(); var entList = songEntities.Values.ToList(); if (songEntities.TryGetValue(newSong, out SongArtworkEntity ent)) { ent.SetSelectedEntity(true); } if (songEntities.TryGetValue(prevSong, out ent)) { ent.SetSelectedEntity(false); } if (newSong == songList.First() && prevSong == songList.Last()) { //special case handling for jumping back to the start _controller.SongSelectActive = false; //disable changing song until everything's back on the screen. offScreenState = OffScreenEnum.Left; //i think first set them all to jump off the left of the screen, then lay them out as original. for (int i = 0; i <= songEntities.Count - 1; i++) { ent = entList[i]; ent.SetNewX(-SongArtworkEntity.MainSize - 50); //full size of the big one, plus some padding so it doesn't poke on screen. } } else if (newSong == songList.Last() && prevSong == songList.First()) { //special case handling for jumping back to the end _controller.SongSelectActive = false; //disable changing song until everything's back on the screen. offScreenState = OffScreenEnum.Right; //i think first set them all to jump off the left of the screen, then lay them out as original. for (int i = 0; i <= songEntities.Count - 1; i++) { ent = entList[i]; ent.SetNewX(Game.Instance.Width + SongArtworkEntity.MainSize + 50); } } else { bool right = (songList.IndexOf(newSong) > songList.IndexOf(prevSong)); //right means the next song is TO THE RIGHt, so we need to shift everything LEFT if (songEntities.Count > 1) //can't move if we don't have more than 1 { for (int i = 0; i <= songEntities.Count - 1; i++) { ent = entList[i]; var song = songList[i]; float x; if (ent.NewXTweenComplete) { x = ent.X; } else { x = ent.CompleteX; } if (song == prevSong) { //if this is the previous song, it needs to move out the centre //the distance between the centre image and others differs, so get the new song's entity //to figure it out. if (right) { ent.SetNewX(x - SongArtworkEntity.MainSize - SongArtworkEntity.SubGap); } else { ent.SetNewX(x + SongArtworkEntity.MainSize + SongArtworkEntity.SubGap); } } else if (song == newSong) { //similar to above, but in reverse. var tempent = songEntities[prevSong]; if (right) { ent.SetNewX(x - SongArtworkEntity.MainSize - SongArtworkEntity.SubGap); } else { ent.SetNewX(x + SongArtworkEntity.MainSize + SongArtworkEntity.SubGap); } } else { if (right) { ent.SetNewX(x - SongArtworkEntity.SubSize); } else { ent.SetNewX(x + SongArtworkEntity.SubSize); } } } } songEntities.OrderBy(p => p.Value.X); } songDetailsEntity.ChangeSong(newSong); scoreDetailsEntity.ChangeSong(newSong); NextSound.Play(); }
public override void Update() { base.Update(); if (!_controller.AcceptInput) { _controller.AcceptInput = true; //we've returned to the menu from another song, input needs to work now. } if (_controller.State == GameState.ReturnToTitle || _controller.State == GameState.Title) { var entList = songEntities.Values.ToList(); if (!entList.First().Transitioning) { entList.ForEach(e => e.Transitioning = true); songDetailsEntity.Transitioning = true; scoreDetailsEntity.Transitioning = true; } else if (entList.Last().Transitioned) { _controller.OnSongChange = null; //deregister the callbacks to prevent problems _controller.OnMenuStateChange = null; _controller.OnSetDifficulty = null; Game.SwitchScene(new TitleScene(_controller)); } } else if (_controller.State == GameState.Setup || _controller.State == GameState.PreGameHold) { var entList = songEntities.Values.ToList(); if (!entList.First().Transitioning) { entList.ForEach(e => e.Transitioning = true); songDetailsEntity.Transitioning = true; scoreDetailsEntity.Transitioning = true; } else if (entList.Last().Transitioned) { _controller.OnSongChange = null; //deregister the callbacks to prevent problems _controller.OnMenuStateChange = null; _controller.OnSetDifficulty = null; Game.SwitchScene(new GameScene(_controller)); } } if (offScreenState != OffScreenEnum.None) { var songList = songEntities.Keys.ToList(); var entList = songEntities.Values.ToList(); bool nextTween = true; foreach (var ent in songEntities.Values) { if (!ent.NewXTweenComplete) { nextTween = false; break; } } if (nextTween) { float currX = 0; if (offScreenState == OffScreenEnum.Left) { for (int i = 0; i <= songEntities.Count - 1; i++) { var ent = entList[i]; var song = songList[i]; ent.X = Game.Instance.Width + 450; if (song == _controller.CurrentSong) { currX = (Game.Instance.Width / 2); } else { if (songList[i - 1] == _controller.CurrentSong) { currX = (Game.Instance.Width / 2) + SongArtworkEntity.MainSize; } else { currX = entList[i - 1].CompleteX + SongArtworkEntity.SubSize + SongArtworkEntity.SubGap; } } ent.SetNewX(currX); } } else if (offScreenState == OffScreenEnum.Right) { //the same as left but do it the opposite way. for (int i = songEntities.Count - 1; i >= 0; i--) { var ent = entList[i]; var song = songList[i]; ent.X = Game.Instance.Width + 450; if (song == _controller.CurrentSong) { currX = (Game.Instance.Width / 2); } else { if (songList[i + 1] == _controller.CurrentSong) { currX = (Game.Instance.Width / 2) - SongArtworkEntity.MainSize; } else { currX = entList[i + 1].CompleteX - SongArtworkEntity.SubSize + SongArtworkEntity.SubGap; } } ent.SetNewX(currX); } } songDetailsEntity.BringBackToView(); _controller.SongSelectActive = true; offScreenState = OffScreenEnum.None; } } else if (songDetailsEntity.UpdatingSong) { if (songDetailsEntity.OffScreen) { songDetailsEntity.BringBackToView(); } } }