From 620932056c4501706e7afdf93b0185a9ea70e4a0 Mon Sep 17 00:00:00 2001 From: miepzerino <o.skotnik@gmail.com> Date: Sat, 23 Dec 2023 01:59:24 +0000 Subject: [PATCH] Fixed drilling, touchingdirections and ruleTile tiles --- Assets/Scripts/PlayerController.cs | 205 ++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 170 insertions(+), 35 deletions(-) diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs index 3381b36..ed9f0d7 100644 --- a/Assets/Scripts/PlayerController.cs +++ b/Assets/Scripts/PlayerController.cs @@ -1,14 +1,34 @@ +using Assets.Scripts.Enums; +using Assets.Scripts.Helpers; using System; +using System.Collections; using System.ComponentModel.Design; +using Unity.VisualScripting; using UnityEngine; using UnityEngine.InputSystem; +using UnityEngine.Tilemaps; [RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; public float maxFallSpeed = -20f; + public float maxFallSpeedDamge = -10f; + private float maxFallSpeedCurrent = 0f; Vector2 moveInput; + + [NonSerialized] + public Rigidbody2D rb; + Animator animator; + Animator animator_rotor; + public GameObject rotorGO; + TouchingDirections touchingDirections; + [NonSerialized] + public Damageable health; + + // Time it takes to drill + public float drillingTime = 1f; + private float timeSinceDrill = 0f; [SerializeField] private bool _isMoving; @@ -18,7 +38,7 @@ private set { _isMoving = value; - animator.SetBool(AnimationStrings.Player.IsMoving, value); + animator.SetBool(AnimationStrings.Player.isMoving, value); } } @@ -30,8 +50,19 @@ private set { _isFlying = value; - animator.SetBool(AnimationStrings.Player.IsFlying, value); - rotorSprite.enabled = value; + animator.SetBool(AnimationStrings.Player.isFlying, value); + animator_rotor.SetBool(AnimationStrings.Player.isFlying, value); + } + } + [SerializeField] + private bool _isDrilling; + public bool IsDrilling + { + get { return _isDrilling; } + set + { + _isDrilling = value; + //animator.SetBool(AnimationStrings.Player.isDrilling, value); } } @@ -40,65 +71,124 @@ public bool IsFacingRight { get { return _isFacingRight; } - set { + set + { if (_isFacingRight != value) { transform.localScale *= new Vector2(-1, 1); } - _isFacingRight = value; } + _isFacingRight = value; + } + } + + public bool CanMove + { + get + { + return animator.GetBool(AnimationStrings.canMove) && !PauseMenu.GameIsPaused && !IsDrilling; + } } - Rigidbody2D rb; - Animator animator; - public GameObject rotorGO; - SpriteRenderer rotorSprite; private void Awake() { rb = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); - rotorSprite = rotorGO.GetComponent<SpriteRenderer>(); - } - - // Start is called before the first frame update - void Start() - { - - } - - // Update is called once per frame - void Update() - { - + animator_rotor = rotorGO.GetComponent<Animator>(); + touchingDirections = GetComponent<TouchingDirections>(); + health = GetComponent<Damageable>(); + if (SaveSystem.isGameLoaded) + { + GameObject uiManager = GameObject.Find("GameManager"); + uiManager.GetComponent<GameManager>().GameLoaded(); + SaveData save = SaveSystem.LoadPlayer(); + health.MaxHealth = save.maxHealth; + health.Health = save.health; + transform.position = VectorHelper.ConvertToVector3(save.position); + rb.velocity = VectorHelper.ConvertToVector2(save.velocity); + SaveSystem.isGameLoaded = false; + } } private void FixedUpdate() { - if (moveInput.y == 0) + if (CanMove) { - if (rb.velocity.y <= maxFallSpeed) + if (moveInput.y == 0) { - // max fall speed, dont accelerate more - rb.velocity = new Vector2(moveInput.x * moveSpeed, maxFallSpeed); + if (rb.velocity.y <= maxFallSpeed) + { + // max fall speed, dont accelerate more + rb.velocity = new Vector2(moveInput.x * moveSpeed, maxFallSpeed); + } + else + { + // normal fall + rb.velocity = new Vector2(moveInput.x * moveSpeed, rb.velocity.y); + } } else { - // normal fall - rb.velocity = new Vector2(moveInput.x * moveSpeed, rb.velocity.y); + if (rb.velocity.y < 0 && moveInput.y > 0) + { + // falling but moving upwards + rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed) + rb.velocity.y); + } + else + { + // moving upwards no falling + rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed)); + } + } + if (touchingDirections.IsGrounded) + { + if (maxFallSpeedCurrent < maxFallSpeedDamge) + { + TakeFallDamage(Math.Abs((int)maxFallSpeedCurrent)); + maxFallSpeedCurrent = 0; + } + } + else if (IsFlying) + { + maxFallSpeedCurrent = rb.velocity.y; + } + else + { + if (maxFallSpeedCurrent > rb.velocity.y) + { + maxFallSpeedCurrent = rb.velocity.y; + } + } + if (touchingDirections.IsGrounded && moveInput.y < 0 && !IsDrilling) + { + //IsDrilling = true; + Drill(DrillDirection.Down); + } + + if (touchingDirections.IsGrounded && moveInput.x != 0 && !IsDrilling) + { + if (touchingDirections.IsAtWallLeft && moveInput.x < 0) + { + Drill(DrillDirection.Left); + } + else if (touchingDirections.IsAtWallRight && moveInput.x > 0) + { + Drill(DrillDirection.Right); + } } } - else + if (IsDrilling) { - if (rb.velocity.y < 0 && moveInput.y > 0) + rb.velocity = Vector2.zero; + if (timeSinceDrill > drillingTime) { - // falling but moving upwards - rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed) + rb.velocity.y); + IsDrilling = false; + timeSinceDrill = 0; } else { - // moving upwards no falling - rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed)); + timeSinceDrill += Time.deltaTime; } } } @@ -108,11 +198,46 @@ moveInput = context.ReadValue<Vector2>(); IsMoving = moveInput.x != 0; - IsFlying = moveInput.y != 0; + + IsFlying = (moveInput.y != 0); SetFacingDirection(moveInput); + if (IsDrilling) + { + IsMoving = false; + IsFlying = false; + //moveInput = Vector2.zero; + } } + + private void Drill(DrillDirection drillDirection) + { + IsDrilling = true; + ContactPoint2D[] contactPoints = new ContactPoint2D[1]; + Debug.Log("drillDirection: " + drillDirection.ToString()); + //rb.GetContacts(contactPoints); + switch (drillDirection) + { + case DrillDirection.Left: + touchingDirections.wallHitsLeft[0].collider.GetContacts(contactPoints); + break; + case DrillDirection.Right: + touchingDirections.wallHitsRight[0].collider.GetContacts(contactPoints); + break; + case DrillDirection.Down: + touchingDirections.groundHits[0].collider.GetContacts(contactPoints); + break; + } + CharacterEvents.characterDrill.Invoke(contactPoints[0], drillDirection); + } + + //private void DrillLeftOrRight() + //{ + // ContactPoint2D[] contactPoints = new ContactPoint2D[1]; + // touchingDirections.wallHits[0].collider.GetContacts(contactPoints); + // CharacterEvents.characterDrillLeftOrRight.Invoke(contactPoints[0]); + //} private void SetFacingDirection(Vector2 moveInput) { @@ -126,6 +251,16 @@ } } + public void TakeDamage(int damage) + { + health.Hit(damage); + } + + public void TakeFallDamage(int fallDamage) + { + TakeDamage(fallDamage); + } + //public void OnRun(InputAction.CallbackContext context) //{ // if (context.started) // Button pressed -- Gitblit v1.9.3