Exemple #1
0
    void Start()
    {
        anim = GetComponent <Animator>();

        var player = GameObject.FindGameObjectWithTag("Player");

        if (this.tag == "Red")
        {
            tower = GameObject.FindGameObjectWithTag("BlueTeam");
            enemy = GameObject.FindGameObjectWithTag("Blue");
        }
        if (this.tag == "Blue")
        {
            tower = GameObject.FindGameObjectWithTag("RedTeam");
            enemy = GameObject.FindGameObjectWithTag("Red");
        }

        if (minionWay == 0)
        {
            point = GameObject.FindGameObjectWithTag("Minion_Bot");
        }
        else if (minionWay == 1)
        {
            point = GameObject.FindGameObjectWithTag("Minion_Mid");
        }
        else if (minionWay == 2)
        {
            point = GameObject.FindGameObjectWithTag("Minion_Top");
        }
        target = point;
        if (player != null)
        {
            playerTr = player.GetComponent <Transform>();
        }
        if (tower != null)
        {
            towerTr = tower.GetComponent <Transform>();
        }
        if (enemy != null)
        {
            enemyTr = enemy.GetComponent <Transform>();
        }

        targetTr = target.GetComponent <Transform>();

        moveAgent = GetComponent <MinionMove>();
        StartCoroutine(checkType());
        StartCoroutine(Action());
    }
 bool TryMove(MinionMove moveState, Point moveTo)
 {
     if (!minions.ContainsKey(moveTo))
     {
         minions.Remove(moveState.minion.position);
         minions[moveTo] = moveState.minion;
         moveState.minion.position = moveTo;
         return true;
     }
     return false;
 }
        public void MoveEnemies(MinionAnimationSequence animation)
        {
            List<MinionMove> minionMoves = new List<MinionMove>();
            HashSet<Minion> minionsStillMoving = new HashSet<Minion>();

            MinionAnimationBatch stepBatch = animation.AddBatch(this, Game1.WALK_ANIM_DURATION);
            // enemies walk forward
            Point levelSize = levelScript.levelSize;
            for (int x = 0; x < levelSize.X; x++) //NB processing these in ascending X order - this matters
            {
                for (int y = levelSize.Y - 1; y >= 0; y--)
                {
                    Minion m = getMinionAt(new Point(x, y));

                    if(m == null)
                        continue;

                    if(m.isEnemy && m.stats.move > 0)
                    {
                        HandleTriggers(new TriggerEvent(TriggerType.beforeMove, m));

                        Vector2 oldDrawPos = m.drawPos;
                        if (m.stats.move == 1 && m.stats.hasKeyword(Keyword.slow) && !m.slow_movedHalfWay)
                        {
                            m.slow_movedHalfWay = true;
                            stepBatch.AddAnimation(m, oldDrawPos, m.drawPos);
                        }
                        else
                        {
                            MinionMove mmove = new MinionMove(m);
                            minionMoves.Add(mmove);
                            minionsStillMoving.Add(m);
                        }
                    }
                }
            }

            CleanUp(animation);

            bool hasMoreMoves = true;
            bool firstPass = true;
            while(hasMoreMoves)
            {
                foreach (MinionMove mmove in minionMoves)
                {
                    if (mmove.movesLeft <= 0)
                        continue;

                    if (levelScript.Blocks(mmove.moveTo, TargetType.empty))
                    {
                        mmove.movesLeft = 0;
                        mmove.moveSpent = true;
                        minionsStillMoving.Remove(mmove.minion);
                    }
                    else if (minions.ContainsKey(mmove.moveTo) && !minionsStillMoving.Contains(getMinionAt(mmove.moveTo)))
                    {
                        // If I'm blocked:
                        if (mmove.minion.stats.hasKeyword(Keyword.unstoppable) || getMinionAt(mmove.moveTo).stats.hasKeyword(Keyword.intangible))
                        {
                            Destroyed(mmove.moveTo, mmove.minion);
                        }
                        mmove.moveSpent = true;
                    }
                }
                CleanUp(animation);

                hasMoreMoves = false;
                foreach (MinionMove mmove in minionMoves)
                {
                    if (mmove.movesLeft > 0)
                    {
                        if (TryMove(mmove, mmove.moveTo))
                        {
                            mmove.moveSpent = true;
                            mmove.minion.slow_movedHalfWay = false;
                            stepBatch.AddAnimation(mmove.minion, mmove.currentAnimPos, mmove.minion.drawPos);
                            mmove.currentAnimPos = mmove.minion.drawPos;
                        }

                        if (mmove.moveSpent)
                        {
                            mmove.movesLeft--;
                            mmove.moveSpent = false;
                        }

                        if (mmove.movesLeft > 0)
                        {
                            hasMoreMoves = true;
                        }
                        else
                        {
                            minionsStillMoving.Remove(mmove.minion);
                        }
                    }
                }

                if (firstPass)
                {
                    levelScript.Apply(this, stepBatch);
                    firstPass = false;
                }
                stepBatch.SetInitialGameState(new GameState(this));

                stepBatch = animation.AddBatch(this, Game1.WALK_ANIM_DURATION);
            }
        }