bool SetButtonPositions() { InitLineSpace(); List <BossTap> tempTapList = new List <BossTap>(); List <float> tempWidthList = new List <float>(); for (int i = 0; i < m_TapDic.Count; i++) { float width = m_TapDic[i].GetScaler().x; if (width < MinWidth) { width = MinWidth; } if (tempWidthList.Count == 0) { tempWidthList.Add(width); tempTapList.Add(m_TapDic[i]); } else { for (int j = 0; j < tempWidthList.Count; j++) { if (width > tempWidthList[j]) { tempWidthList.Insert(j, width); tempTapList.Insert(j, m_TapDic[i]); break; } else if (j == tempWidthList.Count - 1) { tempWidthList.Add(width); tempTapList.Add(m_TapDic[i]); break; } } } } for (int i = 0; i < tempTapList.Count; i++) { List <PossibleRange> possibleRanges = GetPossibleRange(tempTapList[i]); if (possibleRanges.Count == 0) { return(false); } else { RefreshRandomSeed(); int index = Random.Range(0, possibleRanges.Count); float leftEdge = possibleRanges[index].LeftToRightRange.Key + tempWidthList[i] * 0.5f; float rightEdge = possibleRanges[index].LeftToRightRange.Value - tempWidthList[i] * 0.5f; RefreshRandomSeed(); float posX = Random.Range(leftEdge, rightEdge); tempTapList[i].SetPosition(new Vector3(posX, m_LineHeight[possibleRanges[index].LineIndex])); PossibleRange possibleRange = new PossibleRange(); possibleRange.LineIndex = possibleRanges[index].LineIndex; possibleRange.LeftToRightRange = new KeyValuePair <float, float>(posX - tempWidthList[i] * 0.5f, posX + tempWidthList[i] * 0.5f); if (m_Lines[possibleRange.LineIndex].Space.Count == 0) { m_Lines[possibleRange.LineIndex].Space.Add(possibleRange.LeftToRightRange); } else { bool added = false; for (int j = 0; j < m_Lines[possibleRange.LineIndex].Space.Count; j++) { if (possibleRange.LeftToRightRange.Key < m_Lines[possibleRange.LineIndex].Space[j].Key) { m_Lines[possibleRange.LineIndex].Space.Insert(j, possibleRange.LeftToRightRange); added = true; break; } } if (!added) { m_Lines[possibleRange.LineIndex].Space.Add(possibleRange.LeftToRightRange); } } } } return(true); }
List <PossibleRange> GetPossibleRange(BossTap tap) { List <PossibleRange> result = new List <PossibleRange>(); float width = tap.GetScaler().x + WidthExtra; if (width < MinWidth) { width = MinWidth; } for (int i = 0; i < m_LineHeight.Length; i++) { if (m_Lines[i].Space.Count == 0) { PossibleRange posRan = new PossibleRange(); posRan.LineIndex = i; posRan.LeftToRightRange = new KeyValuePair <float, float>(m_RectCenter - RectWidth * 0.5f, m_RectCenter + RectWidth * 0.5f); result.Add(posRan); continue; } else { for (int j = 0; j < m_Lines[i].Space.Count; j++) { float leftEdge, rightEdge; if (j == 0) { leftEdge = m_RectCenter - RectWidth * 0.5f; } else { leftEdge = m_Lines[i].Space[j - 1].Value; } if (j == m_Lines[i].Space.Count - 1) { rightEdge = m_RectCenter + RectWidth * 0.5f; } else { rightEdge = m_Lines[i].Space[j + 1].Key; } if (m_Lines[i].Space[j].Key - leftEdge > width) { PossibleRange posRan = new PossibleRange(); posRan.LineIndex = i; posRan.LeftToRightRange = new KeyValuePair <float, float>(leftEdge, m_Lines[i].Space[j].Key); result.Add(posRan); } if (j == m_Lines[i].Space.Count - 1) { if (rightEdge - m_Lines[i].Space[j].Value > width) { PossibleRange posRan = new PossibleRange(); posRan.LineIndex = i; posRan.LeftToRightRange = new KeyValuePair <float, float>(m_Lines[i].Space[j].Value, rightEdge); result.Add(posRan); } } } } } return(result); }