コード例 #1
0
    private IEnumerator DoUpdate()
    {
        while (true)
        {
            if (m_UpdateSnakeMovementTime >= slConstants.UPDATE_SNAKE_MOVEMENT_TIEM_INTERVAL)
            {
                // update snake movement
                m_UpdateSnakeMovementTime -= slConstants.UPDATE_SNAKE_MOVEMENT_TIEM_INTERVAL;
                hwmDebug.Assert(m_UpdateSnakeMovementTime < slConstants.UPDATE_SNAKE_MOVEMENT_TIEM_INTERVAL
                                , "m_UpdateSnakeMovementTime < slConstants.UPDATE_SNAKE_MOVEMENT_TIEM_INTERVAL");

                for (int iSnake = 0; iSnake < m_Snakes.Count; iSnake++)
                {
                    slSnake snake = m_Snakes[iSnake];
                    snake.DoUpdateMovement(slConstants.UPDATE_SNAKE_MOVEMENT_TIEM_INTERVAL);
                }
                slWorld.GetInstance().GetSnakeSystem().GetQuadtree().MergeAndSplitAllNode();
                yield return(UpdateType.SnakeMovement);

                // update snake collide
                m_DeadSnakes.Clear();
                for (int iSnake = 0; iSnake < m_Snakes.Count; iSnake++)
                {
                    slSnake iterSnake = m_Snakes[iSnake];
                    iterSnake.DoUpdateCollide();
                    if (!iterSnake.IsAlive())
                    {
                        m_DeadSnakes.Add(iterSnake);
                    }
                }
                for (int iSnake = 0; iSnake < m_DeadSnakes.Count; iSnake++)
                {
                    slSnake iterSnake = m_DeadSnakes[iSnake];
                    iterSnake.Dead();
                }
                yield return(UpdateType.SnakeCollide);

                // update snake eat food
                for (int iSnake = 0; iSnake < m_Snakes.Count; iSnake++)
                {
                    slSnake iterSnake = m_Snakes[iSnake];
                    iterSnake.DoUpdateEatFood();
                }
                yield return(UpdateType.SnakeEatFood);

                // update foods
                slWorld.GetInstance().GetFoodSystem().DoUpdateFoods(m_Time - m_LastUpdateFoodsTime);
                m_LastUpdateFoodsTime = m_Time;
                yield return(UpdateType.Foods);

                // update food system
                slWorld.GetInstance().GetFoodSystem().DoUpdateFoodSystem();
                yield return(UpdateType.FoodSystem);

                // update snake ai
                for (int iSnake = 0; iSnake < m_Snakes.Count; iSnake++)
                {
                    slSnake iterSnake = m_Snakes[iSnake];
                    if (iterSnake.GetController() != null &&
                        iterSnake.GetController().IsAI())
                    {
                        (iterSnake.GetController() as slAIController).DoAIUpdate();
                    }
                }
                yield return(UpdateType.SnakeAI);

                // update respawn player

                if (++m_UpdateRespawnPlayerFrame >= slConstants.UPDATE_RESPAWN_FRAME_INTERVAL)
                {
                    m_UpdateRespawnPlayerFrame -= slConstants.UPDATE_RESPAWN_FRAME_INTERVAL;
                    slWorld.GetInstance().GetGameMode().DoUpdateRespawnPlayer();
                }
                yield return(UpdateType.RespawnPlayer);
            }
            else
            {
                yield return(UpdateType.Empty);
            }
        }
    }