提交代码

This commit is contained in:
PC-20230316NUNE\Administrator
2024-01-17 18:36:59 +08:00
parent 8ad2313502
commit 1b4db3c980
46 changed files with 1518 additions and 667 deletions

View File

@@ -1,105 +1,75 @@
import { _decorator } from "cc";
import GBaseMode from "../GBaseMode";
import { TB, TbGEntity } from "../../config/data/schema";
import GNormalModeBase, { GNormalModePlayerEnum } from "./default/GNormalModeBase";
import { TD, app } from "../../App";
import GOnHookData from "../../data/GOnHookData";
import PlayerTacticalData from "../../data/PlayerTacticalData";
import PlayerPetData from "../../data/PlayerPetData";
import { TD, app } from "../../App";
import { GUI } from "../../ui/UIConfig";
import { GOnHookModePlayerEnum } from "./GOnHookMode";
import GRoleDefault from "../base/role/GRoleDefault";
import GBattleData from "../../data/GBattleData";
import GAttributeData from "../base/values/GAttributeData";
import JNFrameTime from "../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime";
const { ccclass, property } = _decorator;
//角色
export enum GDungeonModeEnum{
PLAYER, //玩家
ENEMY, //怪物
}
/**
* 副本(默认) 模式
*/
@ccclass('GDungeonMode')
export default class GDungeonMode extends GBaseMode<{},TbGEntity.TDungeon>{
export default class GDungeonMode extends GNormalModeBase<{},TbGEntity.TDungeon>{
onSyncInitSuccess(){
if(!this.data) return;
//生成玩家宠物
onGenPlayerPet(index:number,petId:number){
console.log("初始化 GDungeonMode 模式",this.data);
super.onSyncInitSuccess();
this.onUpdateWorld();
//生成玩家宠物
this.onGenPlayerPet();
//生成Boss
this.onGenBoss();
}
//更新地图
onUpdateWorld(){
let info = TD.TbGOnHookMaps.get(GOnHookData.getIns().info.onHookMap);
this.setWorldMap(info.mapId);
}
onGenPlayerPet(){
//获取玩家阵容
let infos = PlayerTacticalData.getIns().getTacticalInfo();
infos.forEach(petId => {
infos.forEach((petId,index) => {
if(!petId) return;
//获取要生成的宠物
let info = PlayerPetData.getIns().petIdQueryPetInfo(petId);
if(!info){
app.layer.Open(GUI.Tips,{text:"未拥有当前上阵的宠物"});
return;
}
let role = this.onGenRole(GOnHookModePlayerEnum.PLAYER,index,TD.TbGRole.get(info.petTbId));
let role = this.onGenRole(GNormalModePlayerEnum.PLAYER,index + 1,TD.TbGRole.get(info.petTbId));
//添加宠物属性
role.onEffectiveValue(GBattleData.getIns().data.getPetAttribute(petId));
})
//如果场上有这个宠物则更新阵法位置
let passRole:GRoleDefault;
this.playerRoles.forEach(role => {
if(role.getComponent(GRoleOnHookPlayerExpand).petId == petId)
passRole = role;
})
if(passRole){
//更新宠物阵法位置
passRole.tacticalIndex = index;
return;
}
if(!info){
app.layer.Open(GUI.Tips,{text:"未拥有当前上阵的宠物"});
return;
}
let role = this.onGenRole(GOnHookModePlayerEnum.PLAYER,index,TD.TbGRole.get(info.petTbId));
//向宠物添加 OnHook 扩展
let expand = role.node.addComponent(GRoleOnHookPlayerExpand);
expand.petId = petId;
//添加宠物属性
role.onEffectiveValue(GBattleData.getIns().data.getPetAttribute(petId));
}
//生成宠物
onGenRole(type: GOnHookModePlayerEnum,index:number,info:TB.TbGRole):GRoleDefault {
let tactical = this.getInfo(type).tactical;
let pos:Vec2 = this.getInfo(type).tactical.getPosition(index);
if(!pos) return;
let role = instantiate(this.rolePrefab);
let entity = role.getComponent(GRoleDefault);
//初始化
entity.onInit(type,info,tactical,index);
//绑定寻敌
entity.onQueryEunmy = () => {
return this.getEnumy(entity,type);
}
//绑定死亡回调
entity.addKillBackEvent(this.onRoleKillBack.bind(this))
//绑定受击回调
entity.addHitCallback(this.onHitBack.bind(this));
this.addGObject(entity,tactical.getPosition(index));
this.getOnesRole(type).push(entity);
return entity;
onGenBoss(){
let enemy = this.onGenRole(GNormalModePlayerEnum.ENEMY,5,TD.TbGRole.get(this.data.boss));
enemy.onEffectiveValue(GAttributeData.TAttributeValue(this.data.attributes))
}
//战斗结束
onBattleEnd(win:GNormalModePlayerEnum){
//结束游戏
JNFrameTime.getInstance().setTimeout(() => {
this.Close();
},3000)
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "202e1a9e-fabf-412d-818d-69b4e13c8d5f",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -24,11 +24,10 @@ import { GOnHookPet, GOnHookPets } from "../../../../extensions/ngame/assets/nga
import GOnHookManager, { GOnHookManagerEvent } from "../../manager/battle/mode/GOnHookManager";
import GRoleOnHookCreepsExpand from "../base/role/expand/OnHook/GRoleOnHookCreepsExpand";
import GPetAttribute from "../base/values/attribute/role/GPetAttribute";
import GDefaultMode from "./default/GDefaultMode";
import GOnHookData from "../../data/GOnHookData";
import { GModeEvent, GModeHitInfo } from "./GMode";
import GAttributeData from "../base/values/GAttributeData";
import GBattleData, { GBattleDataEnum } from "../../data/GBattleData";
import GNormalModeBase, { GNormalModePlayerEnum } from "./default/GNormalModeBase";
const { ccclass, property } = _decorator;
//挂机模式状态
@@ -38,26 +37,11 @@ export enum GOnHookModeState{
AttackEnd, //攻击结束
}
//角色
export enum GOnHookModePlayerEnum{
PLAYER, //玩家
ENEMY, //怪物
}
//玩家信息
export interface GOnHookInfo{
//阵法
tactical: GTactical;
}
/**
* 挂机模式 无限出现小怪 (不是联机模式 该模式支持使用本地数据 和 API)
*/
@ccclass('GOnHookMode')
export default class GOnHookMode extends GDefaultMode<{},{}>{
@property(Prefab)
rolePrefab: Prefab = null;
export default class GOnHookMode extends GNormalModeBase<{},{}>{
@property(Node)
objects: Node = null;
@@ -65,16 +49,6 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
get scene():Node{
return this.objects;
}
//玩家信息
playerInfo:GOnHookInfo;
//宠物信息
enemyInfo:GOnHookInfo;
//玩家宠物位置
playerPos: Vec2 = new Vec2(-400,0);
//怪物位置
enemyPos: Vec2 = new Vec2(400,0);
//玩家宠物
playerRoles: GRoleDefault[] = [];
@@ -102,6 +76,9 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
//是否战斗失败
isFail:boolean = false;
//让胜负失效
get isEndGame(){return true;}
//添加监听事件
addEvent(){
app.event.on(PlayerTacticalEvent.UPDATE_TACTICAL,this.onUpdatePlayerPet,this);
@@ -121,20 +98,13 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
//初始化战斗
console.log("GOnHookMode 模式初始化");
//调整相机
this.camera.enabled = true;
let camreaPos = this.camera.node.worldPosition;
this.camera.node.worldPosition = v3(0,750,camreaPos.z)
super.onSyncInitSuccess();
//初始化状态机
this.fsm = new GFSMOnHookMode(this);
//更新场景
this.onUpdateWorld();
this.playerInfo = { tactical: GTactical.getTactical().setOffset(this.playerPos) };
this.enemyInfo = { tactical: GTactical.getTactical(true).setOffset(this.enemyPos) };
this.onUpdatePlayerPet();
//添加监听
@@ -149,7 +119,7 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
// })
//生成玩家
// this.playerInfo.roles.forEach((info,index) => this.onGenRole(GOnHookModePlayerEnum.PLAYER,index + 1,info))
// this.playerInfo.roles.forEach((info,index) => this.onGenRole(GNormalModePlayerEnum.PLAYER,index + 1,info))
// //生成敌人
// this.onResetGenerateEnemy();
@@ -173,7 +143,7 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
let infos = PlayerTacticalData.getIns().getTacticalInfo();
//移除不再阵容中的宠物
let roles = [...this.getOnesRoleAlive(GOnHookModePlayerEnum.PLAYER)]
let roles = [...this.getOnesRoleAlive(GNormalModePlayerEnum.PLAYER)]
roles.forEach(role => {
let expand = role.getComponent(GRoleOnHookPlayerExpand);
//如果宠物不再阵容中 则 移除宠物
@@ -195,7 +165,7 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
//更新属性
onUpdateAttribute(){
this.getOnesRole(GOnHookModePlayerEnum.PLAYER).forEach(pet => {
this.getOnesRole(GNormalModePlayerEnum.PLAYER).forEach(pet => {
pet.onEffectiveValue(GBattleData.getIns().data.getPetAttribute(pet.getComponent(GRoleOnHookPlayerExpand).petId));
});
@@ -221,7 +191,7 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
}else{
//获取冲到最前面的宠物
let roles = this.getOnesRoleAlive(GOnHookModePlayerEnum.PLAYER);
let roles = this.getOnesRoleAlive(GNormalModePlayerEnum.PLAYER);
let frontRole = roles.sort((role1,role2) => role2.v2World.x - role1.v2World.x)[0];
if(!frontRole) return;
@@ -254,7 +224,7 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
app.layer.Open(GUI.Tips,{text:"未拥有当前上阵的宠物"});
return;
}
let role = this.onGenRole(GOnHookModePlayerEnum.PLAYER,index,TD.TbGRole.get(info.petTbId));
let role = this.onGenRole(GNormalModePlayerEnum.PLAYER,index,TD.TbGRole.get(info.petTbId));
//向宠物添加 OnHook 扩展
let expand = role.node.addComponent(GRoleOnHookPlayerExpand);
expand.petId = petId;
@@ -267,7 +237,7 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
//生成野怪
onGenCreeps(index:number,creeps:GOnHookPet){
let role = this.onGenRole(GOnHookModePlayerEnum.ENEMY,index,TD.TbGRole.get(creeps.petTbId));
let role = this.onGenRole(GNormalModePlayerEnum.ENEMY,index,TD.TbGRole.get(creeps.petTbId));
//向野怪添加扩展
let expand = role.node.addComponent(GRoleOnHookCreepsExpand);
@@ -285,85 +255,12 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
}
//生成宠物
onGenRole(type: GOnHookModePlayerEnum,index:number,info:TB.TbGRole):GRoleDefault {
let tactical = this.getInfo(type).tactical;
let pos:Vec2 = this.getInfo(type).tactical.getPosition(index);
if(!pos) return;
let role = instantiate(this.rolePrefab);
let entity = role.getComponent(GRoleDefault);
//初始化
entity.onInit(type,info,tactical,index);
//绑定寻敌
entity.onQueryEunmy = () => {
return this.getEnumy(entity,type);
}
//绑定死亡回调
entity.addKillBackEvent(this.onRoleKillBack.bind(this))
//绑定受击回调
entity.addHitCallback(this.onHitBack.bind(this));
this.addGObject(entity,tactical.getPosition(index));
this.getOnesRole(type).push(entity);
return entity;
}
//获取配置
getInfo(type: GOnHookModePlayerEnum): GOnHookInfo {
if(type == GOnHookModePlayerEnum.PLAYER) return this.playerInfo;
if(type == GOnHookModePlayerEnum.ENEMY) return this.enemyInfo;
}
//获取阵营宠物
getOnesRole(type: GOnHookModePlayerEnum):GRoleDefault[]{
if(type == GOnHookModePlayerEnum.PLAYER) return this.playerRoles;
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:GNormalModePlayerEnum):GRoleDefault{
if(!this.isAllowAttack) return null;
let enumyOnes = GOnHookModePlayerEnum.ENEMY
//如果是ENEMY 则 它的敌人是 PLAYER
if(type == GOnHookModePlayerEnum.ENEMY) enumyOnes = GOnHookModePlayerEnum.PLAYER
//获取敌人
let roles = this.getOnesRoleAlive(enumyOnes);
//通过距离获取最近的敌人
if(roles[0]){
let len = Math.abs(Vec2.distance(player.v2World,roles[0].v2World));
let enumy = roles[0];
for (let index = 0; index < roles.length; index++) {
const role = roles[index];
let tLen;
if(tLen = Math.abs(Vec2.distance(player.v2World,role.v2World)) < len){
enumy = role;
len = tLen;
}
}
return enumy;
}else{
return null;
}
return super.getEnumy(player,type);
}
@@ -385,20 +282,13 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
}
this.onUpdatePlayerPet();
// this.enemyInfo.roles.forEach((info,index) => this.onGenRole(GOnHookModePlayerEnum.ENEMY,index + 1,info));
// this.enemyInfo.roles.forEach((info,index) => this.onGenRole(GNormalModePlayerEnum.ENEMY,index + 1,info));
}
//角色死亡回调
onRoleKillBack(role:GRoleDefault){
//死亡销毁
JNFrameTime.getInstance().setTimeout(() => {
if(role.isValid)
role.node.destroy()
else console.log(role,"无法销毁");
},3000)
//清理
this.onClearCache();
super.onRoleKillBack(role);
//如果死亡的是野怪则通知野怪死亡
if(role.getComponent(GRoleOnHookCreepsExpand)){
@@ -420,22 +310,6 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
}
//角色受击回调
onHitBack(role:GRoleDefault,hit:number){
if(!role.get()) return;
//添加受击显示
app.event.emit(GModeEvent.HIT,{
mode:this,
role:role,
hit:hit,
world:role.v2World,
camera:this.camera,
});
}
//清理缓存
onClearCache(){
@@ -458,7 +332,7 @@ export default class GOnHookMode extends GDefaultMode<{},{}>{
//是否有怪物
isHaveEnemy(){
if(!this.isAllowAttack) return [];
return this.getOnesRoleAlive(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length > 0;
return this.getOnesRoleAlive(GNormalModePlayerEnum.ENEMY).filter(role => !!role.get()).length > 0;
}
//前往下一个目标

View File

@@ -1,5 +1,6 @@
import GFSMBase, { GFSMProcessEnum, GFSMProcessInfo, GFSMProcessMode } from "../../base/fsm/GFSMBase";
import GOnHookMode, { GOnHookModePlayerEnum } from "../GOnHookMode";
import GOnHookMode from "../GOnHookMode";
import { GNormalModePlayerEnum } from "../default/GNormalModeBase";
//流程枚举
enum ProcessEnum {
@@ -88,7 +89,7 @@ export default class GFSMOnHookMode extends GFSMBase{
onLeaveFightProcess(){
//判断玩家是否前往到战斗位置
let roles = this.mode.getOnesRoleAlive(GOnHookModePlayerEnum.PLAYER);
let roles = this.mode.getOnesRoleAlive(GNormalModePlayerEnum.PLAYER);
if(roles.length == 0) return GFSMProcessEnum.Reset;
for (let index = 0; index < roles.length; index++) {

View File

@@ -1,22 +1,96 @@
import { Vec2 } from "cc";
import { TB } from "../../../config/data/schema";
import GRoleDefault from "../../base/role/GRoleDefault";
import { GTactical } from "../../entity/GTactical";
import GDefaultMode from "./GDefaultMode";
import { instantiate } from "cc";
import { _decorator } from "cc";
import { Prefab } from "cc";
import JNFrameTime from "../../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime";
import { v3 } from "cc";
import { GModeEvent } from "../GMode";
import { app } from "../../../App";
const { ccclass, property } = _decorator;
//角色
export enum GNormalModeEnum{
export enum GNormalModePlayerEnum{
PLAYER, //玩家
ENEMY, //怪物
}
export default class GNormalModeBase extends GDefaultMode<{},{}>{
export interface GNormalModePlayerInfo{
//阵法
tactical: GTactical;
}
export default class GNormalModeBase<T,DT> extends GDefaultMode<T,DT>{
@property(Prefab)
playerPrefab: Prefab = null;
@property(Prefab)
enemyPrefab: Prefab = null;
//玩家宠物
playerRoles: GRoleDefault[] = [];
//敌方宠物
enemyRoles: GRoleDefault[] = [];
//玩家信息
playerInfo:GNormalModePlayerInfo;
//宠物信息
enemyInfo:GNormalModePlayerInfo;
//玩家宠物位置
playerPos: Vec2 = new Vec2(-400,0);
//怪物位置
enemyPos: Vec2 = new Vec2(400,0);
//是否结束游戏
_isEndGame:boolean = false;
get isEndGame(){return this._isEndGame;}
set isEndGame(value){this._isEndGame = value}
onSyncInitSuccess(){
this.playerInfo = { tactical: GTactical.getTactical().setOffset(this.playerPos) };
this.enemyInfo = { tactical: GTactical.getTactical(true).setOffset(this.enemyPos) };
//调整相机
this.camera.enabled = true;
let camreaPos = this.camera.node.worldPosition;
this.camera.node.worldPosition = v3(0,750,camreaPos.z)
}
//获取配置
getInfo(type: GNormalModePlayerEnum): GNormalModePlayerInfo {
if(type == GNormalModePlayerEnum.PLAYER) return this.playerInfo;
if(type == GNormalModePlayerEnum.ENEMY) return this.enemyInfo;
}
//获取阵营宠物
getOnesRole(type: GNormalModePlayerEnum):GRoleDefault[]{
if(type == GNormalModePlayerEnum.PLAYER) return this.playerRoles;
if(type == GNormalModePlayerEnum.ENEMY) return this.enemyRoles;
}
//获取存活的宠物
getOnesRoleAlive(type: GNormalModePlayerEnum):GRoleDefault[]{
if(type == GNormalModePlayerEnum.PLAYER) return this.playerRoles.filter(role => !!role.get());
if(type == GNormalModePlayerEnum.ENEMY) return this.enemyRoles.filter(role => !!role.get());
}
//生成宠物
onGenRole(type: GNormalModeEnum,index:number,info:TB.TbGRole):GRoleDefault {
onGenRole(type: GNormalModePlayerEnum,index:number,info:TB.TbGRole):GRoleDefault {
let tactical = this.getInfo(type).tactical;
let pos:Vec2 = this.getInfo(type).tactical.getPosition(index);
if(!pos) return;
let role = instantiate(this.rolePrefab);
let role;
if(type == GNormalModePlayerEnum.PLAYER)
role = instantiate(this.playerPrefab);
if(type == GNormalModePlayerEnum.ENEMY)
role = instantiate(this.enemyPrefab);
let entity = role.getComponent(GRoleDefault);
//初始化
@@ -40,5 +114,102 @@ export default class GNormalModeBase extends GDefaultMode<{},{}>{
}
//获取敌人
getEnumy(player:GRoleDefault,type:GNormalModePlayerEnum):GRoleDefault{
let enumyOnes = GNormalModePlayerEnum.ENEMY
//如果是ENEMY 则 它的敌人是 PLAYER
if(type == GNormalModePlayerEnum.ENEMY) enumyOnes = GNormalModePlayerEnum.PLAYER
//获取敌人
let roles = this.getOnesRoleAlive(enumyOnes);
//通过距离获取最近的敌人
if(roles[0]){
let len = Math.abs(Vec2.distance(player.v2World,roles[0].v2World));
let enumy = roles[0];
for (let index = 0; index < roles.length; index++) {
const role = roles[index];
let tLen;
if(tLen = Math.abs(Vec2.distance(player.v2World,role.v2World)) < len){
enumy = role;
len = tLen;
}
}
return enumy;
}else{
return null;
}
}
//清理缓存
onClearCache(){
//清理宠物
let roles = [...this.playerRoles];
roles.forEach(role => {
if(!role.get()){
this.playerRoles.splice(this.playerRoles.indexOf(role),1);
}
})
roles = [...this.enemyRoles];
roles.forEach(role => {
if(!role.get()){
this.enemyRoles.splice(this.enemyRoles.indexOf(role),1);
}
})
}
//角色死亡回调
onRoleKillBack(role:GRoleDefault){
//死亡销毁
JNFrameTime.getInstance().setTimeout(() => {
if(role.isValid)
role.node.destroy()
else console.log(role,"无法销毁");
},3000)
//清理
this.onClearCache();
//如果任何一方死亡则调用结束
if(!this.isEndGame){
if(this.playerRoles.length == 0){
this.isEndGame = true;
return this.onBattleEnd(GNormalModePlayerEnum.ENEMY)
}
if(this.enemyRoles.length == 0){
this.isEndGame = true;
return this.onBattleEnd(GNormalModePlayerEnum.PLAYER)
}
}
}
//战斗结束(胜利队伍)
onBattleEnd(win:GNormalModePlayerEnum){}
//角色受击回调
onHitBack(role:GRoleDefault,hit:number){
if(!role.get()) return;
//添加受击显示
app.event.emit(GModeEvent.HIT,{
mode:this,
role:role,
hit:hit,
world:role.v2World,
camera:this.camera,
});
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "596564e1-2c26-46ce-aaa9-d4276bf9a702",
"files": [],
"subMetas": {},
"userData": {}
}