101 lines
2.9 KiB
C#
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;
|
|
}
|
|
} |