PC-20230316NUNE\Administrator c4437fef5e 提交拖拽阵法
2023-11-16 19:10:19 +08:00

220 lines
6.0 KiB
TypeScript

import { _decorator } from "cc";
import GRoleBase, { GRoleAnimEvent } from "./GRoleBase";
import { ProgressBar } from "cc";
import { JNFrameInfo } from "../../../../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame";
import { GFSMAnimBase, GFSMBattleAminEnum } from "../fsm/GFSMAnimBase";
import { GFSMDefaultAnim } from "../fsm/Default/GFSMDefaultAnim";
import GFSMDefault from "../fsm/Default/GFSMDefault";
import { JEasing } from "../../../../../extensions/ngame/assets/ngame/sync/frame/game/tween/JNFrameTween";
import { GAttack } from "../attack/GAttack";
import { v2 } from "cc";
import { GTactical } from "../../entity/GTactical";
import { Vec2 } from "cc";
import { GSkill, GSkillBase, GSkillState } from "../../skill/GSkill";
import JNFrameTime from "../../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime";
import { TB } from "../../../../resources/config/data/schema";
import { TD } from "../../../App";
const { property,ccclass } = _decorator;
//默认角色类
@ccclass('GRoleDefault')
export default class GRoleDefault extends GRoleBase<{}>{
@property(ProgressBar)
bloodVolume:ProgressBar;
//能量条
@property(ProgressBar)
energyVolume:ProgressBar;
//状态机
fsm:GFSMDefault;
//动画状态机
fsmAnim:GFSMDefaultAnim;
get isDie(){ return this._isDie}
set isDie(value:boolean){
this._isDie = value;
//设置死亡状态
this.fsmAnim.isDie = value;
if(this.isDie){
//关闭状态机
this.fsm.close();
//死亡回调
this.killBack.forEach(fun => fun(this));
}
}
//角色类型
type:number;
//在阵容中的下标
tacticalIndex:number;
//阵容
_tactical:GTactical;
get tactical(){return this._tactical};
set tactical(value:GTactical){
this.setTowards(value.towards);
this._tactical = value;
}
//阵容位置
get tacticalPos(){ return this.tactical.getPosition(this.tacticalIndex)}
//角色技能
skills:GSkillBase[] = [];
//宠物死亡回调
killBack:((role:GRoleDefault) => {})[] = [];
onSyncLoad(){
super.onSyncLoad();
//监听攻击
this.fsmAnim.addEventListener(GRoleAnimEvent.Attack,this.onAttack.bind(this));
//监听死亡击飞
this.fsmAnim.addStartListener(GFSMBattleAminEnum.Fly,this.onFly.bind(this));
}
//初始化
onInit(type:number,role:TB.TbGRole,tactical:GTactical,tacticalIndex:number){
super.init(role);
this.type = type;
this.range = role.roleAttackRange; //设置攻击范围
this.role = role; //设置角色
this.tactical = tactical;
this.tacticalIndex = tacticalIndex;
// 设置技能
this.skills = role.roleSkillIds.map(skillId => {
let info = TD.TbGRoleSkill.get(skillId);
return (new GSkill[info.skillController]()).bind(this,info);
})
}
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: {}) {
super.onSyncUpdate(dt,frame,input);
//更新技能
this.skills.forEach(skill => skill.onUpdate(dt));
//更新显示
this.bloodVolume.progress = this.blood / this.fullBlood;
//显示第一个技能进度条
if(this.skills[0]){
this.energyVolume.progress = this.skills[0].getProgress();
}
}
protected fsmCreate(): GFSMDefault {
return new GFSMDefault(this);
}
protected fsmAnimCreate(): GFSMDefaultAnim {
return new GFSMDefaultAnim(this.spine);
}
//攻击
onAttack(){
if(!this.fsm.enemy) return;
// console.log(`播放动画[${this.nId}] onAttack`,this.fsm.enemy.nId)
//敌人扣血
let info = TD.TbGRoleAttack.get(this.role.id);
(new GAttack[info.attackWay]()).attack(this,info);
this.attackCallbacks.forEach(fun => fun());
}
//击飞
onFly(){
let vWorld = this.node.worldPosition;
let vEndWorld = this.getWorldBackLen(v2(1500,500));
this.JTween(vWorld)
.to({x:vEndWorld.x},1000)
.onUpdate(pos => this.node.worldPosition = pos)
.start();
this.JTween(vWorld)
.to({y:vEndWorld.y},1000)
.easing(JEasing.Circular.Out)
.onUpdate(pos => this.node.worldPosition = vWorld)
.start();
}
//过滤敌人
filterEnemy(roles:GRoleDefault[] = []){
return roles.filter(role => role.type != this.type);
}
//恢复阵容朝向
onRecoverTacticalTowards(){
this.setTowards(this.tactical.towards);
}
//释放技能 每一次只能释放一次
onSkill():boolean{
for (const item of this.skills) {
if(item.isRelease()){
//如果可以释放则释放
item.release();
return true;
}
}
return false;
}
//判断是否可以释放技能
isReleaseSkill():boolean{
for (const skill of this.skills) {
if(skill.isRelease()){
return true;
}
}
return false;
}
//释放技能
onReleaseSkill():boolean{
for (const skill of this.skills) {
if(skill.isRelease()){
skill.release();
return true;
}
}
return false;
}
//是否正在释放技能
isReleasingSkill():boolean {
for (const skill of this.skills) {
if(skill.state() == GSkillState.Releasing){
return true;
}
}
return false;
}
onQueryEunmy():GRoleDefault{
return null;
}
//添加一个死亡回调
addKillBackEvent(callback:(role:GRoleDefault) => {}){
this.killBack.push(callback);
}
//判断玩家是否在阵法位置
isTacticalPos():boolean{
return this.tactical.getPosition(this.tacticalIndex).equals(this.v2World);
}
}