diff options
author | Neil Kollack <nkollack@gmail.com> | 2022-04-18 13:22:11 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-18 13:22:11 -0500 |
commit | 41e8678c463b7606dfaf292d67d05244ff044878 (patch) | |
tree | 4bad1628cc223bbd40bd5a593c8bf9576fda0402 /Assets/Scripts/Actors/Actor.cs | |
parent | a8e4db0544c6b2ac370693ad32e0e4adc01ef32e (diff) | |
parent | b11db6ce1af50c7f76f17b3797c76275f81801d2 (diff) |
Merge pull request #6 from MontanaJohns/develop
Prototype
Diffstat (limited to 'Assets/Scripts/Actors/Actor.cs')
-rw-r--r-- | Assets/Scripts/Actors/Actor.cs | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/Assets/Scripts/Actors/Actor.cs b/Assets/Scripts/Actors/Actor.cs new file mode 100644 index 0000000..eb8185e --- /dev/null +++ b/Assets/Scripts/Actors/Actor.cs @@ -0,0 +1,208 @@ +using System.Collections; +using System.Collections.ObjectModel; +using System.Linq; +using MontanaJohns.Core; +using MontanaJohns.Items; +using UnityEngine; + +namespace MontanaJohns.Actors +{ + [RequireComponent(typeof(Rigidbody2D))] + public abstract class Actor : MonoBehaviour + { + [SerializeField] protected float gravityScale = 1.5f; + [SerializeField] protected Stats baseStats = Stats.DefaultBaseStats(); + [SerializeField] protected Transform groundCheckPoint1; + [SerializeField] protected Transform groundCheckPoint2; + [SerializeField] protected float invulnTime = 0f; + [SerializeField] protected float hangTime; + + protected Rigidbody2D _rigidBody; + protected SpriteRenderer _renderer; + protected Animator _animator; + protected Transform _transform; + protected AudioManager _audio; + + protected Active activeItem; + protected bool isGrappling; + protected bool isMoving; + protected Vector2? grapplePoint = null; + protected LayerMask groundLayers; + protected Collection<Item> items; + protected int jumpCount; + protected Vector2 acceleration; + protected bool invuln; + protected float hangCount; + + public Stats stats; + public int health; + + + protected virtual void Awake() + { + _rigidBody = GetComponent<Rigidbody2D>(); + _transform = GetComponent<Transform>(); + _renderer = GetComponent<SpriteRenderer>(); + _animator = GetComponent<Animator>(); + _audio = FindObjectOfType<AudioManager>(); + groundLayers = LayerMask.GetMask("Grapple", "Ground"); + + _rigidBody.freezeRotation = true; + _rigidBody.collisionDetectionMode = CollisionDetectionMode2D.Continuous; + _rigidBody.gravityScale = gravityScale; + + items = new(); + stats = baseStats; + health = stats.maxHealth; + jumpCount = stats.maxJumps; + } + + protected virtual void Start() + { + + } + + protected virtual void FixedUpdate() + { + if (!_animator.GetBool("airborn") && !(Physics2D.OverlapCircle(groundCheckPoint1.position, 0.2f, groundLayers) || Physics2D.OverlapCircle(groundCheckPoint2.position, 0.2f, groundLayers))) + { + _animator.SetTrigger("fall"); + StartCoroutine(Falling()); + } + } + + public virtual void Move(float input) + { + var target = new Vector2(input * stats.speedMultiplier * 10, _rigidBody.velocity.y); + _rigidBody.velocity = Vector2.SmoothDamp(_rigidBody.velocity, target, ref acceleration, .05f); + _animator.SetBool("moving", Mathf.Abs(_rigidBody.velocity.x) > 1); + isMoving = Mathf.Abs(_rigidBody.velocity.x) > 1; + + if (_rigidBody.velocity.x < -0.1) { + _renderer.flipX = true; + for (int i = 0; i < transform.childCount; i++) { + var rot = transform.GetChild(i).rotation; + rot.y = 180f; + transform.GetChild(i).rotation = rot; + } + } + else if (_rigidBody.velocity.x > 0.1) { + _renderer.flipX = false; + for (int i = 0; i < transform.childCount; i++) { + var rot = transform.GetChild(i).rotation; + rot.y = 0f; + transform.GetChild(i).rotation = rot; + } + } + } + public virtual void MoveY(float input) + { + var target = new Vector2(_rigidBody.velocity.x, input * stats.speedMultiplier * 10); + _rigidBody.velocity = Vector2.SmoothDamp(_rigidBody.velocity, target, ref acceleration, .05f); + } + + public virtual void Jump() + { + if (isGrappling) + Use(); + if(Physics2D.OverlapCircle(groundCheckPoint1.position, 0.2f, groundLayers) || Physics2D.OverlapCircle(groundCheckPoint2.position, 0.2f, groundLayers)) + { + jumpCount = stats.maxJumps; + hangCount = hangTime; + } + else + { + hangCount -= Time.deltaTime; + } + if (jumpCount > 0 && hangCount > 0f) + { + jumpCount--; + _rigidBody.AddForce(Vector2.up * stats.jumpForce); + _animator.SetTrigger("jump"); + _animator.SetBool("airborn", true); + StartCoroutine(Falling()); + } + } + + public virtual void Use() + { + Vector2? grapplePoint; + if (activeItem != null) + { + grapplePoint = activeItem.Use(); + if (grapplePoint != null) + isGrappling = true; + else + isGrappling = false; + } + else + grapplePoint = null; + this.grapplePoint = grapplePoint; + } + + public virtual void Cancel() + { + if (PauseMenu.isPaused) + { + PauseMenu.Resume(); + } + else + { + PauseMenu.Pause(); + } + } + + public virtual void AddItem(Item item) + { + items.Add(item); + stats = baseStats + items.Select(i => i.stats).Sum(); + } + + public virtual void Grapple(float xInput, float yInput, Vector2 grapplePoint) + { + Move(xInput); + MoveY(yInput); + } + + public virtual void TakeDamage(int damage) + { + StartCoroutine(Damage(damage)); + } + + private IEnumerator Damage(int damage) + { + if(!invuln) + { + invuln = true; + health -= damage; + StartCoroutine(DamageAnimation()); + yield return new WaitForSeconds(invulnTime); + invuln = false; + } + } + + private IEnumerator DamageAnimation() + { + _renderer.color = Color.red; + yield return new WaitForSeconds(0.5f); + _renderer.color = Color.white; + } + + private IEnumerator Falling() + { + _animator.SetBool("airborn", true); + + bool falling = true; + while (falling) + { + if (Physics2D.OverlapCircle(groundCheckPoint1.position, 0.2f, groundLayers) || Physics2D.OverlapCircle(groundCheckPoint2.position, 0.2f, groundLayers)) + falling = false; + yield return new WaitForEndOfFrame(); + } + + _animator.SetBool("airborn", false); + + yield break; + } + } +}
\ No newline at end of file |