213 lines
7.3 KiB
TypeScript
Raw Normal View History

2023-10-26 03:06:44 +08:00
import { resources } from "cc";
2023-10-23 18:56:01 +08:00
import { BehaviorManager } from "../../extensions/Behavior Creator/runtime/main";
2023-10-26 03:06:44 +08:00
import SystemBase from "../../extensions/ngame/assets/ngame/system/SystemBase";
2023-10-23 18:56:01 +08:00
import JNSocket from "../../extensions/ngame/assets/ngame/network/JNSocket";
import { JNSyncAction } from "../../extensions/ngame/assets/ngame/sync/JNSyncAction";
import { JNSyncMessage } from "../../extensions/ngame/assets/ngame/sync/JNSyncMessage";
import JNSyncFrame, { JNFrameInfo, JNFrameInfos, JNFrameInputs } from "../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame";
import JNSyncFrameComponent from "../../extensions/ngame/assets/ngame/sync/frame/game/JNSyncFrameComponent";
import JNSyncFrameProtoComponent from "../../extensions/ngame/assets/ngame/sync/frame/game/JNSyncFrameProtoComponent";
import JNLayer, { JNLayerAnim, JNLayerInfo } from "../../extensions/ngame/assets/ngame/ui/JNLayer";
import JNLayerBase from "../../extensions/ngame/assets/ngame/ui/base/JNLayerBase";
import { EventDispatcher } from "../../extensions/ngame/assets/ngame/util/EventDispatcher";
2023-10-26 03:06:44 +08:00
import { JsonLoad, JsonUtil } from "../../extensions/ngame/assets/ngame/util/JsonUtil";
2023-10-23 18:56:01 +08:00
import NGameMessage from "../../extensions/ngame/assets/ngame/util/NGameMessage";
import axios from "../../extensions/ngame/assets/plugins/axios.js";
import GBattleModeManager from "./battle/GBattleModeManager";
import { GLayer, UIConfig } from "./ui/UIConfig";
2023-10-26 03:06:44 +08:00
import JLoaderSystem from "../../extensions/ngame/assets/ngame/system/JLoaderSystem";
import { TableGRole } from "../resources/config/ts/TableGRole";
import { sp } from "cc";
2023-10-27 02:38:08 +08:00
import { TableGRoleAttack } from "../resources/config/ts/TableGRoleAttack";
import { SpriteFrame } from "cc";
import { TableGRoleAttackBullet } from "../resources/config/ts/TableGRoleAttackBullet";
2023-10-30 02:34:11 +08:00
import { TableGRoleAttackEffect } from "../resources/config/ts/TableGRoleAttackEffect";
import { TableGRoleSkill } from "../resources/config/ts/TableGRoleSkill";
import { TableGRoleSkillEffect } from "../resources/config/ts/TableGRoleSkillEffect";
2023-11-03 02:57:38 +08:00
import { TableGMap } from "../resources/config/ts/TableGMap";
2023-10-23 18:56:01 +08:00
2023-10-31 02:34:12 +08:00
let IP = "kyu.jisol.cn";
2023-10-23 18:56:01 +08:00
//重写UI
class JNGLayer extends JNLayer{
layers: string[] = [GLayer.View];
views: { [key: string]: JNLayerInfo; } = UIConfig;
}
//重写Socket
class JNGSocket extends JNSocket{
public url() {
2023-10-27 19:17:47 +08:00
return `ws://${IP}:8080/websocket`;
2023-10-23 18:56:01 +08:00
}
}
// 重写帧同步
class JNGSyncFrame extends JNSyncFrame{
protected onResetValue(){
//重置状态机
BehaviorManager.deleteInstance();
super.onResetValue();
}
async onServerData(start?:number,end?:number): Promise<JNFrameInfos> {
return app.proto
.getType(JNSyncMessage.JNFrameInfos)
.decode(
new Uint8Array(
(await app.api.get("/sync/frame",{
responseType:'arraybuffer',
params:{
start,
end
}
})).data
)
) as any;
}
onSendInput(message: JNFrameInputs) {
app.socket.Send(JNSyncAction.NSyncFrameInput,message,JNSyncMessage.JNFrameInputs);
}
}
//重写UI Base
export class JNGLayerBase extends JNLayerBase{
public close():void {
console.log("close");
app.layer.CloseNode(this.node);
}
}
//重写Sync Base
export class JNGSyncBase<T> extends JNSyncFrameComponent<T>{
2023-10-24 19:12:25 +08:00
onSyncLoad() { }
2023-10-23 18:56:01 +08:00
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: T) { }
protected getSync(): JNSyncFrame {
return app.sync
}
}
//重写Sync Proto Base
export abstract class JNGSyncProtoBase<T> extends JNSyncFrameProtoComponent<T>{
2023-10-24 19:12:25 +08:00
onSyncLoad() { }
2023-10-23 18:56:01 +08:00
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: T) { }
protected getSync(): JNSyncFrame {
return app.sync
}
}
2023-10-26 03:06:44 +08:00
//读写config
export class JNGConfig extends SystemBase{
//配置JSON加载
jsons:JsonLoad[] = [
2023-10-27 02:38:08 +08:00
{name:TableGRole.TableName}, //角色
{name:TableGRoleAttack.TableName}, //角色攻击
{name:TableGRoleAttackBullet.TableName}, //角色攻击子弹
2023-10-30 02:34:11 +08:00
{name:TableGRoleAttackEffect.TableName}, //角色攻击特效
{name:TableGRoleSkill.TableName}, //角色技能
{name:TableGRoleSkillEffect.TableName}, //角色技能特效
2023-11-03 02:57:38 +08:00
{name:TableGMap.TableName}, //游戏地图
2023-10-26 03:06:44 +08:00
].map((table) => {
return {
name:table.name,
bundle:"resources",
path:"config/game/"
}
});
async onInit(): Promise<any> {
for (const key in this.jsons) {
const load = this.jsons[key];
await JsonUtil.load(load);
}
}
}
//角色初始器
export class JLoaderRole extends JLoaderSystem{
2023-11-03 02:57:38 +08:00
skData:{[id:number]:sp.SkeletonData} = {}; //角色Spine
2023-10-27 02:38:08 +08:00
bullets:{[id:number]:SpriteFrame} = {};
2023-11-03 02:57:38 +08:00
effects:{[id:number]:sp.SkeletonData} = {}; //Spine特效
maps:{[id:number]:SpriteFrame[]} = {}; //地图
2023-10-30 02:34:11 +08:00
2023-10-26 03:06:44 +08:00
async onInit(): Promise<any> {
await super.onInit();
2023-10-30 02:34:11 +08:00
2023-10-26 03:06:44 +08:00
//将配置表的角色都读取出来
for (const info of Object.values(TableGRole.getAllConfig())) {
this.skData[info.id] = await (new Promise(r => {
this.bundle.load(info.spine,sp.SkeletonData,(err,data) => {
r(data);
})
}))
}
2023-10-30 02:34:11 +08:00
2023-10-27 02:38:08 +08:00
//将所有子弹读取出来
for (const info of Object.values(TableGRoleAttackBullet.getAllConfig())) {
this.bullets[info.id] = await (new Promise(r => {
this.bundle.load(info.bulletSrc,SpriteFrame,(err,data) => {
r(data);
})
}))
}
2023-10-30 02:34:11 +08:00
//攻击特效读取
for (const info of Object.values(TableGRoleAttackEffect.getAllConfig())) {
this.effects[info.id] = await (new Promise(r => {
this.bundle.load(info.spine,sp.SkeletonData,(err,data) => {
r(data);
})
}))
}
//技能特效读取
for (const info of Object.values(TableGRoleSkillEffect.getAllConfig())) {
this.effects[info.id] = await (new Promise(r => {
this.bundle.load(info.spine,sp.SkeletonData,(err,data) => {
r(data);
})
}))
}
2023-11-03 02:57:38 +08:00
//读取地图
for (const info of Object.values(TableGMap.getAllConfig())) {
this.maps[info.id] = await (Promise.all(["1","2","3"].map(index => `map${index}`).map(key => {
return new Promise<SpriteFrame>(r => {
if(info[key]){
this.bundle.load(info[key],SpriteFrame,(err,data) => {
r(data);
})
}
})
})))
}
2023-10-27 02:38:08 +08:00
2023-10-26 03:06:44 +08:00
}
}
2023-10-23 18:56:01 +08:00
export const app = {
layer : new JNGLayer(), //UI
socket : new JNGSocket(), //Socket
sync : new JNGSyncFrame(), //同步
event : EventDispatcher.getIns(), //通知
proto : NGameMessage.getIns(), //消息
api : axios.create({
2023-10-27 19:17:47 +08:00
baseURL: `http://${IP}:8080`,
2023-10-23 18:56:01 +08:00
}), //请求
battle : GBattleModeManager.getIns(), //战斗
2023-10-26 03:06:44 +08:00
config : new JNGConfig(),
2023-11-03 02:57:38 +08:00
battleRes : new JLoaderRole("battle"), //battle包
2023-10-23 18:56:01 +08:00
}