import { _decorator, Vec2, RigidBody2D, BoxCollider2D, Size, ERigidBody2DType, Prefab, instantiate, Input, ProgressBar, Label } from 'cc'; import { EntityManager } from '../../Base/EntityManager'; import { EntityTypeEnum, EntityStateEnum, EventEnum, InputType, PrefabPathEnum } from '../../Enum'; import DataManager, { IPlayer, IVec2 } from '../../Global/DataManager'; import EventManager from '../../Global/EventManager'; import { ResourceManager } from '../../Global/ResourceManager'; import { rad2Angle } from '../../Utils'; import { WeaponManager } from '../Weapon/WeaponManager'; import { PlayerStateMachine } from './PlayerStateMachine'; const { ccclass, property } = _decorator; @ccclass('PlayerManager') export class PlayerManager extends EntityManager { //静态数据 id = 1 nickname = '' type = EntityTypeEnum.Player1 weaponType = EntityTypeEnum.Weapon1 bulletType = EntityTypeEnum.Bullet1 //动态数据 hp: number position: IVec2 direction: IVec2 private hpBar: ProgressBar private nicknameLabel: Label private weapon: WeaponManager get isSelf() { return DataManager.Instance.myPlayerId === this.id } init(data: IPlayer) { const { id, nickname, type, weaponType, bulletType } = data this.id = id this.nickname = nickname this.type = type this.weaponType = weaponType this.bulletType = bulletType this.hpBar = this.node.getComponentInChildren(ProgressBar) this.nicknameLabel = this.node.getComponentInChildren(Label) this.nicknameLabel.string = data.nickname this.fsm = this.addComponent(PlayerStateMachine) this.fsm.init(type) const weaponPrefab = DataManager.Instance.prefabMap.get(this.weaponType) const weapon = instantiate(weaponPrefab) weapon.setParent(this.node) this.weapon = weapon.addComponent(WeaponManager) this.weapon.init(data) } tick(dt: number) { if (!this.isSelf) { return } // if (!DataManager.Instance.jm.input.length()) { // return // } const { x, y } = DataManager.Instance.jm.input DataManager.Instance.applyInput({ type: InputType.PlayerMove, id: this.id, direction: { x, y }, dt }) } render(data: IPlayer) { this.renderHP(data) this.renderPosition(data) this.renderDirection(data) } renderHP(data: IPlayer) { this.hpBar.progress = data.hp / this.hpBar.totalLength } renderPosition(data: IPlayer) { this.node.setPosition(data.position.x, data.position.y) } renderDirection(data: IPlayer) { if (data.direction.x === 0 && data.direction.y === 0) { this.state = EntityStateEnum.Idle return } this.state = EntityStateEnum.Run const { x, y } = data.direction if (x !== 0) { this.node.setScale(x > 0 ? 1 : -1, 1) this.nicknameLabel.node.setScale(x > 0 ? 1 : -1, 1) } const side = Math.sqrt(x * x + y * y) const angle = rad2Angle(Math.asin(y / side)) this.weapon.node.setRotationFromEuler(0, 0, angle) // const { x, y } = joystick.input // let angle: number, sign: number // if (x !== 0) { // angle = rad2Angle(Math.atan(y / x)) // sign = joystick.input.x > 0 ? 1 : -1 // } else { // angle = rad2Angle(Math.PI / 2) // sign = joystick.input.y > 0 ? 1 : -1 // } // this.node.setRotationFromEuler(0, 0, sign * angle) } }