feat: End animation working

This commit is contained in:
Gerard Gascón 2024-04-17 11:30:35 +02:00
parent e74c68082e
commit be7d37c6d4
70 changed files with 138 additions and 73 deletions

View file

@ -29,8 +29,6 @@
int value = Value % GrowIterations == 0 ? Value : Value / GrowIterations * GrowIterations;
float relativeScore = value % (GrowIterations * SpawnRate);
if (relativeScore == 0 && value != 0)
relativeScore = GrowIterations * SpawnRate;
GrowPercentage = relativeScore / (SpawnRate * GrowIterations);
}
}

View file

@ -4,7 +4,8 @@ using UnityEngine;
namespace FramedAnimator {
[RequireComponent(typeof(SpriteRenderer))]
public class Animator : MonoBehaviour {
[SerializeField] private Animation animation;
[SerializeField] private new Animation animation;
public string CurrentAnimation => animation.name;
private float _currentFrame;
private int _renderingFrame;
@ -12,21 +13,49 @@ namespace FramedAnimator {
private SpriteRenderer _renderer;
private bool _animationEnded;
public event Action<string> OnAnimationEnd;
private void Awake() {
_renderer = GetComponent<SpriteRenderer>();
}
private void Update() {
if (_renderingFrame >= _limit)
if (_renderingFrame >= _limit) {
TryCallAnimationEnd();
return;
_currentFrame += Time.deltaTime * animation.FrameRate;
}
UpdateAnimationFrame();
}
private void UpdateAnimationFrame() {
_currentFrame += Time.deltaTime * animation.FrameRate;
_renderingFrame = Mathf.Clamp(Mathf.FloorToInt(_currentFrame), 0, _limit);
_renderer.sprite = animation.GetFrame(_renderingFrame);
}
private void TryCallAnimationEnd() {
if (_renderingFrame < animation.FrameCount - 1 || _animationEnded) return;
_currentFrame += Time.deltaTime * animation.FrameRate;
_renderingFrame = Mathf.FloorToInt(_currentFrame);
if (_renderingFrame <= _limit) return;
_animationEnded = true;
OnAnimationEnd?.Invoke(animation.name);
}
public void ChangeAnimation(Animation anim) {
_animationEnded = false;
_limit = _renderingFrame = 0;
_currentFrame = 0f;
animation = anim;
_renderer.sprite = animation.GetFrame(_renderingFrame);
}
public void PlayUntil(float fraction) {
_limit = Mathf.RoundToInt(animation.FrameCount * Mathf.Clamp(fraction, 0, 1));
_limit = Mathf.RoundToInt(animation.FrameCount * Mathf.Clamp01(fraction));
_limit = Mathf.Clamp(_limit, 0, animation.FrameCount - 1);
}
}

View file

@ -4,6 +4,7 @@ using Presenter;
using TMPro;
using UnityEngine;
using UnityEngine.Serialization;
using Animation = FramedAnimator.Animation;
using Animator = FramedAnimator.Animator;
namespace View.UI {
@ -12,12 +13,33 @@ namespace View.UI {
private ExpressionClick _click;
private CustomInput _customInput;
private Score _score;
private bool _firstUpdate = true;
[SerializeField] private Animator animator;
[SerializeField] private Animation growAnimation;
[SerializeField] private Animation endAnimation;
private void Start() {
_click = FindObjectOfType<Dependencies>().ExpressionClick;
_customInput = FindObjectOfType<Dependencies>().CustomInput;
_score = FindObjectOfType<Dependencies>().Score;
animator.OnAnimationEnd += AnimationEnded;
}
private void AnimationEnded(string animationName) {
if (animationName == "Rosa_Grow") {
animator.ChangeAnimation(endAnimation);
animator.PlayUntil(1f);
return;
}
if (animationName == "Rosa_End") {
animator.ChangeAnimation(growAnimation);
animator.PlayUntil(_score.GrowPercentage);
}
}
private void Update() {
@ -25,8 +47,22 @@ namespace View.UI {
}
public void UpdateView(int score, float growPercentage) {
animator.PlayUntil(growPercentage);
if (animator.CurrentAnimation == "Rosa_Grow") {
animator.PlayUntil(IsLastGrowState(score, growPercentage) ? 1f : growPercentage);
}
text.text = score.ToString();
_firstUpdate = false;
}
private bool IsLastGrowState(int score, float growPercentage) {
if (growPercentage != 0)
return false;
bool isLastFrame = score % (_score.GrowIterations * _score.SpawnRate) == 0;
if (!isLastFrame)
return false;
if (_firstUpdate)
return false;
return true;
}
private void CheckInput() {