Exemple #1
0
    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);
    }
Exemple #2
0
    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
    }