using System.Collections.Generic; using System.Collections; using UnityEngine; public class PositioningState : IState { GameManager gm; GameObject chip; Transform chipPointer; SpriteRenderer pointerRend; int index; int position; bool canMove; const int DEFAULT_SPEED = 50; List validPositions; public void enter() { //DebugWindow.Message("Позиционирование"); gm = GameManager.instance; CollectValidPositions(); canMove = true; //получаем ссылку на фишку chip = gm.currentChip; int centralIndex = validPositions.Count / 2; index = centralIndex; position = validPositions[centralIndex]; gm.currentColumnIndex = validPositions[centralIndex]; //ставим фишку на стартовую точку //float offsety = 5; float offsety = gm.startY; if (gm.gameMode == GameMode.pvp) offsety = gm.startY + 5;//повыше float x = gm.slotLeftTop.position.x + validPositions[index] * gm.stepX; float y = gm.startY + offsety; chip.transform.position = new Vector3(x, y, 0); chip.SetActive(true); gm.chipYSpeed = 0; //настройка указателя куда упадет фишка chipPointer = new GameObject("Pointer").transform; chipPointer.position = new Vector3(100, 100); chipPointer.localScale = new Vector2(1.15f, 1.15f); chipPointer.gameObject.SetActive(false); pointerRend = chipPointer.gameObject.AddComponent(); pointerRend.enabled = false; pointerRend.sprite = gm.chipPointer; pointerRend.color = gm.currentPlayer == CellState.Player1 ? new Color(1, .5f, 0, 1) : new Color(0, .3f, 1, 1); pointerRend.sortingLayerName = "Middle"; pointerRend.enabled = true; //НАДО POINTER ЯРЧЕ! chipPointer.gameObject.SetActive(true); } public void exit() { gm.pvpPointer.SetVisibility(false); gm.StartCoroutine(DestroyPointer()); } public void update() { #region Получение инпутов bool left = false, right = false, action = false; if (gm.gameMode == GameMode.pvp) { left = In.GetButtonDownCurrentPlayer(PlayerAction.left); right = In.GetButtonDownCurrentPlayer(PlayerAction.right); action = In.GetButtonDownCurrentPlayer(PlayerAction.down); } else if (gm.gameMode == GameMode.pve) { left = In.GetButtonDownAnyPlayer(PlayerAction.left); right = In.GetButtonDownAnyPlayer(PlayerAction.right); action = In.GetButtonDownAnyPlayer(PlayerAction.down); gm.vsBotThinkTime += Time.deltaTime; } #endregion #region Обработка left|right if (canMove) { //вычисляем куда двигаться int direction = 0; if (left && right) direction = 0; else if (left) direction = -1; else if (right) direction = 1; //если двигаемся if (direction != 0) { index = Mathf.Clamp(index + direction, 0, validPositions.Count - 1); int prevPos = position; position = validPositions[index]; int dist = Mathf.Abs(position - prevPos); gm.chipXSpeed = dist * DEFAULT_SPEED;//скорость зануляется gm.currentColumnIndex = position; SoundManager.instance.playSwitch(); } } #endregion float targetX = gm.slotLeftTop.position.x + gm.currentColumnIndex * gm.stepX; float targetY = gm.startY; Vector2 targetPosition = new Vector2(targetX, targetY); float speed = DEFAULT_SPEED; //УКАЗАТЕЛЬ float pointerY = gm.slotLeftTop.transform.position.y - gm.stepY * GameManager.fieldModel.getHeight(position); chipPointer.position = new Vector2(targetX, pointerY); Color color = pointerRend.color; color.a = 0.8f + Mathf.Sin(Time.time * 7) * 0.2f; pointerRend.color = color; if (gm.gameMode == GameMode.pvp) { gm.pvpPointer.SetColor(gm.currentPlayer); gm.pvpPointer.SetVisibility(true); gm.pvpPointer.MoveTo(targetPosition); targetPosition += Vector2.up * 5;//повыше } chip.transform.position = Vector2.MoveTowards(chip.transform.position, targetPosition, speed * Time.deltaTime); if ((Vector2)chip.transform.position == targetPosition) canMove = true; else canMove = false; if (action) { if (canMove && GameManager.fieldModel.getHeight(gm.currentColumnIndex) != -1) { float delayBeforeStartFalling = 0; if (gm.gameMode == GameMode.pve) { gm.vsBotMoves += 1; } if (gm.gameMode == GameMode.pvp) { AvatarEventBus.Instance.OnTurnEnd?.Invoke(gm.currentPlayer); delayBeforeStartFalling = DualAvatarController.Instance.CurrentAvatar.ChipSpawnTime; } gm.moveMade = true; gm.stateMachine.ChangeState(new ChipFallingState(startDelay: delayBeforeStartFalling)); } else { SoundManager.instance.playWrong(); } } //ВЫХОД ДО ПЕРВОГО ХОДА bool exitPressed = In.GetButtonDown(ButtonPinMapping.startOnePlayer) || In.GetButtonDown(ButtonPinMapping.startTwoPlayers); if (exitPressed && !gm.moveMade) { FieldCleaner.Clear(); PaymentSystem.ReturnCredits(gm.gameMode); GameManager.instance.timerManager.StopAllTimers(); //GameManager.instance.stateMachine.ChangeState(new MenuState(fromGameplay: true)); GameManager.instance.stateMachine.ChangeState(new MenuState()); } } void CollectValidPositions() { validPositions = new List(); for (int i = 0; i < gm.Cols; i++) { if (GameManager.fieldModel.getHeight(i) != -1) { validPositions.Add(i); } } } IEnumerator DestroyPointer() { Color color = pointerRend.color; float t = 1; while (t > 0) { t -= Time.deltaTime * 3; color.a = t; pointerRend.color = color; yield return null; } Object.Destroy(chipPointer.gameObject); } }