mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 11:24:46 +00:00
模式状态机
This commit is contained in:
parent
ca5fa0cc92
commit
2eca21dab1
@ -17,7 +17,7 @@ export class WorldCanvas extends Component {
|
|||||||
@property([Prefab])
|
@property([Prefab])
|
||||||
prefabs:Prefab[] = [];
|
prefabs:Prefab[] = [];
|
||||||
|
|
||||||
index:number = 0;
|
index:number = 1;
|
||||||
|
|
||||||
async onLoad(){
|
async onLoad(){
|
||||||
|
|
||||||
|
@ -189,6 +189,11 @@ export default class GFSMDefault extends GFSMBase{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//获取 寻找敌人状态
|
||||||
|
getSeekEnemyProcessEnum(){
|
||||||
|
return ProcessEnum.SeekEnemy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,8 +15,16 @@ import JNFrameTime from "../../../../extensions/ngame/assets/ngame/sync/frame/ga
|
|||||||
import { TableGMap } from "../../../resources/config/ts/TableGMap";
|
import { TableGMap } from "../../../resources/config/ts/TableGMap";
|
||||||
import { app } from "../../App";
|
import { app } from "../../App";
|
||||||
import { v3 } from "cc";
|
import { v3 } from "cc";
|
||||||
|
import { v2 } from "cc";
|
||||||
|
import GFSMOnHookMode from "./OnHook/GFSMOnHookMode";
|
||||||
const { ccclass, property } = _decorator;
|
const { ccclass, property } = _decorator;
|
||||||
|
|
||||||
|
//挂机模式状态
|
||||||
|
export enum GOnHookModeState{
|
||||||
|
GoTarget,//前往目标
|
||||||
|
Attack, //攻击
|
||||||
|
AttackEnd, //攻击结束
|
||||||
|
}
|
||||||
|
|
||||||
//角色
|
//角色
|
||||||
export enum GOnHookModePlayerEnum{
|
export enum GOnHookModePlayerEnum{
|
||||||
@ -71,11 +79,23 @@ export default class GOnHookMode extends GBaseMode<{}>{
|
|||||||
//敌方宠物
|
//敌方宠物
|
||||||
enemyRoles: GRoleDefault[] = [];
|
enemyRoles: GRoleDefault[] = [];
|
||||||
|
|
||||||
offsetX:number = 0;
|
|
||||||
|
|
||||||
//地图信息
|
//地图信息
|
||||||
mapInfo:TableGMap;
|
mapInfo:TableGMap;
|
||||||
|
|
||||||
|
//每一波怪的距离
|
||||||
|
everyX:number = 1000;
|
||||||
|
|
||||||
|
//下一波怪的对战位置X
|
||||||
|
_nextFightX:number = 0;
|
||||||
|
get nextFightX(){return this._nextFightX}
|
||||||
|
set nextFightX(value:number){
|
||||||
|
//修改玩家阵法位置
|
||||||
|
this.playerInfo.tactical.setOffset(this.playerPos.clone().add(v2(value,0)))
|
||||||
|
this._nextFightX = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
fsm:GFSMOnHookMode;
|
||||||
|
|
||||||
onSyncInitSuccess():void{
|
onSyncInitSuccess():void{
|
||||||
|
|
||||||
//初始化战斗
|
//初始化战斗
|
||||||
@ -85,6 +105,9 @@ export default class GOnHookMode extends GBaseMode<{}>{
|
|||||||
let camreaPos = this.camera.node.worldPosition;
|
let camreaPos = this.camera.node.worldPosition;
|
||||||
this.camera.node.worldPosition = v3(0,100,camreaPos.z)
|
this.camera.node.worldPosition = v3(0,100,camreaPos.z)
|
||||||
|
|
||||||
|
//初始化状态机
|
||||||
|
this.fsm = new GFSMOnHookMode(this);
|
||||||
|
|
||||||
//初始化地图
|
//初始化地图
|
||||||
this.mapInfo = TableGMap.getConfig(60001);
|
this.mapInfo = TableGMap.getConfig(60001);
|
||||||
this.map1.init(app.battleRes.maps[60001][0],1);
|
this.map1.init(app.battleRes.maps[60001][0],1);
|
||||||
@ -99,12 +122,38 @@ export default class GOnHookMode extends GBaseMode<{}>{
|
|||||||
|
|
||||||
//生成玩家
|
//生成玩家
|
||||||
this.playerInfo.roles.forEach((info,index) => this.onGenRole(GOnHookModePlayerEnum.PLAYER,index + 1,info))
|
this.playerInfo.roles.forEach((info,index) => this.onGenRole(GOnHookModePlayerEnum.PLAYER,index + 1,info))
|
||||||
//生成敌人
|
|
||||||
this.onResetGenerateEnemy();
|
JNFrameTime.getInstance().setTimeout(() => {
|
||||||
|
//下一波怪
|
||||||
|
this.onNextTarget();
|
||||||
|
})
|
||||||
|
// //生成敌人
|
||||||
|
// this.onResetGenerateEnemy();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: {}){
|
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: {}){
|
||||||
|
super.onSyncUpdate(dt,frame,input);
|
||||||
|
this.onUpdateCamera(dt);
|
||||||
|
this.fsm.onUpdate(dt,frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
//更新相机逻辑
|
||||||
|
onUpdateCamera(dt:number){
|
||||||
|
|
||||||
|
//如果没有敌人相机永远锁定最前面的宠物
|
||||||
|
if(!this.isHaveEnemy()){
|
||||||
|
|
||||||
|
//获取冲到最前面的宠物
|
||||||
|
let roles = this.getOnesRole(GOnHookModePlayerEnum.PLAYER);
|
||||||
|
let frontRole = roles.sort((role1,role2) => role2.v2World.x - role1.v2World.x)[0];
|
||||||
|
if(!frontRole) return;
|
||||||
|
|
||||||
|
//设置相机 位置
|
||||||
|
let cameraWorld = this.camera.node.worldPosition.clone();
|
||||||
|
this.camera.node.worldPosition = cameraWorld.lerp(v3(frontRole.v2World.x,cameraWorld.y,cameraWorld.z),(dt / 1000));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,6 +193,12 @@ export default class GOnHookMode extends GBaseMode<{}>{
|
|||||||
if(type == GOnHookModePlayerEnum.ENEMY) return this.enemyRoles;
|
if(type == GOnHookModePlayerEnum.ENEMY) return this.enemyRoles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//获取存活的宠物
|
||||||
|
getOnesRoleAlive(type: GOnHookModePlayerEnum):GRoleDefault[]{
|
||||||
|
if(type == GOnHookModePlayerEnum.PLAYER) return this.playerRoles.filter(role => !!role.get());
|
||||||
|
if(type == GOnHookModePlayerEnum.ENEMY) return this.enemyRoles.filter(role => !!role.get());
|
||||||
|
}
|
||||||
|
|
||||||
//获取敌人
|
//获取敌人
|
||||||
getEnumy(player:GRoleDefault,type:GOnHookModePlayerEnum):GRoleDefault{
|
getEnumy(player:GRoleDefault,type:GOnHookModePlayerEnum):GRoleDefault{
|
||||||
|
|
||||||
@ -152,13 +207,13 @@ export default class GOnHookMode extends GBaseMode<{}>{
|
|||||||
if(type == GOnHookModePlayerEnum.ENEMY) enumyOnes = GOnHookModePlayerEnum.PLAYER
|
if(type == GOnHookModePlayerEnum.ENEMY) enumyOnes = GOnHookModePlayerEnum.PLAYER
|
||||||
|
|
||||||
//获取敌人
|
//获取敌人
|
||||||
let roles = this.getOnesRole(enumyOnes);
|
let roles = this.getOnesRoleAlive(enumyOnes);
|
||||||
|
|
||||||
//返回敌人
|
//返回敌人
|
||||||
//获取我在第几排
|
//获取我在第几排
|
||||||
let playerXY = player.tactical.getXY(player.tacticalIndex);
|
let playerXY = player.tactical.getXY(player.tacticalIndex);
|
||||||
//通过排数获取最近的敌人
|
//通过排数获取最近的敌人
|
||||||
let sort = roles.filter(role => !!role.get()).sort((enumy1,enumy2) => {
|
let sort = roles.sort((enumy1,enumy2) => {
|
||||||
let enumy1XY = enumy1.tactical.getXY(enumy1.tacticalIndex);
|
let enumy1XY = enumy1.tactical.getXY(enumy1.tacticalIndex);
|
||||||
let enumy2XY = enumy2.tactical.getXY(enumy2.tacticalIndex);
|
let enumy2XY = enumy2.tactical.getXY(enumy2.tacticalIndex);
|
||||||
return Math.abs((playerXY.y * 1000) - (enumy1XY.y * 1000)) + Math.abs((playerXY.x - enumy1XY.x)) -
|
return Math.abs((playerXY.y * 1000) - (enumy1XY.y * 1000)) + Math.abs((playerXY.x - enumy1XY.x)) -
|
||||||
@ -181,11 +236,27 @@ export default class GOnHookMode extends GBaseMode<{}>{
|
|||||||
if(role.isValid)
|
if(role.isValid)
|
||||||
role.node.destroy()
|
role.node.destroy()
|
||||||
},3000)
|
},3000)
|
||||||
//如果没有敌人则生成敌人
|
// //如果没有敌人则生成敌人
|
||||||
if(this.getOnesRole(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length <= 0){
|
// if(this.getOnesRole(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length <= 0){
|
||||||
//生成敌人
|
// //生成敌人
|
||||||
this.onResetGenerateEnemy();
|
// this.onResetGenerateEnemy();
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//是否有怪物
|
||||||
|
isHaveEnemy(){
|
||||||
|
return this.getOnesRoleAlive(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//前往下一个目标
|
||||||
|
onNextTarget(){
|
||||||
|
|
||||||
|
//如果没有敌人则前往
|
||||||
|
if(!this.isHaveEnemy()){
|
||||||
|
//下一个目标点
|
||||||
|
this.nextFightX = this.nextFightX + this.everyX;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
import GFSMBase, { GFSMProcessInfo } from "../../base/fsm/GFSMBase";
|
||||||
|
import GOnHookMode from "../GOnHookMode";
|
||||||
|
|
||||||
|
//流程枚举
|
||||||
|
enum ProcessEnum {
|
||||||
|
SeekEnemy = 0, //寻找敌人(场上没有敌人 或者敌人都击杀完)
|
||||||
|
GenNextFight = 1, //下一个战斗位置
|
||||||
|
LeaveFight = 2, //前往战斗
|
||||||
|
GenEnemy = 3, //生成敌人
|
||||||
|
Fight = 4, //战斗
|
||||||
|
}
|
||||||
|
|
||||||
|
//无限模式的状态类
|
||||||
|
export default class GFSMOnHookMode extends GFSMBase{
|
||||||
|
mode:GOnHookMode;
|
||||||
|
|
||||||
|
constructor(mode:GOnHookMode){
|
||||||
|
super();
|
||||||
|
this.mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
process:{[key:number]:GFSMProcessInfo} = {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user