예제 #1
0
    public void Dispose()
    {
        m_Foods.Clear();
        m_Foods = null;
        m_CreateEvents.Clear();
        m_CreateEvents = null;
        m_CreateEvents.Clear();
        m_CreateEvents = null;

        m_Quadtree.Dispose();
        m_Quadtree = null;

        m_FoodPool.Dispose();
        m_FoodPool = null;

        if (m_FoodPresentationPools != null)
        {
            for (int iFood = 0; iFood < m_FoodPresentationPools.Length; iFood++)
            {
                m_FoodPresentationPools[iFood].Dispose();
            }
            m_FoodPresentationPools = null;
        }

        Object.Destroy(m_FoodRoot);
    }
예제 #2
0
    public void DoUpdateCollide()
    {
        hwmBox2D    collideAABB = hwmBox2D.BuildAABB(m_Head.GetPosition(), new Vector2(m_Head.Radius, m_Head.Radius));
        hwmSphere2D headSphere  = new hwmSphere2D(m_Head.GetPosition(), m_Properties.HeadColliderRadius);

        if ((slConstants.DAMAGETYPE_WALL & m_EnableDamageType) != 0 &&
            !slWorld.GetInstance().GetMap().GetMapBox().IsInsideOrOn(m_Head.AABB))
        {
            m_AliveState = AliveState.DeadHitWall;
            return;
        }
        hwmQuadtree <QuadtreeElement> .AABBEnumerator enumerator = new hwmQuadtree <QuadtreeElement> .AABBEnumerator(m_Head.OwnerQuadtree.GetRootNode()
                                                                                                                     , collideAABB);

        while (enumerator.MoveNext())
        {
            hwmQuadtree <QuadtreeElement> .Node iterNode = enumerator.Current;
            hwmBetterList <QuadtreeElement>     elements = iterNode.GetElements();
            for (int iElement = elements.Count - 1; iElement >= 0; iElement--)
            {
                QuadtreeElement iterElement = elements[iElement];
                if ((slConstants.DAMAGETYPE_SNAKE & m_EnableDamageType) != 0 &&
                    iterElement.Owner != m_Guid &&
                    iterElement.NodeType != slConstants.NodeType.Predict &&
                    (iterElement.GetPosition() - m_Head.GetPosition()).sqrMagnitude
                    <= ((m_Head.Radius + iterElement.Radius) * (m_Head.Radius + iterElement.Radius)))
                {
                    m_AliveState = AliveState.DeadHitSnake;
                }
            }
        }
    }
예제 #3
0
    protected bool IsHitPredict()
    {
        ms_SnakeQuadtreeNodes.Clear();
        slWorld.GetInstance().GetSnakeSystem().GetQuadtree().GetRootNode()
        .GetAllIntersectNode(ref ms_SnakeQuadtreeNodes, hwmBox2D.BuildAABB(m_Snake.GetHeadPosition(), new Vector2(m_Snake.GetHeadRadius(), m_Snake.GetHeadRadius())));

        for (int iNode = 0; iNode < ms_SnakeQuadtreeNodes.Count; iNode++)
        {
            hwmQuadtree <slSnake.QuadtreeElement> .Node iterNode = ms_SnakeQuadtreeNodes[iNode];
            hwmBetterList <slSnake.QuadtreeElement>     elements = iterNode.GetElements();
            for (int iElement = elements.Count - 1; iElement >= 0; iElement--)
            {
                slSnake.QuadtreeElement iterElement = elements[iElement];
                if (iterElement.Owner != m_Snake.GetGuid() &&
                    iterElement.NodeType == slConstants.NodeType.Predict)
                {
                    Vector2    predictCenter          = iterElement.GetPosition();
                    Quaternion predictRotationInverse = Quaternion.Inverse(iterElement.GetRotation());
                    Vector2    sphereCenter           = predictCenter
                                                        + hwmMath.QuaternionMultiplyVector(predictRotationInverse, (Vector2)m_Snake.GetHeadPosition() - predictCenter);
                    if (((slSnake.PredictNode)iterElement).Box.IntersectSphere(sphereCenter, m_Snake.GetHeadRadius() * m_Snake.GetHeadRadius()))
                    {
                        return(true);
                    }
                }
            }
        }
        return(false);
    }
예제 #4
0
 public void DoDrawGizmos()
 {
     if (m_Current != null)
     {
         hwmQuadtree <T> .Node gizmosNode = GetDisplayNode();
         Gizmos.color = m_GizmosColor;
         hwmUtility.GizmosDrawBox2D(gizmosNode.GetLooseBox(), m_GizmosZ);
         DoDrawGizomsElements(gizmosNode);
     }
 }
예제 #5
0
 public QuadtreeGizmosEnumerator(hwmQuadtree <T> quadtree)
 {
     m_Quadtree    = quadtree;
     m_Current     = m_Quadtree.GetRootNode();
     m_GizmosColor = Color.black;
     m_GizmosZ     = 0;
     m_GizomosDisplayChilderElement = true;
     m_LastNodes    = new Stack <hwmQuadtree <T> .Node>();
     m_ChilderIndex = NOTSET_CHILDER_INDEX;
 }
예제 #6
0
        public NodePool(slSnakePresentationProperties presentation, Transform root, hwmQuadtree <slSnake.QuadtreeElement> quadtree)
        {
            m_Presentation = presentation;
            m_Root         = root;
            m_Quadtree     = quadtree;

            Type nodeType = typeof(T);

            m_NodeType = nodeType == typeof(slSnake.HeadNode)
                                ? slConstants.NodeType.Head
                                : nodeType == typeof(slSnake.ClothesNode)
                                        ? slConstants.NodeType.Clothes
                                        : slConstants.NodeType.Body;
        }
예제 #7
0
        public void Initialize(hwmQuadtree <T> owner, Node parent, hwmBox2D box, hwmQuadtreeChilderNodeIndex indexInParent)
        {
            bool isRoot = parent == null;

            m_Owner         = owner;
            m_Parent        = parent;
            m_IndexInParent = indexInParent;

            m_Box      = box;
            m_LooseBox = new hwmBox2D(m_Box.Min - m_Owner.m_LooseSize, m_Box.Max + m_Owner.m_LooseSize);

            m_IsLeaf   = true;
            m_Depth    = isRoot ? 1 : parent.m_Depth + 1;
            m_Elements = new hwmBetterList <T>();
        }
예제 #8
0
    public void Initialize(slLevel level)
    {
        m_FoodRoot = new GameObject("Foods").transform;

        m_FoodMaxPosition = level.MapSize * 0.5f - new Vector2(slConstants.FOOD_MAP_EDGE, slConstants.FOOD_MAP_EDGE);
        m_FoodMinPosition = -m_FoodMaxPosition;

        m_MaxFood = level.FoodCount;

        m_FoodPropertiess = new slFoodProperties[(int)slConstants.FoodType.Count];
        for (int iFood = 0; iFood < m_FoodPropertiess.Length; iFood++)
        {
            m_FoodPropertiess[iFood] = hwmSystem.GetInstance().GetAssetLoader().LoadAsset(hwmAssetLoader.AssetType.Game
                                                                                          , slConstants.FOOD_PROPERTIES_PREFAB_STARTWITHS + slConstants.FoodTypeToString((slConstants.FoodType)iFood)) as slFoodProperties;
        }

        m_Quadtree = new hwmQuadtree <slFood>();
        m_Quadtree.Initialize(CalculateQuadtreeDepth()
                              , slConstants.FOOD_QUADTREE_MAXELEMENT_PERNODE
                              , slConstants.FOOD_QUADTREE_MINELEMENT_PREPARENTNODE
                              , new Vector2(slConstants.FOOD_QUADTREE_LOOSESIZE, slConstants.FOOD_QUADTREE_LOOSESIZE)
                              , slWorld.GetInstance().GetMap().GetMapBox());
#if UNITY_EDITOR
        slQuadtreeGizmos.FoodQuadtree = m_Quadtree;
#endif

        m_FoodPool = new FoodPool(m_FoodRoot);
        m_FoodPool.Initialize(Mathf.CeilToInt(m_MaxFood * slConstants.FOOD_POOL_INITIALIZE_MULTIPLY));
        if (slWorld.GetInstance().NeedPresentation())
        {
            m_FoodPresentationPools = new FoodPresentationPool[(int)slConstants.FoodType.Count];
            for (int iFood = 0; iFood < m_FoodPropertiess.Length; iFood++)
            {
                slConstants.FoodType foodType = (slConstants.FoodType)iFood;
                m_FoodPresentationPools[iFood] = new FoodPresentationPool(m_FoodRoot, foodType);
                m_FoodPresentationPools[iFood].Initialize(0);
            }
        }

        m_CreateEvents  = new Queue <CreateEvent>();
        m_Foods         = new hwmBetterDictionary <int, slFood>();
        m_DestroyEvents = new hwmBetterList <slFood>();
        m_FoodCount     = 0;
    }
예제 #9
0
    protected bool IsSafe(Vector2 moveDirection, float distance, bool ignorePredict)
    {
        Vector2 start               = m_Snake.GetHeadPosition();
        Vector2 end                 = start + moveDirection * distance;
        Vector2 direction           = end - start;
        Vector2 directionReciprocal = hwmMath.Reciprocal(direction);

        if (!slWorld.GetInstance().GetMap().GetMapBox().IsInsideOrOn(end))
        {
            return(false);
        }

        for (int iNode = 0; iNode < ms_SnakeQuadtreeNodes.Count; iNode++)
        {
            hwmQuadtree <slSnake.QuadtreeElement> .Node iterNode = ms_SnakeQuadtreeNodes[iNode];
            hwmBetterList <slSnake.QuadtreeElement>     elements = iterNode.GetElements();
            for (int iElement = elements.Count - 1; iElement >= 0; iElement--)
            {
                slSnake.QuadtreeElement iterElement = elements[iElement];
                if (iterElement.Owner != m_Snake.GetGuid())
                {
                    if (iterElement.NodeType != slConstants.NodeType.Predict)
                    {
                        if (iterElement.AABB.LineIntersection(start, end, direction, directionReciprocal))
                        {
                            return(false);
                        }
                    }
                    else if (!ignorePredict)
                    {
                        Quaternion rotation = Quaternion.Inverse(iterElement.GetRotation());
                        Vector2    center   = iterElement.GetPosition();
                        start = hwmMath.QuaternionMultiplyVector(rotation, start - center);
                        end   = hwmMath.QuaternionMultiplyVector(rotation, end - center);
                        if (((slSnake.PredictNode)iterElement).Box.LineIntersection(start, end))
                        {
                            return(false);
                        }
                    }
                }
            }
        }
        return(true);
    }
예제 #10
0
 private void OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex index)
 {
     if (m_Current.IsLeaf())
     {
         GUILayout.Button("No " + index.ToString());
     }
     else if (GUILayout.Button(index.ToString()))
     {
         if (m_ChilderIndex == index)                 // double click enter childer
         {
             m_LastNodes.Push(m_Current);
             m_Current      = m_Current.GetChilder(m_ChilderIndex);
             m_ChilderIndex = NOTSET_CHILDER_INDEX;
         }
         else
         {
             m_ChilderIndex = index;
         }
     }
 }
예제 #11
0
        private void DoDrawGizomsElements(hwmQuadtree <T> .Node node)
        {
            if (node == null)
            {
                return;
            }
            hwmBetterList <T> elements = node.GetElements();

            for (int iElement = 0; iElement < elements.Count; iElement++)
            {
                hwmUtility.GizmosDrawBox2D(elements[iElement].AABB, m_GizmosZ);
            }

            if (m_GizomosDisplayChilderElement && !node.IsLeaf())
            {
                DoDrawGizomsElements(node.GetChilder(hwmQuadtreeChilderNodeIndex.LeftDown));
                DoDrawGizomsElements(node.GetChilder(hwmQuadtreeChilderNodeIndex.LeftUp));
                DoDrawGizomsElements(node.GetChilder(hwmQuadtreeChilderNodeIndex.RightUp));
                DoDrawGizomsElements(node.GetChilder(hwmQuadtreeChilderNodeIndex.RightDown));
            }
        }
예제 #12
0
    public void Initialize()
    {
        m_PoolRoot             = new GameObject("Snakes").transform;
        m_SnakeNameToIndex     = new Dictionary <string, int>();
        m_TweakablePropertiess = new Dictionary <string, slSnakeTweakableProperties>();
        m_Propertiess          = new List <slSnakeProperties>();

        m_HeadPools        = new List <NodePool <slSnake.HeadNode> >();
        m_ClothesNodePools = new List <NodePool <slSnake.ClothesNode> >();
        m_BodyPools        = new List <NodePool <slSnake.BodyNode> >();

        m_Quadtree = new hwmQuadtree <slSnake.QuadtreeElement>();
        m_Quadtree.Initialize(CalculateQuadtreeDepth()
                              , slConstants.SNAKE_QUADTREE_MAXELEMENT_PERNODE
                              , slConstants.SNAKE_QUADTREE_MINELEMENT_PREPARENTNODE
                              , new Vector2(slConstants.SNAKE_QUADTREE_LOOSESIZE, slConstants.SNAKE_QUADTREE_LOOSESIZE)
                              , slWorld.GetInstance().GetMap().GetMapBox());
        m_Quadtree.AutoMergeAndSplitNode = false;
#if UNITY_EDITOR
        slQuadtreeGizmos.SnakeQuadtree = m_Quadtree;
#endif
    }
예제 #13
0
    public void EatFood(float radius)
    {
        ms_FoodQuadtreeNodes.Clear();
        hwmBox2D eatAABB = hwmBox2D.BuildAABB(m_Head.GetPosition(), new Vector2(radius, radius));

        slWorld.GetInstance().GetFoodSystem().GetQuadtree().GetRootNode().GetAllIntersectNode(ref ms_FoodQuadtreeNodes, eatAABB);
        hwmSphere2D headSphere = new hwmSphere2D(m_Head.GetPosition(), radius);

        for (int iNode = 0; iNode < ms_FoodQuadtreeNodes.Count; iNode++)
        {
            hwmQuadtree <slFood> .Node iterNode = ms_FoodQuadtreeNodes[iNode];
            hwmBetterList <slFood>     foods    = iterNode.GetElements();
            bool inHeadSphere = headSphere.IsInside(iterNode.GetLooseBox());
            for (int iFood = foods.Count - 1; iFood >= 0; iFood--)
            {
                slFood iterFood = foods[iFood];
                if (inHeadSphere ||
                    (iterFood.GetPosition() - m_Head.GetPosition()).sqrMagnitude <= radius * radius)
                {
                    EatFood(iterFood);
                }
            }
        }
    }
예제 #14
0
        public void OnGUI()
        {
            while (m_Current == null)
            {
                if (m_LastNodes.Count > 0)
                {
                    m_Current = m_LastNodes.Pop();
                }
                else
                {
                    m_Current = m_Quadtree.GetRootNode();
                    break;
                }
            }

            if (m_Current == null)
            {
                EditorGUILayout.HelpBox("not found any node", MessageType.Error);
                return;
            }

            hwmQuadtree <T> .Node displayNode = GetDisplayNode();
            EditorGUILayout.LabelField("Depth:", displayNode.GetDepth().ToString());
            EditorGUILayout.LabelField("Element Count:", displayNode.GetElements().Count.ToString());
            EditorGUILayout.LabelField("Element Count In Self&Childers :", displayNode.GetAllElementCount().ToString());

            EditorGUILayout.Space();
            if (m_Current.GetParent() == null &&
                m_ChilderIndex == NOTSET_CHILDER_INDEX)
            {
                GUILayout.Button("No Parent");
            }
            else if (GUILayout.Button("Parent"))
            {
                if (m_ChilderIndex != NOTSET_CHILDER_INDEX)
                {
                    m_ChilderIndex = NOTSET_CHILDER_INDEX;
                }
                else
                {
                    m_Current = m_LastNodes.Pop();
                }
            }
            EditorGUILayout.BeginHorizontal();
            OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.LeftUp);
            OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.RightUp);
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal();
            OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.LeftDown);
            OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.RightDown);
            EditorGUILayout.EndHorizontal();
            if (m_Current.IsLeaf() || m_ChilderIndex == NOTSET_CHILDER_INDEX)
            {
                GUILayout.Button("Cant Enter Childer");
            }
            else if (GUILayout.Button("Enter Childer: " + m_ChilderIndex.ToString()))
            {
                m_LastNodes.Push(m_Current);
                m_Current      = m_Current.GetChilder(m_ChilderIndex);
                m_ChilderIndex = NOTSET_CHILDER_INDEX;
            }

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Gizmos");
            m_GizmosColor = EditorGUILayout.ColorField("Color", m_GizmosColor);
            m_GizmosZ     = EditorGUILayout.FloatField("Z", m_GizmosZ);
            m_GizomosDisplayChilderElement = EditorGUILayout.Toggle("Display Childer Element", m_GizomosDisplayChilderElement);

            if (GUI.changed)
            {
                GetWindow <SceneView>().Focus();
            }
        }
예제 #15
0
 public void Dispose()
 {
     m_Quadtree  = null;
     m_Current   = null;
     m_LastNodes = null;
 }