Пример #1
0
        private void FixedUpdate()
        {
            switch (mode)
            {
            case EMode.gOut:     // Крюк брошен
                p1 += directions[facing] * (grappleSpd * Time.fixedDeltaTime);
                grapHead.transform.position = p1;
                grapLine.SetPosition(1, p1);

                // Проверить, попал ли крюк куда нибудь
                int tileNum = TileCamera.GET_MAP(p1.x, p1.y);
                if (grappleTiles.IndexOf(tileNum) != -1)
                {
                    // Крюк попал на плитку, за которую можно зацепиться!
                    mode = EMode.gInHit;
                    break;
                }
                if ((p1 - p0).magnitude >= grappleLength)
                {
                    // Крюк улетел на всю длину веревки, но никуда не попал
                    mode = EMode.gInMiss;
                }
                break;

            case EMode.gInMiss:     // Игрок промахнулся, вернуть крюк на удвоенной скорости
                p1 -= directions[facing] * (2 * grappleSpd * Time.fixedDeltaTime);
                if (Vector3.Dot((p1 - p0), directions[facing]) > 0)
                {
                    // Крюк еще перед дреем
                    grapHead.transform.position = p1;
                    grapLine.SetPosition(1, p1);
                }
                else
                {
                    StopGrapple();
                }
                break;

            case EMode.gInHit:     // Крюк зацепился, поднять дрея на стену
                var dist = grappleInLength + grappleSpd * Time.fixedDeltaTime;
                if (dist > (p1 - p0).magnitude)
                {
                    p0 = p1 - (directions[facing] * grappleInLength);
                    transform.position = p0;
                    StopGrapple();
                    break;
                }
                p0 += directions[facing] * (grappleSpd * Time.fixedDeltaTime);
                transform.position = p0;
                grapLine.SetPosition(0, p0);
                grapHead.transform.position = p1;
                break;
            }
        }
Пример #2
0
        private void StopGrapple()
        {
            dray.enabled      = true;
            drayColld.enabled = true;

            // Проверить безопасность плитки
            var tileNum = TileCamera.GET_MAP(p0.x, p0.y);

            if (mode == EMode.gInHit && unsafeTiles.IndexOf(tileNum) != -1)
            {
                // Дрей попал не небезопасную плитку
                dray.ResetInRoom(unsafeTileHealthPenalty);
            }

            grapHead.SetActive(false);

            mode = EMode.none;
        }
Пример #3
0
        /// <summary>
        /// Установить свойство плитки.
        /// </summary>
        /// <param name="eTileNum"> Необязательный параметр </param>
        public void SetTile(int eX, int eY, int eTileNum = -1)
        {
            x = eX;
            y = eY;
            transform.localPosition = new Vector3(x, y, 0);
            // Вернуть строку в заданном формате. "D" - строка должна представлять число в десятичной СС, "3" - строка должна содержать не менее 3-ех сиволов
            gameObject.name = x.ToString("D3") + "x" + y.ToString("D3");

            if (eTileNum == -1)                      // Если параметр не был передан..
            {
                eTileNum = TileCamera.GET_MAP(x, y); //.. то он будет получен вызовом GET_MAP
            }
            else
            {
                TileCamera.SET_MAP(x, y, eTileNum); // Заменить плитку, если необходимо
            }
            tileNum = eTileNum;
            GetComponent <SpriteRenderer>().sprite = TileCamera.SPRITES[tileNum]; // Присвоить спрайт плитке

            SetCollider();
        }