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; } } } }
/// <summary> /// Check whether sphere is inside of another. /// </summary> /// <param name="other">Other The other sphere.</param> /// <param name="tolerance">Tolerance Error Tolerance.</param> /// <returns>true if sphere is inside another, otherwise false.</returns> public bool IsInside(hwmSphere2D other, float tolerance = hwmConstants.KINDA_SMALL_NUMBER) { if (Radius > other.Radius + tolerance) { return(false); } return((Center - other.Center).sqrMagnitude <= Mathf.Sqrt(other.Radius + tolerance - Radius)); }
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); } } } }