oops-framework框架 之 资源管理(四)

引擎: CocosCreator 3.8.0

环境: Mac

Gitee: oops-game-kit

注: 作者dgflashoops-framework框架QQ群: 628575875


简介


在CocosCreator中,资源可以分为两大类:

  1. 静态引用资源
  2. 动态引用资源,包含动态加载和远程下载

放置在 assets 目录下的所有资源,均继承于Asset,而这些资源的动态加载主要是通过 Bundle

Bundle 存在多个,主要有两类:

  • 内置Bundle, 主要是resources、start-scene、main等
  • 自定义Bundle, 由开发者设定文件夹自定义的,用于对资源进行更好的管理和使用

Bundle 的使用主要通过CocosCreator引擎封装的AssetManager进行资源的远程下载、加载和释放等。

更多关于CocosCreator资源管理的详情可参考博客:

CocosCreator 之 resources动态加载

CocosCreator 之 Bundle的使用

CocosCreator 之 AssetManager资源管理和释放

了解这些,对了解dgflash作者分享的oops-framework框架下的资源管理是有帮助的。


ResLoader

oops-framework 中的资源管理主要被 ResLoader管理,用于管理各种不同类型资源的加载和释放。

Oops.ts中的定义如下:

// ../oops-plugin-framework/assets/core/Oop.ts
export class oops {/** 资源管理 */static res = new ResLoader();
}

使用的简单方式是:

let url = `game/textures/image/spriteFrame`;
oops.res.load(url, SpriteFrame, (err, spriteframe) => {if (err) {return console.error("load spriteframe failed:" + err.message);}this._blockSprite.spriteFrame = spriteframe;
});

这种方式同resources.load的方式很是相像。在框架中使用ResLoader对于资源的管理特点是:

  • 加载默认 resources 文件夹中资源
  • 加载默认 bundle 远程资源
  • 主动传递 bundle 名时,优先加载传递 bundle 名资源包中的资源

主要接口有:

参数或接口说明
defaultBundleName全局默认加载的资源包名,默认resources
load()加载单一任意类型资源
loadAsync()异步加载单一任意类型资源
loadDir()加载文件夹中资源
loadRemote()加载远程资源
loadBundle()加载资源包
get()根据路径,资源类型获取资源
dump()打印缓存中所有资源信息
release()通过相对路径释放资源
releaseDir()通过文件夹路径释放所有文件夹中资源

在项目启动InitRes.ts中加载必备资源或可选资源时,就能够看到资源管理的使用。

// 加载远程资源,使用loadBundle进行加载
private loadBundle(queue: AsyncQueue) {queue.push(async (next: NextFunction, params: any, args: any) => {// 设置默认加载的外部资源包名oops.res.defaultBundleName = oops.config.game.bundleName;if (oops.config.game.bundleEnable) {await oops.res.loadBundle(oops.config.game.bundleServer, oops.config.game.bundleVersion);}else {await oops.res.loadBundle(oops.config.game.bundleName);}next();});
}// 加载自定义内容 使用load进行单一资源加载
private loadCustom(queue: AsyncQueue) {queue.push(async (next: NextFunction, params: any, args: any) => {// 加载多语言对应字体oops.res.load("language/font/" + oops.language.current, next);});
}// 加载公共资源, 使用loadDir进行目录加载
private loadCommon(queue: AsyncQueue) {queue.push((next: NextFunction, params: any, args: any) => {oops.res.loadDir("common", next);});
}

示例


图片动态加载、图片远程加载、Spine动态加载的示例:

export class UIResLoadLayer extends Component {@property(Sprite) sprite: Sprite = null; @property(sp.Skeleton) spine: sp.Skeleton = null; // 图片动态加载public clickImgLoad() {let url = "game/texture/game1/spriteFrame"oops.res.load(url, (err, spriteframe) => {if (err) {console.log("资源加载失败", err);return;}this.sprite.spriteFrame = spriteframe;})}// 图片远程加载public clickRemoteLoad() {let url = "https://oops-1255342636.cos-website.ap-shanghai.myqcloud.com/img/bg.png";var opt = { ext: ".png" };var onComplete = (err: Error | null, data: ImageAsset) => {const spriteFrame = new SpriteFrame();const texture = new Texture2D();texture.image = data;spriteFrame.texture = texture;this.sprite.spriteFrame = spriteFrame;}oops.res.loadRemote<ImageAsset>(url, opt, onComplete);}// spine动态加载public clickSpineLoad() {let url = "game/spine/model1"oops.res.load(url, sp.SkeletonData, (err, sd: sp.SkeletonData) => {if (err) {return console.error(err.message);}this.spine.skeletonData = sd;this.spine.setAnimation(0, "AttackCritical_Arch", true);});}
}

注:在ResLoader.ts提供的接口中,有着相关的代码示例,这里就不复制粘贴了。

有一点需要注意,如果存在 Bundle ,在项目启动的时候会优先加载

// InitRes.ts
entityEnter(e: Initialize): void {var queue: AsyncQueue = new AsyncQueue();/** 加载远程资源配置 */this.loadBundle(queue);// ...queue.play();
}private loadBundle(queue: AsyncQueue) {queue.push(async (next: NextFunction, params: any, args: any) => {// 设置默认加载的外部资源包名oops.res.defaultBundleName = oops.config.game.bundleName;// 加载外部资源包// ...next();});
}

这里会默认将defaultBundleName修改为指定的BundleName, 如果需要动态加载 resources 目录中的资源,就需要设置下名字:

let bundleName = "resources";
let path = "common/texture/img/spriteFrame";
oops.res.load(bundleName, path, spriteFrame, (err, spriteFrame) => {});

感谢作者dgflash的分享,作者CSDN博客: dgflash CSDN

最后,祝大家学习和生活愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瞥一眼 FAT32,手撸文件系统

FAT 32 FAT(File Allocation Table)&#xff0c;最早在DOS v1.0 中被引入&#xff0c;是一种极简的文件系统&#xff0c;占用空间&#xff0c;是目前最常见的文件系统之一。 发展历程 FATX系列文件系统的不同版本都是针对不同的文件存储介质&#xff08;storage media&#…

Fisher信息理论与应用

一、概念介绍 Fisher信息量&#xff0c;是一次观测值所能提供的关于未知参数θ的信息量期望值的一种度量。 Fisher信息矩阵&#xff0c;是用利用最大似然函数估计来计算方差矩阵&#xff0c;表示随机变量的一个样本所能提供的关于状态参数在某种意义下的平均信息量。 Fisher…

node.js express路由和中间件

目录 路由 解释 使用方式 中间件 解释 使用方式 中间件类型 路由注册和中间件注册 代码 app全局路由接口请求以及代码解析 示例1 示例2 示例3 示例4 中间件req继承 嵌套子路由 解释 代码 示例1 路由 解释 在 Express 中&#xff0c;路由&#xff08;Route&…

【Qt开发流程】之事件系统3:键盘事件

序章 以下链接是拖放事件介绍和使用示例&#xff1a; 【Qt开发流程】之拖放操作1:介绍链接: https://blog.csdn.net/MrHHHHHH/article/details/134626484 【Qt开发流程】之拖放操作2:使用链接: https://blog.csdn.net/MrHHHHHH/article/details/134632006 以下链接是事件系统…

百度智能云推出“千帆AI原生应用开发工作台” 助力开发者创新

在这个智能互联的世界&#xff0c;每一次技术的飞跃都预示着无限可能。你是否曾梦想&#xff0c;一款产品能够打破创新的边界&#xff0c;让开发不再是高门槛的技术挑战&#xff1f;12月20日&#xff0c;百度云智大会智算大会将为你揭开这幕神秘面纱——“千帆AI原生应用开发工…

orvibo旗下的VS30ZW网关分析之一

概述 从官网的APP支持的智能中枢来看,一共就两种大类: MixPad系列和网关系列 排除MixPad带屏网关外,剩余的设备如下图: 目前在市场上这四种网关已经下市,官方已经宣布停产。所以市场上流通的也几乎绝迹。 从闲鱼市场上可以淘到几个,拿来分析一下,这里我手头有如下的两…

配置typroa上传图片到gitee

在typora这个位置下载插件 在picgo.exe文件夹下输入cmd 打开命令行输入如下命令安装相关插件 .\picgo install gitee-uploader .\picgo install super-prefix 之后按照官方文档更改相关配置 官方文档参考 https://picgo.github.io/PicGo-Core-Doc 博客参考&#xff1a;…

抑郁症中西医治疗对比?

抑郁症是一种常见的心理障碍&#xff0c;治疗方法包括中医和西医两种。下面就抑郁症中西医治疗进行对比&#xff1a; 治疗方法&#xff1a;中医治疗抑郁症强调整体观念和辨证论治&#xff0c;通过调理身体各部分的功能&#xff0c;达到治疗抑郁症的目的。中医治疗抑郁症多采用天…

矩阵的条件数及病态方程组的处理

对 A x b Axb Axb,如果A或者b有轻微的变动,会使得求解出的 x x x发生巨变,这种矩阵就是病态的 A x b Axb Axb 真实情况 A ( Δ x x ) Δ b b A(\Delta xx)\Delta bb A(Δxx)Δbb 代入误差的扰动情况 Δ x A − 1 Δ b \Delta xA^{-1}\Delta b ΔxA−1Δb 取范数后有 ∣…

人体姿态估计算法

人体姿态估计算法 1 什么是人体姿态估计2 基于经典传统和基于深度学习的方法2.1 基于经典传统的人体姿态估计算法2.2 基于深度学习的人体姿态估计算法OpenPoseAlphaPose (RMPE) 3 算法应用4 Paper 人体姿态估计在现实中的应用场景很丰富&#xff0c;如下 动作捕捉&#xff1a;三…

Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

之前经常使用Spannable 这次主要在String.xml使用&#xff1a;<![CDATA[和]]> 效果&#xff1a; <resources><string name"str_bianse"><![CDATA[变色 <font color"#ff0000">曲项向天歌</font> 白毛浮绿水]]></st…

idea新建spring boot starter

什么是spring boot starter Spring Boot Starter 是一种 Maven 或 Gradle 依赖&#xff0c;它能够轻松地将相关库和框架集成到 Spring Boot 应用程序中。Starter 是一种对常见依赖项和设置的易于复用的封装&#xff0c;它们通常被开发人员用于创建可插拔的 Spring Boot 应用程序…

信息学奥赛一本通1190:上台阶

1190&#xff1a;上台阶 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 69016 通过数: 23589 【题目描述】 楼梯有n(0<n<71)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶&#xff0c;编程计算共有多少种不同的走法。 【输入】 输入的每一行…

SCAU:各位数字

各位数字 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 从键盘输入一个3位数的正整数&#xff0c;要求先后输出该数的百位数字与个位数字&#xff0c;各占一行输入格式 一个三位整数输出格式 输出该数的百位数字与个位数字输入样例 123输出…

报考公务员简历(精选8篇)

想要成功进入公务员队伍&#xff0c;一份出色的个人简历是必不可少的。本文为大家精选了8篇报考公务员的个人简历案例&#xff0c;无论是应届毕业生还是有工作经验的求职者&#xff0c;都能从中汲取灵感&#xff0c;提升简历质量。找到心仪的公务员岗位。 报考公务员简历模板下…

迭代器模式-C++实现

题外话&#xff1a; 设计模式是在1994年提出的&#xff0c;当时还没有C的STL库和泛型编程&#xff0c;所以人们为了提供一种有效的方法来访问一个聚合对象&#xff08;例如列表、集合、数组等&#xff09;中的元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;于是想到了…

Pandas在Excel同一个sheet里插入多个Dataframe和行

Pandas默认的to_excel是直接把完成的Datafrme写入一个sheet里,这并不能满足我们在一个sheet里插入多个Dataframe或多行的需求。为了实现插入多行或多Dataframe的目的,我们需要新建一个ExcelWriter对象,然后依次插入数据。 这里我们以插入2个Dataframe和三行单元格为例。 新…

大华技术GIS开发工程师24届秋招三场面试Offer面经

本文介绍2024届秋招中&#xff0c;大华技术股份有限公司的GIS开发工程师岗位的3场面试基本情况、提问问题等。 10月投递了大华技术股份有限公司的GIS开发工程师岗位&#xff0c;所在部门为研发中心。目前完成了一面、二面与三面等全部流程&#xff0c;并有幸获得Offer&#xff…

vite脚手架,手写实现配置动态生成路由

参考文档 vite的glob-import vue路由配置基本都是重复的代码&#xff0c;每次都写一遍挺难受&#xff0c;加个页面就带配置下路由 那就利用 vite 的 文件系统处理啊 先看实现效果 1. 考虑怎么约定路由&#xff0c;即一个文件夹下&#xff0c;又有组件&#xff0c;又有页面&am…

[数据结构]HashSet与LinkedHashSet的底层原理学习心得

我们区分list和set集合的标准是三个&#xff1a;有无顺序&#xff0c;可否重复&#xff0c;有无索引。 list的答案是&#xff1a;有顺序&#xff0c;可重复&#xff0c;有索引。这也就是ArrayList和LinkedList的共性 set的答案是&#xff1a;顺序内部再区分,不可以重复&#xf…