This commit is contained in:
sli97
2022-12-01 22:26:41 +08:00
parent 1a27f478d0
commit bdead4a6d1
256 changed files with 7972 additions and 387 deletions

View File

@@ -0,0 +1,84 @@
import { _decorator } from 'cc'
import { EntityManager } from '../../Base/EntityManager'
import { EntityTypeEnum, EntityStateEnum, EventEnum } from '../../Enum'
import DataManager, { IBullet, IVec2 } from '../../Global/DataManager'
import EventManager from '../../Global/EventManager'
import ObjectPoolManager from '../../Global/ObjectPoolManager'
import { rad2Angle } from '../../Utils'
import { ExplosionManager } from '../Explosion/ExplosionManager'
import { BulletStateMachine } from './BulletStateMachine'
const { ccclass } = _decorator
@ccclass('BulletManager')
export class BulletManager extends EntityManager {
//静态数据
id: number
owner: number
type: EntityTypeEnum
//动态数据
position: IVec2
direction: IVec2
private angle: number
init({ id, owner, type }: IBullet) {
this.id = id
this.owner = owner
this.type = type
this.fsm = this.addComponent(BulletStateMachine)
this.fsm.init(type)
this.state = EntityStateEnum.Idle
this.node.active = false
EventManager.Instance.on(EventEnum.ExplosionBorn, this.handleExplosion, this)
}
handleExplosion(id: number, { x, y }: IVec2) {
if (this.id !== id) {
return
}
const explosion = ObjectPoolManager.Instance.get(EntityTypeEnum.Explosion)
const explosionManager = explosion.getComponent(ExplosionManager) || explosion.addComponent(ExplosionManager)
explosionManager.init(EntityTypeEnum.Explosion, {
x, y,
})
EventManager.Instance.off(EventEnum.ExplosionBorn, this.handleExplosion, this)
ObjectPoolManager.Instance.ret(this.node)
DataManager.Instance.bulletMap.delete(this.id)
this.angle = undefined
}
render(data: IBullet) {
this.node.active = true
this.renderPosition(data)
this.renderDirection(data)
}
renderPosition(data: IBullet) {
this.node.setPosition(data.position.x, data.position.y)
}
renderDirection(data: IBullet) {
if (this.angle === undefined) {
const { x, y } = data.direction
const side = Math.sqrt(x * x + y * y)
this.angle = x > 0 ? rad2Angle(Math.asin(y / side)) : rad2Angle(Math.asin(- y / side)) + 180
}
this.node.setRotationFromEuler(0, 0, this.angle)
// let angle: number, sign: number
// if (x !== 0) {
// angle = x > 0 ? rad2Angle(Math.atan(y / x)) : rad2Angle(Math.atan(-y / x)) + 180
// sign = x > 0 ? 1 : -1
// } else {
// angle = rad2Angle(Math.PI / 2)
// sign = y > 0 ? 1 : -1
// }
// this.node.setRotationFromEuler(0, 0, sign * angle)
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "3cb4bec9-dd63-4ffe-9a28-8f8347cd327b",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,44 @@
import { _decorator, Animation } from 'cc'
import State from '../../Base/State'
import StateMachine, { getInitParamsTrigger } from '../../Base/StateMachine'
import { EntityTypeEnum, EntityStateEnum, ParamsNameEnum } from '../../Enum'
const { ccclass } = _decorator
@ccclass('BulletStateMachine')
export class BulletStateMachine extends StateMachine {
init(type: EntityTypeEnum) {
this.type = type
this.animationComponent = this.node.addComponent(Animation)
this.initParams()
this.initStateMachines()
this.initAnimationEvent()
}
initParams() {
this.params.set(ParamsNameEnum.Idle, getInitParamsTrigger())
}
initStateMachines() {
this.stateMachines.set(ParamsNameEnum.Idle, new State(this, `${this.type}${EntityStateEnum.Idle}`))
}
initAnimationEvent() {
}
run() {
switch (this.currentState) {
case this.stateMachines.get(ParamsNameEnum.Idle):
if (this.params.get(ParamsNameEnum.Idle).value) {
this.currentState = this.stateMachines.get(ParamsNameEnum.Idle)
} else {
this.currentState = this.currentState
}
break
default:
this.currentState = this.stateMachines.get(ParamsNameEnum.Idle)
break
}
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "531b884c-93b6-4d0e-a0fc-e8861eebf6e7",
"files": [],
"subMetas": {},
"userData": {}
}