119 lines
3.6 KiB
TypeScript
Raw Normal View History

2022-11-27 23:23:47 +08:00
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)
}
}