コード例 #1
0
ファイル: Timeline.cs プロジェクト: GreenCalx/LD47
    public static PlayerTimeline Create(int LoopLevel, int CursorIdx)
    {
        var Result = new PlayerTimeline(LoopLevel, CursorIdx);

        Result.Init();
        return(Result);
    }
コード例 #2
0
ファイル: DeathTouch.cs プロジェクト: toletik/GamJam
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            if (playerTimeline == null)
            {
                playerTimeline = GameObject.FindGameObjectWithTag("GameManager").GetComponent <PlayerTimeline>();
            }

            playerTimeline.CurrentState = BottomAction.E_FINNISH;
        }
    }
コード例 #3
0
    /// <summary>
    /// Add a new player to the list of current players in the wolrld.
    /// The list will remain sorted.
    /// It will also add the player as a TickListener of this world, and will be called at each tick.
    /// </summary>
    /// <param name="StartPosition"></param>
    /// <returns></returns>
    public PlayerController AddPlayer(Vector2 StartPosition)
    {
        var NewPlayer_GO = Instantiate(PlayerPrefab, StartPosition, Quaternion.identity, this.gameObject.transform);

        if (!NewPlayer_GO)
        {
            return(null);
        }
        var NewPlayer      = NewPlayer_GO.GetComponent <PlayerController>();
        var PreviousPlayer = GetCurrentPlayer();

        // prefab is deactivated on spectree as it is used only as prefab
        // and we dont want it to work
        NewPlayer_GO.SetActive(true);
        // if we create a new player it means that we have to wait for inputs now
        // Not sure it is needed anymore but we deactivate all collision between players
        // as the first frame will be a player insisde another one (from which we break)
        foreach (var Player in Mdl.Players)
        {
            Physics2D.IgnoreCollision(Player.GetComponent <Collider2D>(), NewPlayer_GO.GetComponent <Collider2D>());
        }
        // Create the new timeline. It will not be done the first time as it will be null
        // copy previous player variables inside new one
        if (Mdl.Players.Count != 0)
        {
            NewPlayer.GetComponent <Movable>().StartPosition = PreviousPlayer.GetComponent <Movable>().StartPosition;
            // For now new players are randomly colored
            var SpriteRender = NewPlayer.GetComponentInChildren <SpriteRenderer>();
            if (SpriteRender)
            {
                // new player and current loop will always be the bright color
                var PreviousColor = PreviousPlayer.gameObject.GetComponentInChildren <SpriteRenderer>().color;
                SpriteRender.color = new Color(PreviousColor.r, PreviousColor.g, PreviousColor.b, 1);
                // then we uodate every other player color to be darker
                for (int i = 0; i < Mdl.Players.Count - 1; ++i)
                {
                    Mdl.Players[i].GetComponentInChildren <SpriteRenderer>().color *= 0.7f;
                }
            }
        }

        NewPlayer.Mdl.TL = (GetCurrentPlayer() != null) ? GetCurrentPlayer()?.Mdl.TL?.GetNestedTimeline() : PlayerTimeline.Create(0);
        // NOTE toffa : the player timeline is obsed by the player. When the playertimeline receive a tick it will dispatch
        // to the player controller if we are in record mode to make the player move. Each event happening will then be
        // recorded in this.TL
        NewPlayer.Mdl.TL.AddObserver(NewPlayer);

        Mdl.Players.Add(NewPlayer);
        TL.AddObserver(NewPlayer);


        // Add Recording of this player value as moveValue in our timeline
        for (int i = 0; i < 25; ++i)
        {
            if (i <= TL.GetCursorIndex())
            {
                var TLValue = TL.GetCursorValue(i);
                foreach (var V in TLValue.GetObservers())
                {
                    var TransientObs = (V as PlayerMoveValue)?.GetObservers();
                    for (int j = 0; j < TransientObs?.Count; ++j)
                    {
                        if ((TransientObs[j] as MoveValue)._go.gameObject == PreviousPlayer.gameObject)
                        {
                            (V as PlayerMoveValue).AddObserver(new MoveValue(NewPlayer.GetComponent <Movable>(), (TransientObs[j] as MoveValue)._dir));
                        }
                    }
                }

                var PreviousPlayerMove = (PreviousPlayer.Mdl.TL.GetCursorValue(i) as PlayerTimelineValue);
                var NewPlayerMove      = new PlayerMoveValue(NewPlayer.GetComponent <Movable>(), PreviousPlayerMove.GetValue());

                TLValue?.AddObserver(NewPlayerMove);
            }
            else
            {
                TL.GetCursorValue(i)?.AddObserver(new BackTickSentinelValue());
            }
        }
        // IMPORTANT toffa this has to be at the end of the event list, it is used to avoid to ba able to tick back further than this index in record mode
        TL.GetCursorValue(TL.GetCursorIndex())?.AddObserver(new BreakValue());
        TL.GetCursorValue(TL.GetCursorIndex() + 1)?.AddObserver(new CollisionManagerValue(this, NewPlayer));

        return(NewPlayer);
    }