chip-gameV3/Assets/Scripts/Common/GameFSM/ChipFallingState.cs

101 lines
2.9 KiB
C#

using System.Collections;
using UnityEngine;
public class ChipFallingState : IState
{
const float MAX_ANGULAR_SPEED = 500;
int rowIndex;
int targetColumn;
float angularSpeed;
float velocityY = 0;
Vector2 targetPosition;
Transform chipTransform;
float startDelay = 0;
bool delayCompleted = false;
private GameManager gm;
public ChipFallingState(float startDelay, int col)
{
gm = GameManager.instance;
this.startDelay = startDelay;
targetColumn = col;
rowIndex = GameManager.fieldModel.GetColumnHeight(targetColumn);
}
private Vector2 CalculateTargetPosition()
{
float targetX = gm.slotLeftTop.position.x + targetColumn * gm.stepX;
float targetY = gm.slotLeftTop.transform.position.y - GameManager.instance.stepY * rowIndex;
return new Vector2(targetX, targetY);
}
public void enter()
{
targetPosition = CalculateTargetPosition();
GameManager.instance.StartCoroutine(DelayedEnter(startDelay));
}
private void CacheFields()
{
chipTransform = GameManager.instance.currentChip.transform;
angularSpeed = Random.Range(-MAX_ANGULAR_SPEED, MAX_ANGULAR_SPEED);
}
private void PrepareForFalling()
{
chipTransform.GetComponent<TrailRenderer>().enabled = true;
}
private void InitialSound() => SoundManager.instance.playDropDown();
public void update()
{
if (!delayCompleted) return;
ChipFallProcess();
if (chipTransform.position.y == targetPosition.y)
{
chipTransform.GetComponent<TrailRenderer>().emitting = false;
SoundManager.instance.playChipBounce();
CompleteChipLanding();
}
}
private void ChipFallProcess()
{
velocityY += GameManager.instance.chipAcceleration * Time.deltaTime;
float delta = velocityY * Time.deltaTime;
chipTransform.position = Vector2.MoveTowards(chipTransform.position, targetPosition, delta);
chipTransform.transform.Rotate(0, 0, angularSpeed * Time.deltaTime);
}
private void CompleteChipLanding()
{
chipTransform.position = targetPosition;
GameManager.fieldModel.FieldArray[rowIndex, targetColumn] = GameManager.instance.currentPlayer;
GameManager.instance.setChipTransformToArray(rowIndex, targetColumn, chipTransform);
StateRouter.RouteAfterTurn();
}
public void exit()
{
velocityY = 0;
AnnouncePlayerTurn();
}
private void AnnouncePlayerTurn()
{
if (GameManager.instance.currentPlayer == CellState.Player1)
{
CharacterEventBus.Instance.OnPlayerTurn?.Invoke();
}
}
IEnumerator DelayedEnter(float startDelay)
{
yield return new WaitForSeconds(startDelay);
CacheFields();
PrepareForFalling();
InitialSound();
delayCompleted = true;
}
}