public ChangedFieldsCollection FindChangedFieldsComparedTo(IState statef)// PlayerState state) { ChangedFieldsCollection result = new ChangedFieldsCollection(); PlayerState state = (PlayerState)statef; //todo: dynamically find fields //var fieldNames = typeof(PlayerState).GetFields() // .Select(field => field.Name) // .ToList(); if (IsTrailCyan != state.IsTrailCyan) { result.AddChangedField(new ChangedField(IsTrailCyan, "IsTrailCyan", typeof(bool))); } if (PlayerColor != state.PlayerColor) { result.AddChangedField(new ChangedField(PlayerColor, "PlayerColor", typeof(PlayerColor))); } if (IsTrailInForeground != state.IsTrailInForeground) { result.AddChangedField(new ChangedField(IsTrailInForeground, "IsTrailInForeground", typeof(bool))); } if (Position != state.Position) { result.AddChangedField(new ChangedField(Position, "Position", typeof(Vector3))); } if (Velocity != state.Velocity) { result.AddChangedField(new ChangedField(Velocity, "Velocity", typeof(Vector3))); } if (HelperClass.AreTheyDifferent(CollectedPowerUpTypes, state.CollectedPowerUpTypes)) { result.AddChangedField(new ChangedField(HelperClass.CloneTrick(CollectedPowerUpTypes), "CollectedPowerUpTypes", typeof(List <PowerUpType>))); } return(result); }
internal void PutPlayerInState(PlayerState newState, bool force = false) //when force is true it sets everything no matter what changed (useful for initialization) { //find what changed bool playerPositionChanged = false; bool playerVelocityChanged = false; bool playerColorChanged = false; bool trailChanged = false; bool powerUpsChanged = false; if (StateManager.CurrentState.PlayerState.Position != newState.Position) { playerPositionChanged = true; } if (StateManager.CurrentState.PlayerState.Velocity != newState.Velocity) { playerVelocityChanged = true; } if (StateManager.CurrentState.PlayerState.PlayerColor != newState.PlayerColor) { playerColorChanged = true; } if ( StateManager.CurrentState.PlayerState.IsTrailCyan != newState.IsTrailCyan || StateManager.CurrentState.PlayerState.IsTrailInForeground != newState.IsTrailInForeground ) { trailChanged = true; } if (HelperClass.AreTheyDifferent(StateManager.CurrentState.PlayerState.CollectedPowerUpTypes, newState.CollectedPowerUpTypes)) { powerUpsChanged = true; } if (playerPositionChanged || force) { RefreshPlayerPosition(newState); } if (playerVelocityChanged || force) { RefreshPlayerVelocity(newState); } if (playerColorChanged || force) { RefreshPlayerOnlyColor(newState); } if (powerUpsChanged || force) { RefreshPowerUps(newState); } if (StateGroupManager.IsRewinding == false) //(don't add state while we are rewinding) { StateGroupManager.AddStateToCurrentGroup(newState); //add the new state //(it is important that we first add the state to the current group and then start a new group if necessary) if (trailChanged || force) { //there's no such thing as refresh the trail, we must start a new one: StateGroupManager.StartNewStateGroup(newState); StateGroupManager.AddStateToCurrentGroup(newState); //this is necessary because the above line merely initiated a new empty stategroup } } StateManager.CurrentState.PlayerState = newState; //no need to clone it because newstate was new and not a clone }