change: Implemented the cymbals as a pogo mechanic for projectiles
This commit is contained in:
parent
e79f43de22
commit
8daa9cbfd6
@ -37,6 +37,10 @@ public class PlayerBehavior : MonoBehaviour
|
||||
|
||||
[Header("Cymbals:")]
|
||||
private float cymbalActiveTime = 0f;
|
||||
[SerializeField]
|
||||
private float cymbalBounceForce = 10f;
|
||||
[SerializeField]
|
||||
private float cymbalHitboxRange = 1.2f;
|
||||
[SerializeField] AudioSource cymbalAudio;
|
||||
|
||||
[Header("Grappling:")]
|
||||
@ -57,7 +61,8 @@ public class PlayerBehavior : MonoBehaviour
|
||||
AudioSource audioSource;
|
||||
|
||||
|
||||
void Awake() {
|
||||
void Awake()
|
||||
{
|
||||
// initialize
|
||||
_rb = GetComponent<Rigidbody2D>();
|
||||
|
||||
@ -72,37 +77,46 @@ public class PlayerBehavior : MonoBehaviour
|
||||
playerIsAlive = true;
|
||||
}
|
||||
|
||||
void Start() {
|
||||
void Start()
|
||||
{
|
||||
gameUI.UpdateInstrumentUI();
|
||||
currentDash = dashTime;
|
||||
}
|
||||
|
||||
void Update() {
|
||||
if (playerIsAlive) {
|
||||
if (this.cymbalActiveTime < 0) {
|
||||
void Update()
|
||||
{
|
||||
if (playerIsAlive)
|
||||
{
|
||||
if (this.cymbalActiveTime < 0)
|
||||
{
|
||||
this.gameUI.ToggleCymbal(true);
|
||||
}
|
||||
this.cymbalActiveTime -= Time.deltaTime;
|
||||
|
||||
// throw tambourine
|
||||
unlockedTambourine = StateController.Instance.HasTambourine();
|
||||
if (playerInput.actions["ThrowTambourine"].WasPressedThisFrame()) {
|
||||
if (playerInput.actions["ThrowTambourine"].WasPressedThisFrame())
|
||||
{
|
||||
ThrowTambourine();
|
||||
}
|
||||
|
||||
// grapple
|
||||
tambourine = GameObject.FindGameObjectWithTag("tambourine");
|
||||
if (playerInput.actions["Grapple"].WasPressedThisFrame()) {
|
||||
if (playerInput.actions["Grapple"].WasPressedThisFrame())
|
||||
{
|
||||
AttemptGrapple();
|
||||
}
|
||||
if (playerInput.actions["Grapple"].WasReleasedThisFrame() && grapplingRope.isGrappling) {
|
||||
if (playerInput.actions["Grapple"].WasReleasedThisFrame() && grapplingRope.isGrappling)
|
||||
{
|
||||
LetGoOfGrapple();
|
||||
}
|
||||
|
||||
// clarinet
|
||||
unlockedClarinet = StateController.Instance.HasClarinet();
|
||||
if (unlockedClarinet) {
|
||||
if (playerInput.actions["ClarinetDive"].WasPressedThisFrame() && !isInWater && !playerController.IsGrounded() && !isDash) {
|
||||
if (unlockedClarinet)
|
||||
{
|
||||
if (playerInput.actions["ClarinetDive"].WasPressedThisFrame() && !isInWater && !playerController.IsGrounded() && !isDash)
|
||||
{
|
||||
isDash = true;
|
||||
this.gameUI.ToggleClarinet(false);
|
||||
playerInput.DeactivateInput();
|
||||
@ -110,8 +124,10 @@ public class PlayerBehavior : MonoBehaviour
|
||||
clarinetAudio.Play();
|
||||
}
|
||||
|
||||
if (!playerController.IsGrounded() && isDash && (currentDash < dashTime)) {
|
||||
if (!forceAdded) {
|
||||
if (!playerController.IsGrounded() && isDash && (currentDash < dashTime))
|
||||
{
|
||||
if (!forceAdded)
|
||||
{
|
||||
dashVec = new Vector2(0.5f * forward, -1f) * dashForce;
|
||||
_rb.AddForce(dashVec, ForceMode2D.Impulse);
|
||||
forceAdded = true;
|
||||
@ -119,9 +135,11 @@ public class PlayerBehavior : MonoBehaviour
|
||||
|
||||
currentDash += Time.deltaTime;
|
||||
}
|
||||
else if ((currentDash >= dashTime)) {
|
||||
else if ((currentDash >= dashTime))
|
||||
{
|
||||
// dash ends
|
||||
if (!isInWater) {
|
||||
if (!isInWater)
|
||||
{
|
||||
isDash = false;
|
||||
this.gameUI.ToggleClarinet(true);
|
||||
forceAdded = false;
|
||||
@ -131,7 +149,8 @@ public class PlayerBehavior : MonoBehaviour
|
||||
currentDash = 0.0f;
|
||||
dashVec = Vector2.zero;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
isDash = false;
|
||||
this.gameUI.ToggleClarinet(true);
|
||||
forceAdded = false;
|
||||
@ -141,14 +160,22 @@ public class PlayerBehavior : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
if (StateController.Instance.HasCymbal()) {
|
||||
if (this.playerInput.actions["CymbalCrash"].WasPressedThisFrame()) {
|
||||
// Play the sound
|
||||
this.gameUI.ToggleCymbal(false);
|
||||
cymbalAudio.Play();
|
||||
if (StateController.Instance.HasCymbal())
|
||||
{
|
||||
if (this.playerInput.actions["CymbalCrash"].WasPressedThisFrame())
|
||||
{
|
||||
if (this.HasProjectileInRange())
|
||||
{
|
||||
|
||||
// Set the cymbal active for the equivalent of one second
|
||||
this.cymbalActiveTime = 1;
|
||||
this.gameUI.ToggleCymbal(false);
|
||||
cymbalAudio.Play();
|
||||
|
||||
Vector2 curVel = this.playerController.RB.velocity;
|
||||
this.playerController.RB.velocity = new Vector2(curVel.x, 0);
|
||||
this.playerController.RB.AddForce(new Vector2(0, this.cymbalBounceForce), ForceMode2D.Impulse);
|
||||
// Set the cymbal active for the equivalent of one second
|
||||
this.cymbalActiveTime = 0.1f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -156,28 +183,36 @@ public class PlayerBehavior : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
void Animate() {
|
||||
void Animate()
|
||||
{
|
||||
// start walking
|
||||
if (playerInput.actions["Move"].WasPressedThisFrame()) {
|
||||
if (playerInput.actions["Move"].WasPressedThisFrame())
|
||||
{
|
||||
animator.SetBool("Walking", true);
|
||||
}
|
||||
// return to idle animation
|
||||
if (playerInput.actions["Move"].WasReleasedThisFrame()) {
|
||||
if (playerInput.actions["Move"].WasReleasedThisFrame())
|
||||
{
|
||||
animator.SetBool("Walking", false);
|
||||
}
|
||||
}
|
||||
|
||||
void OnMove(InputValue value) {
|
||||
if (playerIsAlive) {
|
||||
void OnMove(InputValue value)
|
||||
{
|
||||
if (playerIsAlive)
|
||||
{
|
||||
_hInput = value.Get<Vector2>().x;
|
||||
if (_hInput < 0) {
|
||||
if (forward != -1) {
|
||||
if (_hInput < 0)
|
||||
{
|
||||
if (forward != -1)
|
||||
{
|
||||
// if character hasnt already flipped
|
||||
FlipRenderer();
|
||||
}
|
||||
forward = -1;
|
||||
}
|
||||
else if (_hInput > 0) {
|
||||
else if (_hInput > 0)
|
||||
{
|
||||
if (forward != 1)
|
||||
{ // if character hasnt already flipped
|
||||
FlipRenderer();
|
||||
@ -188,53 +223,68 @@ public class PlayerBehavior : MonoBehaviour
|
||||
|
||||
}
|
||||
|
||||
void FlipRenderer() {
|
||||
void FlipRenderer()
|
||||
{
|
||||
GetComponent<SpriteRenderer>().flipX = !GetComponent<SpriteRenderer>().flipX;
|
||||
}
|
||||
|
||||
void ThrowTambourine() {
|
||||
if (unlockedTambourine && hasTambourine && !grapplingRope.isGrappling) {
|
||||
void ThrowTambourine()
|
||||
{
|
||||
if (unlockedTambourine && hasTambourine && !grapplingRope.isGrappling)
|
||||
{
|
||||
launcher.ThrowTambourine(forward);
|
||||
SetHasTambourine(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetHasTambourine(bool state) {
|
||||
public void SetHasTambourine(bool state)
|
||||
{
|
||||
hasTambourine = state;
|
||||
gameUI.ToggleTambourine(state);
|
||||
}
|
||||
|
||||
void AttemptGrapple() {
|
||||
if (tambourine != null) { // grapple to tambourine
|
||||
if (!grapplingRope.isGrappling && tambourine.GetComponent<TambourineBehavior>().pinned) {
|
||||
void AttemptGrapple()
|
||||
{
|
||||
if (tambourine != null)
|
||||
{ // grapple to tambourine
|
||||
if (!grapplingRope.isGrappling && tambourine.GetComponent<TambourineBehavior>().pinned)
|
||||
{
|
||||
grapplingGun.GrappleToTambourine(tambourine);
|
||||
grapplingRope.isGrappling = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (grappleSurface != null) {
|
||||
else
|
||||
{
|
||||
if (grappleSurface != null)
|
||||
{
|
||||
grapplingGun.GrappleToSurface(grappleSurface.transform.position);
|
||||
grapplingRope.isGrappling = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LetGoOfGrapple() {
|
||||
void LetGoOfGrapple()
|
||||
{
|
||||
bool currentlyPaused = StateController.Instance.isPaused;
|
||||
if (grapplingRope.isGrappling && !currentlyPaused) {
|
||||
if (tambourine != null) {
|
||||
if (grapplingRope.isGrappling && !currentlyPaused)
|
||||
{
|
||||
if (tambourine != null)
|
||||
{
|
||||
tambourine.GetComponent<TambourineBehavior>().DestroySelf();
|
||||
}
|
||||
grapplingGun.ReleaseGrapple();
|
||||
}
|
||||
}
|
||||
|
||||
void Bounce() {
|
||||
void Bounce()
|
||||
{
|
||||
Vector2 reflect;
|
||||
if (Mathf.Abs(saveVelocity.y) < 1f && hasBounced) {
|
||||
if (Mathf.Abs(saveVelocity.y) < 1f && hasBounced)
|
||||
{
|
||||
reflect = Vector2.zero;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
reflect = new Vector2(saveVelocity.x * reflectForce, -(saveVelocity.y) * reflectForce);
|
||||
hasBounced = true;
|
||||
}
|
||||
@ -243,44 +293,73 @@ public class PlayerBehavior : MonoBehaviour
|
||||
isDash = false;
|
||||
}
|
||||
|
||||
void Water() {
|
||||
if(isDash) {
|
||||
void Water()
|
||||
{
|
||||
if (isDash)
|
||||
{
|
||||
saveVelocity = _rb.velocity / velocityCut;
|
||||
if (isDash) {
|
||||
if (isDash)
|
||||
{
|
||||
dashVec = new Vector2(1f * forward, -1f) * (dashForce / velocityCut);
|
||||
_rb.AddForce(dashVec, ForceMode2D.Force);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
playerController.FloatGravity(waterGravity);
|
||||
}
|
||||
}
|
||||
|
||||
void OnTriggerEnter2D(Collider2D col) {
|
||||
if (col.tag == "grappleSurface") {
|
||||
bool HasProjectileInRange()
|
||||
{
|
||||
GameObject[] objs = GameObject.FindGameObjectsWithTag("Projectile");
|
||||
foreach (GameObject proj in objs)
|
||||
{
|
||||
float distance = Vector2.Distance(proj.transform.position, this.transform.position);
|
||||
Debug.Log($"Distance: {distance}");
|
||||
if (distance <= this.cymbalHitboxRange)
|
||||
{
|
||||
Debug.Log("Yes");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Debug.Log("No");
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnTriggerEnter2D(Collider2D col)
|
||||
{
|
||||
if (col.tag == "grappleSurface")
|
||||
{
|
||||
grappleSurface = col.gameObject;
|
||||
}
|
||||
else if (col.tag == "instaDeath") {
|
||||
else if (col.tag == "instaDeath")
|
||||
{
|
||||
StartCoroutine(DestroyPlayer());
|
||||
}
|
||||
else if (col.tag == "spawnPoint") {
|
||||
else if (col.tag == "spawnPoint")
|
||||
{
|
||||
StateController.Instance.spawnPoint.GetComponent<SpawnPointBehavior>().DeactivateSpawnPoint();
|
||||
col.GetComponent<SpawnPointBehavior>().ActivateSpawnPoint();
|
||||
}
|
||||
else if (col.tag == "Trumpet") {
|
||||
else if (col.tag == "Trumpet")
|
||||
{
|
||||
this.playerController.in_range = true;
|
||||
this.playerController.enemy = col.transform.parent.gameObject;
|
||||
}
|
||||
else if (col.tag == "water") {
|
||||
else if (col.tag == "water")
|
||||
{
|
||||
isInWater = true;
|
||||
Water();
|
||||
}
|
||||
else if (col.tag == "bouncePad") {
|
||||
else if (col.tag == "bouncePad")
|
||||
{
|
||||
// Assign the player's velocity to zero so that the player can
|
||||
// bounce on the same jump pad
|
||||
this.playerController.RB.velocity = Vector2.zero;
|
||||
Bouncepad pad = col.GetComponent<Bouncepad>();
|
||||
switch (pad.Direction()) {
|
||||
switch (pad.Direction())
|
||||
{
|
||||
case Bouncepad.Facing.Left:
|
||||
this.playerController.RB.AddForce(
|
||||
new Vector2(-pad.bounceForce, pad.verticalModifier * pad.bounceForce),
|
||||
@ -297,15 +376,19 @@ public class PlayerBehavior : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
void OnTriggerExit2D(Collider2D col) {
|
||||
if (col.tag == "grappleSurface") {
|
||||
void OnTriggerExit2D(Collider2D col)
|
||||
{
|
||||
if (col.tag == "grappleSurface")
|
||||
{
|
||||
grappleSurface = null;
|
||||
}
|
||||
else if (col.tag == "Trumpet") {
|
||||
else if (col.tag == "Trumpet")
|
||||
{
|
||||
this.playerController.in_range = false;
|
||||
this.playerController.enemy = null;
|
||||
}
|
||||
else if (col.tag == "water") {
|
||||
else if (col.tag == "water")
|
||||
{
|
||||
isInWater = false;
|
||||
isDash = false;
|
||||
hasBounced = false;
|
||||
@ -315,45 +398,45 @@ public class PlayerBehavior : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
void OnCollisionEnter2D(Collision2D collision) {
|
||||
if (collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "ProjectileEnemy") {
|
||||
if (collision.transform.position.y < transform.position.y) {
|
||||
void OnCollisionEnter2D(Collision2D collision)
|
||||
{
|
||||
if (collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "ProjectileEnemy")
|
||||
{
|
||||
if (collision.transform.position.y < transform.position.y)
|
||||
{
|
||||
_rb.AddForce(Vector2.up * 8, ForceMode2D.Impulse);
|
||||
collision.gameObject.GetComponent<EnemyPatrol>().DefeatEnemy();
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
StartCoroutine(DestroyPlayer());
|
||||
}
|
||||
}
|
||||
else if (collision.gameObject.tag == "Projectile") {
|
||||
Destroy(collision.gameObject);
|
||||
if (this.cymbalActiveTime > 0) {
|
||||
Vector2 projVel = collision.gameObject.GetComponent<Rigidbody2D>().velocity;
|
||||
collision.gameObject.GetComponent<Rigidbody2D>().velocity =
|
||||
new Vector2(
|
||||
-projVel.x,
|
||||
-projVel.y
|
||||
);
|
||||
}
|
||||
else {
|
||||
StartCoroutine(DestroyPlayer());
|
||||
}
|
||||
else if (collision.gameObject.tag == "Projectile")
|
||||
{
|
||||
StartCoroutine(DestroyPlayer());
|
||||
}
|
||||
//stupid stuff for claude's house
|
||||
else if (collision.gameObject.tag == "SirJacques") {
|
||||
else if (collision.gameObject.tag == "SirJacques")
|
||||
{
|
||||
Destroy(collision.gameObject);
|
||||
}
|
||||
else if (collision.gameObject.tag == "Door") {
|
||||
else if (collision.gameObject.tag == "Door")
|
||||
{
|
||||
StateController.Instance.RespawnPlayer();
|
||||
}
|
||||
else if (collision.gameObject.tag == "bouncy") {
|
||||
else if (collision.gameObject.tag == "bouncy")
|
||||
{
|
||||
Bounce();
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerator DestroyPlayer() {
|
||||
if (playerIsAlive) {
|
||||
if (grapplingRope.isGrappling) {
|
||||
IEnumerator DestroyPlayer()
|
||||
{
|
||||
if (playerIsAlive)
|
||||
{
|
||||
if (grapplingRope.isGrappling)
|
||||
{
|
||||
LetGoOfGrapple();
|
||||
}
|
||||
playerIsAlive = false;
|
||||
@ -368,9 +451,12 @@ public class PlayerBehavior : MonoBehaviour
|
||||
|
||||
// destroy all tambourines
|
||||
GameObject[] currentTambourines = GameObject.FindGameObjectsWithTag("tambourine");
|
||||
if (currentTambourines != null) {
|
||||
foreach (GameObject tambourine in currentTambourines) {
|
||||
if (tambourine != null) {
|
||||
if (currentTambourines != null)
|
||||
{
|
||||
foreach (GameObject tambourine in currentTambourines)
|
||||
{
|
||||
if (tambourine != null)
|
||||
{
|
||||
tambourine.GetComponent<TambourineBehavior>().DestroySelf();
|
||||
}
|
||||
}
|
||||
|
@ -2,21 +2,26 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProjectileBehavior : MonoBehaviour {
|
||||
public class ProjectileBehavior : MonoBehaviour
|
||||
{
|
||||
|
||||
public bool pinned = false;
|
||||
|
||||
public void Explode() {
|
||||
public void Explode()
|
||||
{
|
||||
Destroy(this.gameObject);
|
||||
}
|
||||
|
||||
public void Pin() {
|
||||
public void Pin()
|
||||
{
|
||||
this.gameObject.GetComponent<Rigidbody2D>().constraints = RigidbodyConstraints2D.FreezeAll;
|
||||
this.gameObject.GetComponent<BoxCollider2D>().enabled = false;
|
||||
}
|
||||
|
||||
public void OnCollisionEnter2D(Collision2D col) {
|
||||
if (col.gameObject.tag == "wall") {
|
||||
public void OnCollisionEnter2D(Collision2D col)
|
||||
{
|
||||
if (col.gameObject.tag == "wall")
|
||||
{
|
||||
Explode();
|
||||
}
|
||||
}
|
||||
|
@ -2,23 +2,26 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProjectileEnemy : MonoBehaviour {
|
||||
public class ProjectileEnemy : MonoBehaviour
|
||||
{
|
||||
|
||||
[SerializeField] GameObject projectile;
|
||||
[SerializeField] GameObject firePoint;
|
||||
[SerializeField] [Range(0.1f, 3f)] float fireSpeed;
|
||||
[SerializeField][Range(0.1f, 3f)] float fireSpeed;
|
||||
[SerializeField] float projectileSpeed;
|
||||
|
||||
// Start is called before the first frame update
|
||||
void Start() {
|
||||
void Start()
|
||||
{
|
||||
StartCoroutine(Fire());
|
||||
}
|
||||
|
||||
IEnumerator Fire() {
|
||||
yield return new WaitForSeconds(1/fireSpeed);
|
||||
IEnumerator Fire()
|
||||
{
|
||||
yield return new WaitForSeconds(1 / fireSpeed);
|
||||
GameObject newProjectile = Instantiate(projectile, firePoint.transform.position, firePoint.transform.rotation);
|
||||
newProjectile.GetComponent<Rigidbody2D>().AddRelativeForce(new Vector2(projectileSpeed, 0));
|
||||
newProjectile.transform.Rotate(new Vector3(0,0,-90));
|
||||
newProjectile.transform.Rotate(new Vector3(0, 0, -90));
|
||||
StartCoroutine(Fire());
|
||||
}
|
||||
}
|
||||
|
@ -41,12 +41,16 @@ public class StateController : MonoBehaviour
|
||||
[Header("Unlocked Items")]
|
||||
public UnlockedItems itemProgression = UnlockedItems.None;
|
||||
|
||||
public bool projectileInRange = false;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
if (Instance == null)
|
||||
{
|
||||
Instance = this;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
Destroy(this.gameObject);
|
||||
return;
|
||||
}
|
||||
@ -54,7 +58,8 @@ public class StateController : MonoBehaviour
|
||||
SceneManager.sceneLoaded += OnSceneLoaded;
|
||||
}
|
||||
|
||||
void Start() {
|
||||
void Start()
|
||||
{
|
||||
if (this.inDebugMode)
|
||||
{
|
||||
debugCanvas = GameObject.Find("DebugCanvas");
|
||||
@ -180,7 +185,8 @@ public class StateController : MonoBehaviour
|
||||
|
||||
void TogglePauseMenu(bool showPauseMenu)
|
||||
{
|
||||
if (pauseMenuCanvas != null) {
|
||||
if (pauseMenuCanvas != null)
|
||||
{
|
||||
pauseMenuCanvas.SetActive(showPauseMenu);
|
||||
}
|
||||
}
|
||||
@ -198,7 +204,8 @@ public class StateController : MonoBehaviour
|
||||
{
|
||||
foreach (GameObject enemy in enemiesInScene)
|
||||
{
|
||||
if (enemy.GetComponent<EnemyPatrol>().isPlayingDefeatAnimation) {
|
||||
if (enemy.GetComponent<EnemyPatrol>().isPlayingDefeatAnimation)
|
||||
{
|
||||
enemy.SetActive(false);
|
||||
}
|
||||
enemy.SetActive(true);
|
||||
|
Loading…
Reference in New Issue
Block a user