private void CalculateMoveProperties(int moveDistance, SegmentInfoInView segmentInfo) { float distance = DistanceToMoveElementByY * moveDistance; segmentInfo.MoveSteps = (int)(distance / _moveStepY); segmentInfo.correctiveMoveStep = distance - segmentInfo.MoveSteps * _moveStepY; }
public void MoveDownElements(ElementsMoveDownArgs args) { _movingColumnsCount = 0; _currentMovedColums = 0; foreach (KeyValuePair <int, ColumnMoveInfo> moveInfoPair in args.columnsMoveInfos) { List <SegmentInfoInView> segmentInfos = new List <SegmentInfoInView>(); foreach (SegmentMoveInfo segment in moveInfoPair.Value.oldElements) { SegmentInfoInView info = new SegmentInfoInView(); info.elements = GetOldElements(segment.elementsToMove); info.moveDistance = segment.MoveDistance; CalculateMoveProperties(segment.MoveDistance, info); segmentInfos.Add(info); } SpawnHiddenElements(moveInfoPair.Value.newElements.elements, out List <MovingElement> hiddenElements); SegmentInfoInView newElementsSegment = new SegmentInfoInView(); newElementsSegment.elements = hiddenElements; newElementsSegment.moveDistance = moveInfoPair.Value.newElements.MoveDistance; CalculateMoveProperties(moveInfoPair.Value.newElements.MoveDistance, newElementsSegment); segmentInfos.Add(newElementsSegment); StartCoroutine(MoveDownColumn(segmentInfos)); _movingColumnsCount++; } }
private IEnumerator MoveDownColumn(List <SegmentInfoInView> segmentInfos) { int segmentsMoved = 0; int totalSegmentsAmount = segmentInfos.Count; while (segmentsMoved < totalSegmentsAmount) { int i = 0; while (i < segmentInfos.Count) { SegmentInfoInView segmentInfo = segmentInfos[i]; if (segmentInfo.CurrentStepAmount < segmentInfo.TotalMoveSteps) { float currentMoveStep = 0; if (segmentInfo.CurrentStepAmount < segmentInfo.MoveSteps) { currentMoveStep = _moveStepY; } else { currentMoveStep = segmentInfo.correctiveMoveStep; } foreach (MovingElement movingElement in segmentInfo.elements) { movingElement.Transform.anchoredPosition -= new Vector2(0, currentMoveStep); } segmentInfo.CurrentStepAmount++; } else if (segmentInfo.CurrentStepAmount == segmentInfo.TotalMoveSteps && !segmentInfo.isMoved) { segmentsMoved++; segmentInfo.isMoved = true; } i++; } yield return(null); } foreach (SegmentInfoInView segmentInfo in segmentInfos) { foreach (MovingElement element in segmentInfo.elements) { int newRowPosition = element.Coordinate.y + segmentInfo.moveDistance; _elements[element.Coordinate.x, newRowPosition] = element.Transform; } } CountMovedColumn(); }