mirror of
https://gitee.com/dgflash/oops-plugin-framework.git
synced 2026-09-07 04:07:19 +08:00
新增与优化核心模块 🎯 GUI 交互增强 ButtonInterceptor:按钮点击事件劫持器 劫持 EventHandler.emitEvents / ButtonSimple.onClick 核心方法 支持多类型按钮音效配置注册,按按钮类型自动匹配音效 单例模式管理,支持全局动态激活 / 停用拦截功能 🧩 对象池管理系统 GameNodePool:通用游戏节点对象池管理器 基于预制体(Prefab)UUID 实现池化隔离管理 支持特效、UI 元素等高频对象预加载、复用与回收 全局单例访问,统一管控对象创建 / 销毁逻辑 🔊 音频管理系统 AudioManager:音频核心管理器 独立背景音乐(AudioMusic)+ 音效池(AudioEffectPool)双模块 支持全局音量控制、播放状态恢复与场景切换管理 AudioEffect:基础音效播放器 AudioEnum:音频类型、音效分类枚举定义 📦 资源加载系统 ResLoader:资源加载核心控制器 资源包(Bundle)统一管理 + 并发加载限流控制 远程资源本地缓存、自动释放与内存优化 完整加载进度回调 + 错误异常处理机制 ResTypes:资源类型规范定义 ResErrors:资源加载错误码与异常处理 ResUtils:资源路径、格式转换等工具方法 🧱 模块化组件系统 GameComponent:游戏显示对象组件基类 集成资源自动引用计数(RC)管理 模块化部件(GamePartRegistry)插拔式架构 内置音频、按钮、事件、键盘、节点、对象池、资源七大部件 部件封装: GamePartAudio:音频功能部件 GamePartButton:按钮交互部件 GamePartEvent:全局事件部件 GamePartKeyboard:键盘输入部件 GamePartNode:节点操作部件 GamePartNodePool:对象池调用部件 GamePartRes:资源加载部件 📝 类型定义完善 新增 IAudio 音频数据与播放参数接口 统一全模块 TS 类型定义与导出规范 优化接口注释与类型约束,提升开发体验
312 lines
8.7 KiB
TypeScript
312 lines
8.7 KiB
TypeScript
import { error, warn } from 'cc';
|
||
|
||
/**
|
||
* 使用流程文档可参考、简化与服务器对接、使用新版API体验,可进入下面地址获取新版本,替换network目录中的内容
|
||
* https://store.cocos.com/app/detail/5877
|
||
*/
|
||
|
||
/** 当前请求地址集合 */
|
||
const urls: any = {};
|
||
/** 请求参数 */
|
||
const reqparams: any = {};
|
||
|
||
type HttpCallback = (ret: HttpReturn) => void;
|
||
|
||
/** 请求事件 */
|
||
export enum HttpEvent {
|
||
/** 断网 */
|
||
NO_NETWORK = 'http_request_no_network',
|
||
/** 未知错误 */
|
||
UNKNOWN_ERROR = 'http_request_unknown_error',
|
||
/** 请求超时 */
|
||
TIMEOUT = 'http_request_timout'
|
||
}
|
||
|
||
/**
|
||
* HTTP请求返回值
|
||
*/
|
||
export class HttpReturn {
|
||
/** 是否请求成功 */
|
||
isSucc = false;
|
||
/** 请求返回数据 */
|
||
res?: any;
|
||
/** 请求错误数据 */
|
||
err?: any;
|
||
}
|
||
|
||
/** HTTP请求 */
|
||
export class HttpRequest {
|
||
/** 服务器地址 */
|
||
server = 'http://127.0.0.1/';
|
||
/** 请求超时时间 */
|
||
timeout = 10000;
|
||
/** 自定义请求头信息 */
|
||
private header: Map<string, string> = new Map<string, string>();
|
||
|
||
/**
|
||
* 添加自定义请求头信息
|
||
* @param name 信息名
|
||
* @param value 信息值
|
||
*/
|
||
addHeader(name: string, value: string) {
|
||
this.header.set(name, value);
|
||
}
|
||
|
||
/**
|
||
* HTTP GET请求
|
||
* @param name 协议名
|
||
* @param onComplete 请求完整回调方法
|
||
* @param params 查询参数
|
||
* @example
|
||
var param = '{"uid":12345}'
|
||
var complete = (ret: HttpReturn) => {
|
||
console.log(ret.res);
|
||
}
|
||
oops.http.getWithParams(name, complete, param);
|
||
*/
|
||
get(name: string, onComplete: HttpCallback, params: any = null) {
|
||
this.sendRequest(name, params, false, onComplete);
|
||
}
|
||
|
||
/**
|
||
* HTTP GET请求
|
||
* @param name 协议名
|
||
* @param params 查询参数
|
||
* @example
|
||
var txt = await oops.http.getAsync(name);
|
||
if (txt.isSucc) {
|
||
console.log(txt.res);
|
||
}
|
||
*/
|
||
getAsync(name: string, params: any = null): Promise<HttpReturn> {
|
||
return new Promise((resolve, reject) => {
|
||
this.sendRequest(name, params, false, (ret: HttpReturn) => {
|
||
resolve(ret);
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* HTTP GET请求非文本格式数据
|
||
* @param name 协议名
|
||
* @param onComplete 请求完整回调方法
|
||
* @param params 查询参数
|
||
*/
|
||
getByArraybuffer(name: string, onComplete: HttpCallback, params: any = null) {
|
||
this.sendRequest(name, params, false, onComplete, 'arraybuffer', false);
|
||
}
|
||
|
||
/**
|
||
* HTTP GET请求非文本格式数据
|
||
* @param name 协议名
|
||
* @param params 查询参数
|
||
* @returns Promise<any>
|
||
*/
|
||
getAsyncByArraybuffer(name: string, params: any = null): Promise<HttpReturn> {
|
||
return new Promise((resolve, reject) => {
|
||
this.sendRequest(name, params, false, (ret: HttpReturn) => {
|
||
resolve(ret);
|
||
}, 'arraybuffer', false);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* HTTP POST请求
|
||
* @param name 协议名
|
||
* @param params 查询参数
|
||
* @param onComplete 请求完整回调方法
|
||
* @example
|
||
var param = '{"LoginCode":"donggang_dev","Password":"e10adc3949ba59abbe56e057f20f883e"}'
|
||
var complete = (ret: HttpReturn) => {
|
||
console.log(ret.res);
|
||
}
|
||
oops.http.post(name, complete, param);
|
||
*/
|
||
post(name: string, onComplete: HttpCallback, params: any = null) {
|
||
this.sendRequest(name, params, true, onComplete);
|
||
}
|
||
|
||
/**
|
||
* HTTP POST请求
|
||
* @param name 协议名
|
||
* @param params 查询参数
|
||
*/
|
||
postAsync(name: string, params: any = null): Promise<HttpReturn> {
|
||
return new Promise((resolve, reject) => {
|
||
this.sendRequest(name, params, true, (ret: HttpReturn) => {
|
||
resolve(ret);
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 取消请求中的请求
|
||
* @param name 协议名
|
||
*/
|
||
abort(name: string) {
|
||
const xhr = urls[this.server + name];
|
||
if (xhr) {
|
||
xhr.abort();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获得字符串形式的参数
|
||
* @param params 参数对象
|
||
* @returns 参数字符串
|
||
*/
|
||
private getParamString(params: any) {
|
||
let result = '';
|
||
for (const name in params) {
|
||
const data = params[name];
|
||
if (data instanceof Object) {
|
||
for (const key in data)
|
||
result += `${key}=${data[key]}&`;
|
||
}
|
||
else {
|
||
result += `${name}=${data}&`;
|
||
}
|
||
}
|
||
return result.substring(0, result.length - 1);
|
||
}
|
||
|
||
/**
|
||
* Http请求
|
||
* @param name(string) 请求地址
|
||
* @param params(JSON) 请求参数
|
||
* @param isPost(boolen) 是否为POST方式
|
||
* @param callback(function) 请求成功回调
|
||
* @param responseType(string) 响应类型
|
||
* @param isOpenTimeout(boolean) 是否触发请求超时错误
|
||
*/
|
||
private sendRequest(name: string,
|
||
params: any,
|
||
isPost: boolean,
|
||
onComplete: HttpCallback,
|
||
responseType?: string,
|
||
isOpenTimeout = true) {
|
||
if (name == null || name == '') {
|
||
error('请求地址不能为空');
|
||
return;
|
||
}
|
||
|
||
let url: string, newUrl: string, paramsStr = '';
|
||
if (name.toLocaleLowerCase().indexOf('http') == 0) {
|
||
url = name;
|
||
}
|
||
else {
|
||
url = this.server + name;
|
||
}
|
||
|
||
if (params) {
|
||
paramsStr = this.getParamString(params);
|
||
if (url.indexOf('?') > -1)
|
||
newUrl = url + '&' + paramsStr;
|
||
else
|
||
newUrl = url + '?' + paramsStr;
|
||
}
|
||
else {
|
||
newUrl = url;
|
||
}
|
||
|
||
if (urls[newUrl] != null && reqparams[newUrl] == paramsStr) {
|
||
warn(`地址【${url}】已正在请求中,不能重复请求`);
|
||
return;
|
||
}
|
||
|
||
const xhr = new XMLHttpRequest();
|
||
|
||
// 防重复请求功能
|
||
urls[newUrl] = xhr;
|
||
reqparams[newUrl] = paramsStr;
|
||
|
||
if (isPost) {
|
||
xhr.open('POST', url);
|
||
}
|
||
else {
|
||
xhr.open('GET', newUrl);
|
||
}
|
||
|
||
// 添加自定义请求头信息
|
||
for (const [key, value] of this.header) {
|
||
xhr.setRequestHeader(key, value);
|
||
}
|
||
// xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
|
||
// xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
|
||
|
||
const data: any = {};
|
||
data.url = url;
|
||
data.params = params;
|
||
|
||
// 请求超时
|
||
if (isOpenTimeout) {
|
||
xhr.timeout = this.timeout;
|
||
xhr.ontimeout = () => {
|
||
this.deleteCache(newUrl);
|
||
|
||
ret.isSucc = false;
|
||
ret.err = HttpEvent.TIMEOUT; // 超时
|
||
onComplete(data);
|
||
};
|
||
}
|
||
|
||
// 响应结果
|
||
var ret: HttpReturn = new HttpReturn();
|
||
|
||
xhr.onloadend = () => {
|
||
if (xhr.status == 500) {
|
||
this.deleteCache(newUrl);
|
||
|
||
ret.isSucc = false;
|
||
ret.err = HttpEvent.NO_NETWORK; // 断网
|
||
onComplete(ret);
|
||
}
|
||
};
|
||
|
||
xhr.onerror = () => {
|
||
this.deleteCache(newUrl);
|
||
|
||
ret.isSucc = false;
|
||
if (xhr.readyState == 0 || xhr.readyState == 1 || xhr.status == 0) {
|
||
ret.err = HttpEvent.NO_NETWORK; // 断网
|
||
}
|
||
else {
|
||
ret.err = HttpEvent.UNKNOWN_ERROR; // 未知错误
|
||
}
|
||
|
||
onComplete(ret);
|
||
};
|
||
|
||
xhr.onreadystatechange = () => {
|
||
if (xhr.readyState != 4) return;
|
||
|
||
this.deleteCache(newUrl);
|
||
|
||
if (xhr.status == 200 && onComplete) {
|
||
ret.isSucc = true;
|
||
if (responseType == 'arraybuffer') {
|
||
xhr.responseType = responseType; // 加载非文本格式
|
||
ret.res = xhr.response;
|
||
}
|
||
else {
|
||
ret.res = JSON.parse(xhr.response);
|
||
}
|
||
onComplete(ret);
|
||
}
|
||
};
|
||
|
||
// 发送请求
|
||
if (params == null || params == '') {
|
||
xhr.send();
|
||
}
|
||
else {
|
||
xhr.send(paramsStr);
|
||
}
|
||
}
|
||
|
||
private deleteCache(url: string) {
|
||
delete urls[url];
|
||
delete reqparams[url];
|
||
}
|
||
}
|