private static decimal GetAverageDepth(GridSegment segment)
 {
     return((segment.TopLeft.Depth +
             segment.TopRight.Depth +
             segment.BottomLeft.Depth +
             segment.BottomRight.Depth) / 4);
 }
Example #2
0
    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();
            }
        }
    }
Example #3
0
    /// <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);
    }
Example #4
0
    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);
    }
Example #5
0
 public void AddSegment(GridSegment segment)
 {
     gridSegments.Add(segment);
 }
Example #6
0
    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;
    }
Example #7
0
    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));
    }
Example #8
0
    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));
    }
Example #9
0
 public void SetBufferSegment(GridSegment segment)
 {
     bufferSegment = segment;
     segment.transform.position = Vector3.one * 500;
     bufferSegment.ClearSegment();
 }
Example #10
0
    /// <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();
        }
    }