private static decimal GetAverageDepth(GridSegment segment) { return((segment.TopLeft.Depth + segment.TopRight.Depth + segment.BottomLeft.Depth + segment.BottomRight.Depth) / 4); }
private void ControlHandler_OnMadeMove(Enumerators.Control.SwipeDirection swipeDirection) { if (allowedToMove) { return; } segmentObjects = new List <SegmentObject>() { segmentObjects[0] }; segmentPositions.Clear(); // Получает позицию главного персонажа на сетке Point currentPlayerPosition = GetPlayerPosition(); Point newPlayerPosition = GetNewPlayerPosition(currentPlayerPosition, swipeDirection); if (newPlayerPosition != null) { if (newPlayerPosition != currentPlayerPosition) { newGridSegmentForPlayer = GameManager.Source.GridManager.GridSegments[newPlayerPosition.X, newPlayerPosition.Y]; allowedToMove = true; iTween.ScaleTo(gameObject, iTween.Hash("z", 1.8f, "time", 0.2f)); // Проиграть звук if (Sounds.IsOn) { audioSource.Play(); } } } else { gridSegmentsWithBonus.Clear(); if (segmentObjects.Count > 1) { segmentObjects = new List <SegmentObject>() { segmentObjects[0] }; segmentPositions.Clear(); } } }
/// <summary> /// Поиск точки, в которой находится персонаж в данный момент /// </summary> /// <returns>Возвращает структуру Point с координатами сегмента, который занимает персонаж </returns> private Point GetPlayerPosition() { for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { var obj = GameManager.Source.GridManager.GridSegments[x, y].OccupiedObject; if (obj != null) { if (obj.Type == Enumerators.Game.SegmentObjectType.Player) { currentGridSegmentWithPlayer = GameManager.Source.GridManager.GridSegments[x, y]; return(new Point(x, y)); } } } } return(null); }
void CreateWireframeGridDisplay(GridSegment targetSegment) { var display = new GameObject("Wireframe Grid"); float targetZ = targetSegment.GetSegmentRowAtIndex(0) .GetSegmentElementAtIndex(0) .transform .position .z; var wireframeController = display.AddComponent<WireframeController>(); wireframeController.InitWireframe(targetZ, offset, widthValue, heightValue, wireframeGridSegment); }
public void AddSegment(GridSegment segment) { gridSegments.Add(segment); }
IEnumerator MoveSegment(GridSegment segment) { float duration = .15f; Vector3 basePosition = segment.transform.localPosition; Vector3 newPosition = basePosition; newPosition.z -= movementAmount; for (float i = 0; i <= 1; i+= Time.deltaTime / duration){ segment.transform.localPosition = Vector3.Lerp(basePosition, newPosition, i); yield return null; } segment.transform.localPosition = newPosition; }
void HandleUndestroyedSegmentElements(GridSegment segmentToTest) { // Get coordinates of segment elements which are not destroyed var elements = segmentToTest.GetAllUndestroyedElementsInSegment(); // For every found element, go through each segment and mark the element // at the corresponding index "Dead" elements.ForEach(element => FindAndKillAllSegmentsAtIndex(segmentToTest, element)); }
void FindAndKillAllSegmentsAtIndex(GridSegment segment, GridSegmentElement element) { var row = segment.GetRowContainingElement(element); int y = segment.GetIndexOfRowInSegment(row); int x = row.GetIndexOfElementInRow(element); gridSegments.ForEach(gridSegment => gridSegment.KillElementAtIndex(x, y)); }
public void SetBufferSegment(GridSegment segment) { bufferSegment = segment; segment.transform.position = Vector3.one * 500; bufferSegment.ClearSegment(); }
/// <summary> /// Осуществляет перемещение игрока и передвигаемых сегментов-объектов /// </summary> private void MovementTo(GridSegment newSegmentForPlayer) { if (segmentObjects.Count == 0) { return; } float movementSpeed = Time.deltaTime * 15f; segmentObjects[0].transform.position = Vector3.MoveTowards(segmentObjects[0].transform.position, newSegmentForPlayer.transform.position, movementSpeed); if (segmentObjects.Count > 1) { for (int i = 1; i < segmentObjects.Count; i++) { if (Mathf.Abs(segmentObjects[i].transform.position.x - segmentObjects[0].transform.position.x) == 0) { if (Mathf.Abs(segmentObjects[i].transform.position.z - segmentObjects[0].transform.position.z) <= i) { GridSegment newPos = GameManager.Source.GridManager.GridSegments[segmentPositions[i].X, segmentPositions[i].Y]; segmentObjects[i].transform.position = Vector3.MoveTowards(segmentObjects[i].transform.position, newPos.transform.position, movementSpeed); } } else { if (Mathf.Abs(segmentObjects[i].transform.position.x - segmentObjects[0].transform.position.x) <= i) { GridSegment newPos = GameManager.Source.GridManager.GridSegments[segmentPositions[i].X, segmentPositions[i].Y]; segmentObjects[i].transform.position = Vector3.MoveTowards(segmentObjects[i].transform.position, newPos.transform.position, movementSpeed); } } } } if (gridSegmentsWithBonus.Count > 0) { for (int i = 0; i < gridSegmentsWithBonus.Count; i++) { if (Vector3.Distance(segmentObjects[0].transform.position, gridSegmentsWithBonus[i].transform.position) < 0.1f) { gridSegmentsWithBonus[i].DestroyBonus(); DoBonusCollected(); gridSegmentsWithBonus.RemoveAt(i); } } } if (segmentObjects[0].transform.position == newSegmentForPlayer.transform.position) { if (vibrationSoftSupported) { iOSHapticFeedback.Instance.Trigger(iOSHapticFeedback.iOSFeedbackType.ImpactLight); } iTween.ScaleTo(gameObject, iTween.Hash("z", 2f, "time", 0.1f, "delay", 0.1f)); iTween.ScaleTo(gameObject, iTween.Hash("z", 2.1f, "time", 0.1f)); // Обновляет статус сегмента из под персонажа newSegmentForPlayer.IsFree = false; newSegmentForPlayer.OccupiedObject = GetComponent <SegmentObject>(); currentGridSegmentWithPlayer.IsFree = true; currentGridSegmentWithPlayer.OccupiedObject = null; // Обновляет статус сегментов из под передвигаемых сегментов for (int i = 1; i < segmentObjects.Count; i++) { foreach (GridSegment oldGridSegmentForSegmentObject in GameManager.Source.GridManager.GridSegments) { if (oldGridSegmentForSegmentObject.OccupiedObject) { if (oldGridSegmentForSegmentObject.OccupiedObject.Id == segmentObjects[i].Id) { if (oldGridSegmentForSegmentObject.OccupiedObject.Type != Enumerators.Game.SegmentObjectType.Player) { oldGridSegmentForSegmentObject.IsFree = true; oldGridSegmentForSegmentObject.OccupiedObject = null; } } } } GridSegment newGridSegmentForSegmentObject = GameManager.Source.GridManager.GridSegments[segmentPositions[i].X, segmentPositions[i].Y]; // Записывает информацию о занимаемом сегмент-объекте в новом сегменте сетки newGridSegmentForSegmentObject.IsFree = false; newGridSegmentForSegmentObject.OccupiedObject = segmentObjects[i]; } // Очищает списки с передвигаемыми объектами и их позициями segmentObjects = new List <SegmentObject>() { segmentObjects[0] }; segmentPositions.Clear(); // Движение завершается allowedToMove = false; if (gridSegmentsWithBonus.Count > 0) { foreach (GridSegment gs in gridSegmentsWithBonus) { gs.DestroyBonus(); DoBonusCollected(); } } gridSegmentsWithBonus.Clear(); DoPlayerMadeMove(); CheckPlayerForBlocking(); } }