using UnityEngine; using System.Collections; using System.Collections.Generic; //input for lists using UnityEngine.UI; public class playerController : MonoBehaviour { public string HorizontalBtn; //holds string for horizontal input public string VerticalBtn; //holds string for Vertical input public string StrongAttackBtn; public string DashAttackBtn; public Animator animator; //Holds animator for Pinata public GameObject heart; //Health sprites public GameObject newConfetti; //confetti when hit public GameObject newCandy; public stickController stick; //controller for stick public GUIText scoreDisplay; public GUIText gameOverDisplay; public GameObject dashDisplay; public float runSpeed; //run speed public float jumpHeight; //jump height public float health; //holds health public int confettiOnHit; //amount of confetti created on hit public Vector2 healthPos; public float invulTime; public float attackWait; public bool isHit; public float dashDistance; public float dashTime; public float dashWait; private float displayedHealth = 3; //currently displayed health private bool updateHealth = true; //if the health bar needs updating private float curDirection = -1; //direction player is pointing private bool canJump = true; // if player can jump private bool canSpin = true; // if player can spin private List hearts = new List (); //list which holds health sprites; private bool isSpinning = false; //checks if player is spin attacking private float lastHit; private float lastAttack; private int score; private bool isDashing =false; private bool canDash = true; private float lastDash = 0.0f; private bool stopDash = false; public float deathTimer = 3.0f; void Start(){ if (transform.rotation.y == 180) curDirection = -1; else curDirection = 1; } // Update is called once per frame void Update () { displayHealth (); death (); applyPlayerDirection (Input.GetAxisRaw (HorizontalBtn)); damage (); if (transform.position.y < -3) health = 0; if (score >= 10) { gameOverDisplay.enabled = true; gameOverDisplay.text = ""+ gameObject.name + " Wins"; Time.timeScale = 0; } dashDisplay.GetComponent ().size = (Time.time - lastDash) / dashWait; } void FixedUpdate() { /* * Movement inputs */ Vector2 velocity = rigidbody2D.velocity; velocity.x = Input.GetAxis (HorizontalBtn) * runSpeed; //Horizontal input if ((Input.GetAxisRaw (VerticalBtn) == 1) && (canJump)) //Vertical input { velocity.y = jumpHeight; canJump = false; }//end if if (Input.GetAxisRaw (StrongAttackBtn)==1) { if (!isSpinning && canSpin && Time.time - lastAttack > attackWait){ velocity.y = jumpHeight; lastAttack = Time.time; StartCoroutine (spinAttack (Vector3.down * 360, 0.2f)); } } if (Input.GetAxisRaw (DashAttackBtn) == 1) { //Debug.Log ("dashbutton pressed"); if(!isDashing && canDash && Time.time - lastDash > dashWait){ lastDash = Time.time; StartCoroutine (dashAttack (dashDistance,dashTime)); } } rigidbody2D.velocity = velocity; //apply inputs animator.SetFloat("Velocity",velocity.magnitude);//inputs for animator animator.SetBool ("Fall", !canJump); }//end fixed update private void displayHealth(){ if (displayedHealth != health) //check if health needs updating updateHealth = true; if (updateHealth){ foreach (GameObject desHeart in hearts) //Destroy all heart sprites GameObject.Destroy (desHeart); hearts.Clear(); //sets list to zero for (int i=1; i<= health; i++) { //creates new heart sprite for each health GameObject heartCanister = Instantiate (heart) as GameObject; //creat heart sprite Vector3 heartPos = new Vector3 (); //set position if (healthPos.x == 1) heartPos.x = (i * 0.033f); else heartPos.x = 1-(i * 0.033f); if (healthPos.y == 1) heartPos.y = 0.95f; else heartPos.y = 0.05f; heartCanister.transform.position = heartPos; hearts.Add(heartCanister); //adds heart to list }//end for displayedHealth = health; updateHealth = false; }//end if }//end displayHealth //respawns player if they die private void death() { if (health <= 0) if (deathTimer > 0) { deathTimer -=Time.deltaTime; //gameObject.active = false; if(deathTimer <=0) { //gameObject.active = true; Instantiate (newCandy, transform.position + Vector3.up, transform.rotation); Vector3 spawnPos = new Vector3 (Random.Range (-20.0f, 20.0f), 15.0f, 0); //picks random position health = 3; //resets life transform.position = spawnPos; //changes position rigidbody2D.velocity = Vector2.zero; deathTimer = deathTimer + 3.02f; } }//end if }//end death private void applyPlayerDirection(float moveHorizontal) { if ((curDirection != moveHorizontal) && (moveHorizontal != 0) && !isSpinning) //if player movement direction vs displayed direction { transform.Rotate(0,180,0); //rotates player curDirection = moveHorizontal; //updates direction } } private void damage (){ if (isHit) { gameObject.GetComponentInChildren ().enabled = false; isHit = false; lastHit = Time.time; } if (lastHit+invulTime < Time.time) gameObject.GetComponentInChildren ().enabled = true; } //spin IEnumerator spinAttack(Vector3 byAngles, float inTime) { isSpinning = true; canSpin = false; stick.isAttacking = true; Debug.Log ("" + gameObject.name + "spinning"); Quaternion startAngle = transform.rotation; Quaternion endAngle = Quaternion.Euler(transform.eulerAngles + byAngles); float direction = transform.eulerAngles.y; for(float i = 0; i < 1; i += Time.deltaTime/inTime) { transform.rotation = Quaternion.Euler(0,direction,Mathf.Lerp(0,360,i)); yield return null; } transform.eulerAngles = new Vector3 (0,direction,0); //Debug.Log ("" + gameObject.name + "End spin"); isSpinning = false; stick.isAttacking = false; } //dash IEnumerator dashAttack (float dashDistance,float dashTime) { float endPosition; int dashDirection; isDashing = true; canDash = false; stick.isAttacking = true; Debug.Log ("" + gameObject.name + "Dashing"); rigidbody2D.gravityScale = 0; Vector3 startPosition = transform.position; //Debug.Log ("rotation Y: " + transform.eulerAngles.y); if (transform.eulerAngles.y >= 150) dashDirection = -1; else dashDirection = 1; endPosition = startPosition.x + (dashDirection * dashDistance); //Debug.Log ("Dash start: " + startPosition.x); //Debug.Log ("Dash Direction: " + (dashDirection )); //Debug.Log ("Dash end: " + endPosition); for (float i = 0; i < 1; i += Time.deltaTime/dashTime) { transform.position = new Vector3(dashDirection * Mathf.Lerp((dashDirection)*startPosition.x, (dashDirection)* endPosition, i), startPosition.y, startPosition.z); if ((transform.position.x < -30.5f && dashDirection == -1) || (transform.position.x > 26.5 && dashDirection == 1)) stopDash = true; if (stopDash) break; yield return null; } stopDash = false; isDashing = false; canDash = true; stick.isAttacking = false; //Debug.Log ("" + gameObject.name + " finished Dashing"); rigidbody2D.gravityScale = 4; } void OnCollisionEnter2D(Collision2D col){ if (col.collider.tag == "ground") { canJump = true; canSpin = true; } else if (col.collider.tag == "Player") { canJump = true; canSpin = true; } if (col.collider.tag == "wall") { stopDash = true; } } void OnTriggerEnter2D(Collider2D trig) { Debug.Log (trig.gameObject.tag); if (trig.gameObject.tag == "candy") { trig.gameObject.SetActive (false); score++; scoreDisplay.text = "score: " + score.ToString (); } } }