mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-27 02:36:14 +00:00
重构继承关系
This commit is contained in:
@@ -0,0 +1,194 @@
|
||||
import { Vec2 } from "cc";
|
||||
import GRoleBase from "../../role/GRoleBase";
|
||||
import GFSMBase, { GFSMProcessEnum, GFSMProcessInfo, GFSMProcessMode } from "../GFSMBase";
|
||||
import { GRoleUtil } from "../../../entity/GRole";
|
||||
import GRoleDefault from "../../role/GRoleDefault";
|
||||
|
||||
|
||||
//流程枚举
|
||||
enum ProcessEnum {
|
||||
//寻找敌人
|
||||
SeekEnemy = 0,
|
||||
//移动到可攻击范围
|
||||
MoveToAttackRange = 1,
|
||||
//攻击敌人
|
||||
AttackEnemy = 2,
|
||||
//回阵型
|
||||
MoveToTactical = 3,
|
||||
//释放技能
|
||||
ReleaseSkills = 4,
|
||||
}
|
||||
|
||||
export default class GFSMDefault extends GFSMBase{
|
||||
|
||||
_player:() => GRoleDefault;
|
||||
|
||||
get player(): GRoleDefault {
|
||||
return this._player();
|
||||
}
|
||||
|
||||
//锁定的敌人
|
||||
_enemy:() => GRoleDefault;
|
||||
get enemy():GRoleDefault{
|
||||
if(this._enemy)
|
||||
return this._enemy();
|
||||
return null;
|
||||
}
|
||||
|
||||
//流程图
|
||||
process: { [key: number]: GFSMProcessInfo; } = {
|
||||
[ProcessEnum.SeekEnemy]:{
|
||||
title:"寻找敌人",
|
||||
execute: this.onSeekEnemyProcess.bind(this),
|
||||
// to:[ProcessEnum.MoveToAttackRange], //移动到可攻击范围
|
||||
to:[ProcessEnum.MoveToAttackRange,ProcessEnum.MoveToTactical], //移动到可攻击范围
|
||||
},
|
||||
[ProcessEnum.MoveToAttackRange]:{
|
||||
title:"移动到可攻击范围",
|
||||
mode:GFSMProcessMode.WaitExecute,
|
||||
execute: this.onMoveToAttackRangeProcess.bind(this),
|
||||
to:[ProcessEnum.AttackEnemy] //攻击敌人 回阵型
|
||||
},
|
||||
[ProcessEnum.AttackEnemy]:{
|
||||
title:"攻击敌人",
|
||||
mode:GFSMProcessMode.WaitExecute,
|
||||
execute: this.onAttackProcess.bind(this),
|
||||
to:[ProcessEnum.SeekEnemy,ProcessEnum.ReleaseSkills],//移动回阵型 释放技能
|
||||
},
|
||||
[ProcessEnum.MoveToTactical]:{
|
||||
title:"获取初始点",
|
||||
mode:GFSMProcessMode.WaitExecute,
|
||||
execute: this.onMoveToInitPosProcess.bind(this),
|
||||
to:[ProcessEnum.SeekEnemy],//移动回阵型
|
||||
},
|
||||
[ProcessEnum.ReleaseSkills]:{
|
||||
title:"释放技能",
|
||||
mode:GFSMProcessMode.WaitExecute,
|
||||
execute: this.onReleaseSkillsProcess.bind(this),
|
||||
to:[ProcessEnum.AttackEnemy],//继续攻击
|
||||
}
|
||||
}
|
||||
|
||||
constructor(player:GRoleDefault){
|
||||
super();
|
||||
this._player = GRoleUtil.get(player);
|
||||
}
|
||||
|
||||
|
||||
//寻敌
|
||||
onSeekEnemy(): GRoleDefault {
|
||||
return this.player.onQueryEunmy();
|
||||
}
|
||||
|
||||
//寻敌流程
|
||||
onSeekEnemyProcess(dt:number):number{
|
||||
|
||||
//播放等待
|
||||
this.player.fsmAnim.isMove = false;
|
||||
this.player.fsmAnim.isAttack = false;
|
||||
|
||||
if(this.enemy){
|
||||
//如果有敌人 直接 攻击
|
||||
return ProcessEnum.MoveToAttackRange;
|
||||
}
|
||||
|
||||
if((this._enemy = GRoleUtil.get(this.onSeekEnemy())) && this.enemy){
|
||||
//如果有敌人 直接 攻击
|
||||
return ProcessEnum.MoveToAttackRange;
|
||||
}else{
|
||||
//如果没有敌人则回去
|
||||
if(!(this.player.tacticalPos.equals(this.player.v2World))){
|
||||
return ProcessEnum.MoveToTactical
|
||||
}else{
|
||||
return GFSMProcessEnum.Reset;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//移动可攻击范围
|
||||
onMoveToAttackRangeProcess(dt:number){
|
||||
|
||||
//播放移动
|
||||
this.player.fsmAnim.isMove = true;
|
||||
this.player.fsmAnim.isAttack = false;
|
||||
|
||||
//如果没有敌人则重置
|
||||
if(!this.enemy) return GFSMProcessEnum.Reset;
|
||||
|
||||
let distance = Vec2.distance(this.player.v2World,this.enemy.v2World);
|
||||
|
||||
//如果在攻击范围则调用攻击 负责 靠近目标
|
||||
if(distance < this.player.range){
|
||||
return ProcessEnum.AttackEnemy;
|
||||
}else{
|
||||
//靠近目标
|
||||
this.player.onMoveTarget(this.enemy.v2World,dt);
|
||||
return GFSMProcessEnum.Wait;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//移动回阵型
|
||||
onMoveToInitPosProcess(dt:number){
|
||||
|
||||
//播放移动
|
||||
this.player.fsmAnim.isMove = true;
|
||||
this.player.fsmAnim.isAttack = false;
|
||||
|
||||
if(this.player.onMoveTarget(this.player.tacticalPos,dt)){
|
||||
this.player.onRecoverTacticalTowards();
|
||||
//回到阵容 搜索敌人
|
||||
return ProcessEnum.SeekEnemy;
|
||||
}
|
||||
|
||||
return GFSMProcessEnum.Wait;
|
||||
|
||||
}
|
||||
|
||||
//攻击敌人
|
||||
onAttackProcess(dt:number){
|
||||
//播放移动
|
||||
this.player.fsmAnim.isMove = false;
|
||||
this.player.fsmAnim.isAttack = true;
|
||||
//如果有敌人则攻击 没有 则 重置
|
||||
if(this.enemy){
|
||||
//朝向敌人
|
||||
this.player.onTowardsTarget(this.enemy);
|
||||
|
||||
//是否可释放技能
|
||||
if(this.player.isReleaseSkill()){
|
||||
//则释放技能
|
||||
return ProcessEnum.ReleaseSkills;
|
||||
}else{
|
||||
return GFSMProcessEnum.Wait;
|
||||
}
|
||||
|
||||
}else{
|
||||
return ProcessEnum.SeekEnemy;
|
||||
}
|
||||
}
|
||||
|
||||
//释放技能
|
||||
onReleaseSkillsProcess(){
|
||||
|
||||
//如果正在释放则等待
|
||||
if(this.player.isReleasingSkill()){
|
||||
return GFSMProcessEnum.Wait;
|
||||
}
|
||||
|
||||
//释放技能
|
||||
if(this.player.isReleaseSkill()){
|
||||
//如果可以释放技能则释放
|
||||
this.player.onReleaseSkill();
|
||||
return GFSMProcessEnum.Wait;
|
||||
}else{
|
||||
//不可以则回到攻击
|
||||
return ProcessEnum.AttackEnemy;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "37959c38-50cc-430a-b892-ef0e6df3f15d",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -0,0 +1,82 @@
|
||||
import { GFSMAnimBase, GFSMProcessAnimInfo } from "../GFSMAnimBase";
|
||||
|
||||
//角色动画名称枚举
|
||||
export enum GFSMBattleAminEnum {
|
||||
Wait = "std", //等待
|
||||
Walk = "walk", //移动
|
||||
Attack = "atk", //攻击
|
||||
Fly = "jifei", //击飞
|
||||
}
|
||||
|
||||
//流程枚举
|
||||
enum ProcessEnum {
|
||||
//等待
|
||||
Wait = 0,
|
||||
//移动
|
||||
Move = 1,
|
||||
//攻击
|
||||
Attack = 2,
|
||||
//死亡
|
||||
Die = 3,
|
||||
}
|
||||
|
||||
//动画状态机基类
|
||||
export class GFSMDefaultAnim extends GFSMAnimBase{
|
||||
|
||||
//是否攻击
|
||||
isAttack:boolean = false;
|
||||
|
||||
//是否移动
|
||||
isMove:boolean = false;
|
||||
|
||||
//是否死亡
|
||||
isDie:boolean = false;
|
||||
|
||||
// 流程图
|
||||
process: { [key: number]: GFSMProcessAnimInfo; } = {
|
||||
[ProcessEnum.Wait]:{
|
||||
title:"等待",
|
||||
isLoop:true,
|
||||
animName:GFSMBattleAminEnum.Wait,
|
||||
mixs:[0.1,0.1],
|
||||
to:[ProcessEnum.Move,ProcessEnum.Attack,ProcessEnum.Die],
|
||||
ifTo:[
|
||||
() => this.isMove, //前往移动
|
||||
() => this.isAttack, //前往攻击
|
||||
() => this.isDie,
|
||||
],
|
||||
},
|
||||
[ProcessEnum.Move]:{
|
||||
title:"移动",
|
||||
animName:GFSMBattleAminEnum.Walk,
|
||||
isLoop:true,
|
||||
mixs:[0.1,0.1],
|
||||
to:[ProcessEnum.Wait,ProcessEnum.Attack,ProcessEnum.Die],
|
||||
ifTo:[
|
||||
() => !this.isMove, //前往等待
|
||||
() => this.isAttack, //前往攻击
|
||||
() => this.isDie,
|
||||
],
|
||||
},
|
||||
[ProcessEnum.Attack]:{
|
||||
title:"攻击",
|
||||
animName:GFSMBattleAminEnum.Attack,
|
||||
isLoop:true,
|
||||
mixs:[0.1,0.1],
|
||||
to:[ProcessEnum.Wait,ProcessEnum.Move,ProcessEnum.Die],
|
||||
ifTo:[
|
||||
() => !this.isAttack, //前往等待
|
||||
() => !this.isAttack && this.isMove, //前往移动
|
||||
() => this.isDie,
|
||||
],
|
||||
},
|
||||
[ProcessEnum.Die]:{
|
||||
title:"死亡",
|
||||
animName:GFSMBattleAminEnum.Fly,
|
||||
isLoop:true,
|
||||
mixs:[0.1,0.1],
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "1016ec33-b6d2-453d-9ee2-6ab7ba5bfb7a",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "66a8eb65-27e3-4c94-b098-211d582aa677",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "bcd244d3-5392-4926-94f1-3cd24ea2d5c2",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "86cd6fa1-1340-4343-8929-7c5363727b1c",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "3a061d5f-a202-4d3d-8758-1d1afbe1cd15",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
Reference in New Issue
Block a user