public void onStateChange(PlayerStateController.playerStates newState) { if (newState == currentState) { return; } // Comprovar que no hi hagi condicions per abortar l'estat if (checkIfAbortOnStateCondition(newState)) { return; } if (!checkForValidStatePair(newState)) { return; } Debug.Log(newState + ", current: " + currentState); rb2D = GetComponent <Rigidbody2D>(); switch (newState) { case PlayerStateController.playerStates.idle: playerAnimator.SetBool("Walking", false); break; case PlayerStateController.playerStates.left: playerAnimator.SetBool("Walking", true); break; case PlayerStateController.playerStates.right: playerAnimator.SetBool("Walking", true); break; case PlayerStateController.playerStates.jump: if (playerHasLanded) { if (right) { if (playerJumpStrongY < 0) { playerJumpStrongY = playerJumpStrongY * -1f; } rb2D.AddForce(new Vector2(playerJumpStrongY, playerJumpStrongX)); } else { if (playerJumpStrongY < 0) { rb2D.AddForce(new Vector2(playerJumpStrongY, playerJumpStrongX)); } else { playerJumpStrongY = playerJumpStrongY * -1f; rb2D.AddForce(new Vector2(playerJumpStrongY, playerJumpStrongX)); } } } playerHasLanded = false; Debug.Log("landing = " + playerHasLanded); break; case PlayerStateController.playerStates.landing: // Debug.Log("Landed " + playerHasLanded); playerHasLanded = true; // Debug.Log("Landed " + playerHasLanded); break; case PlayerStateController.playerStates.falling: break; case PlayerStateController.playerStates.kill: break; case PlayerStateController.playerStates.resurrect: transform.position = playerRespawnPoint.transform.position; transform.rotation = Quaternion.identity; rb2D.velocity = Vector2.zero; break; case PlayerStateController.playerStates.firingWeapon: PlayerStateController.stateDelayTimer[(int)PlayerStateController.playerStates.firingWeapon] = Time.time + 0.25f; GameObject newBullet = (GameObject)Instantiate(bulletPrefab); newBullet.transform.position = bulletSpawnTransform.position; PlayerBulletController bullCon = newBullet.GetComponent <PlayerBulletController>(); bullCon.playerObject = gameObject; bullCon.launchBullet(); onStateChange(currentState); break; case PlayerStateController.playerStates.firingWeapon2: PlayerStateController.stateDelayTimer[(int)PlayerStateController.playerStates.firingWeapon2] = Time.time + 0.25f; GameObject newBullet2 = (GameObject)Instantiate(bulletPrefab2); newBullet2.transform.position = bulletSpawnTransform.position; PlayerBulletController2 bullCon2 = newBullet2.GetComponent <PlayerBulletController2>(); bullCon2.playerObject = gameObject; bullCon2.launchBullet(); onStateChange(currentState); break; } previousState = currentState; currentState = newState; }
// onStateChange es crida sempre que canvia l'estat del player public void onStateChange(PlayerStateController.playerStates newState) { // Si l'estat actual i el nou són el mateix, no cal fer res if (newState == currentState) { return; } // Comprovar que no hi hagi condicions per abortar l'estat if (checkIfAbortOnStateCondition(newState)) { return; } // Comprovar que el pas de l'estat actual al nou estat està permès. Si no està, no es continua. if (!checkForValidStatePair(newState)) { return; } // Realitzar les accions necessàries en cada cas per canviar l'estat. // De moment només es gestionen els estats idle, right i left switch (newState) { case PlayerStateController.playerStates.idle: playerAnimator.SetBool("Walking", false); break; case PlayerStateController.playerStates.left: playerAnimator.SetBool("Walking", true); break; case PlayerStateController.playerStates.right: playerAnimator.SetBool("Walking", true); break; case PlayerStateController.playerStates.jump: Debug.Log(newState); if (playerHasLanded) { // jumpDirection determina si el salt es a la dreta, esquerra o vertical float jumpDirection = 0.0f; if (currentState == PlayerStateController.playerStates.left) { jumpDirection = -1.0f; } else if (currentState == PlayerStateController.playerStates.right) { jumpDirection = 1.0f; } else { jumpDirection = 0.0f; } // aplicar la força per fer el salt GetComponent <Rigidbody2D>().AddForce(new Vector2(jumpDirection * playerJumpForceHorizontal, playerJumpForceVertical)); //indicar que el Player esta saltant en l'aire playerHasLanded = false; } break; case PlayerStateController.playerStates.landing: playerHasLanded = true; break; case PlayerStateController.playerStates.falling: break; case PlayerStateController.playerStates.kill: break; case PlayerStateController.playerStates.resurrect: //posicio: la de PlayerRespawnPoint transform.position = playerRespawnPoint.transform.position; transform.rotation = Quaternion.identity; //rotacio: cap GetComponent <Rigidbody2D>().velocity = Vector2.zero; //velocitat lineal: zero break; case PlayerStateController.playerStates.firingWeapon: // Construir l'objecte bala a partir del Prefab GameObject newBullet = (GameObject)Instantiate(bulletPrefab); // Establir la posicio inicial de la bala creada //(la posicio de BulletSpawnTransform) newBullet.transform.position = bulletSpawnTransform.position; // Agafar el component PlayerBulletController de la bala //que s'ha creat // Establir temps a partir del qual es pot tornar a disparar PlayerStateController.stateDelayTimer[(int)PlayerStateController.playerStates.firingWeapon] = Time.time + 0.25f; PlayerBulletController bullCon = newBullet.GetComponent <PlayerBulletController>(); // Assignar a l'atribut playerObject de l'script //PlayerBulletController el Player bullCon.playerObject = gameObject; // Invocar metode que dispara la bala bullCon.launchBullet(); // Despres de disparar, tornar a l'estat previ. onStateChange(currentState); break; case PlayerStateController.playerStates.firingMortar: // Construir l'objecte bala a partir del Prefab GameObject newBullet2 = (GameObject)Instantiate(bulletPrefab2); // Establir la posicio inicial de la bala creada //(la posicio de BulletSpawnTransform) newBullet2.transform.position = bulletSpawnTransform.position; // Agafar el component PlayerBulletController de la bala //que s'ha creat // Establir temps a partir del qual es pot tornar a disparar PlayerStateController.stateDelayTimer[(int)PlayerStateController.playerStates.firingMortar] = Time.time + 0.25f; PlayerBulletController2 bullCon2 = newBullet2.GetComponent <PlayerBulletController2>(); // Assignar a l'atribut playerObject de l'script //PlayerBulletController el Player bullCon2.playerObject = gameObject; // Invocar metode que dispara la bala bullCon2.launchBullet(); // Despres de disparar, tornar a l'estat previ. onStateChange(currentState); break; } // Guardar estat actual com a estat previ previousState = currentState; // Assignar el nou estat com a estat actual del player currentState = newState; }