oops-framework框架 之 创建项目(二)

news2024/12/23 20:04:36

引擎: CocosCreator 3.8.0

环境: Mac

Gitee: oops-game-kit


构建


本篇博客将使用oops-game-kit 构建一个新的开发项目, 关于 oops-framework 框架的了解,可参考上篇博客:

oops-framework框架 之 初始了解(一)

大概步骤:

  1. 使用Git命令克隆项目:
git clone https://gitee.com/dgflash/oops-game-kit
  1. 项目克隆成功后,进入项目目录: oops-game-kit ,根据平台执行命令:
// window
执行 update-oops-plugin-framework.bat 克隆与更新框架插件
执行 update-oops-plugin-hot-update.bat 克隆与更新热更新插件
执行 update-oops-plugin-excel-to-json.bat 克隆与更新Excel转Json格式插件

// Mac 
执行 update-oops-plugin-framework.sh 克隆与更新框架插件
执行 update-oops-plugin-hot-update.sh 克隆与更新热更新插件
执行 update-oops-plugin-excel-to-json.sh 克隆与更新Excel转Json格式插件

// 最重要的是update-oops-plugin-framework, 这个是框架的的主体, 以Mac为例:
./update-oops-plugin-framework.sh 

// 如果命令提示错误,类似如下:
// -bash: ./update-oops-plugin-bundle: No such file or directory
// 可以增加 sudo ,它会提示你输入登录密码
sudo ./update-oops-plugin-framework.sh 

// 如果使用sudo后,报错:command not found,那就运行如下命令:
chmod u+x update-oops-plugin-framework.sh
sudo ./update-oops-plugin-framework.sh
  1. 打开项目目录: oops-game-kit 下的 project.json,修改 namedescription, 对项目名和描述重新命名, 并注意修改下项目目录文件名
{
  "_sourceId": "c30b28da-749e-479b-bcb6-cecd8d7be9e3",
  "creator": {
    "version": "3.8.1"
  },
  "dependencies": {
    "crypto-es": "^1.2.7"
  },
  // 项目描述
  "description": "游戏项目模板",
  // 项目名
  "name": "oops-game-kit",
  "uuid": "00d7d957-a3e8-4ad6-80f4-2fcfb235bca4",
  "version": "3.6.3"
}

注: version也可以修改,但建议使用最新

  1. 修改后,打开CocosCreator编译器 导入项目, 如图所示:
    请添加图片描述

  2. 通过项目配置修改屏幕适配率即可。


目录结构


在这里,看下目录结构,以便于对模版进行拓展修改:
请添加图片描述

目录结构跟CocosCreator的目录结构是类似的, 需要注意的是:

  • excel 放置多语言文本配置及其他数值策划表,可以配合excel-to-json插件进行使用, 需要提交
  • extensions 放置的框架插件相关, 需要提交
  • node_modules 放置的NPM第三方库相关,crypto-es 主要应用于本地存储加密,需要提交
  • update-XXX 用于windows或Mac平台更新插件使用

针对于 node_modules NPM第三方库相关,想了解NPM,可参考博客:

注:在CocosCreator项目中,node_modules的是被.gitgnore忽略的

注: NPM相关使用,可参考博客:Mac 安装使用NPM及常用命令


assets目录

使用CocosCreator开发项目,需要将使用的资源放置到 assets 文件夹中,编译器才会在资源管理器显示出来。

该目录下的一般结构是:

  • res 放置静态引用的资源
  • resources 放置动态引用的资源
  • script 放置游戏脚本
  • scene 放置场景的配置文件
  • bundle 放置自定义AB包,可用于分包或者远程下载

oops-gamekit 项目模版与上面是类似的, 但框架拓展了一些东西需要注意:

  1. 游戏启动时加载的必备资源,需要保证资源配置尽量小些,否则黑屏时间过长
  2. 游戏loading页面预加载资源
  3. 可选项多语言包,自定义资源的加载

这些方面需要我们在配置 assets目录资源的时候注意。下面将详细说明下。


注意事项


在说明之前,注意下:resources.config.json 文件, 它是游戏配置文件。

{
  // 主配置信息:版本号、包名、本地存储加密key和iv、服务器地址、请求超时、帧率等
  "config": {
    "version": "1.0.5",
    "package": "com.oops.game",
    "localDataKey": "oops",
    "localDataIv": "framework",
    "httpServer": "http://192.168.0.150/main/",
    "httpTimeout": 10000,
    "frameRate": 60
  },
  // 多语言配置:语言类型、文本和资源路径等
  "language": {
    "type": [
      "zh",
      "en"
    ],
    "path": {
      "json": "language/json",
      "texture": "language/texture"
    }
  },
  // 自定义Bundle配置
  "bundle": {
    "enable": false,
    "server": "http://localhost:8083/assets/bundle",
    "name": "bundle",
    "version": ""
  }
}

该配置文件对应的的脚本是:…/oops-plugin-framework/assets/module/config/GameConfig.ts

export class GameConfig {
  /** 客户端版本号配置 */
  get version(): string { return this._data["config"]["version"]; }
  /** 包名 */
  get package(): string { return this._data["config"]["package"]; }
  /** 游戏每秒传输帧数 */
  get frameRate(): number { return this._data.config.frameRate; }
  /** 本地存储内容加密 key */
  get localDataKey(): string { return this._data.config.localDataKey; }
  /** 本地存储内容加密 iv */
  get localDataIv(): string { return this._data.config.localDataIv; }
  /** Http 服务器地址 */
  get httpServer(): string { return this._data.config.httpServer; }
  /** Http 请求超时时间 */
  get httpTimeout(): number { return this._data.config.httpTimeout; }

  // ...
  constructor(config: any) {
    let data = config.json;
    this._data = Object.freeze(data);

    oops.log.logConfig(this._data, "游戏配置");
  }
}

可根据需要自行去获取。


游戏启动加载资源

游戏启动时加载的必备资源,主要有:

  • 远程资源, 主要针对的是 resources/config.json 中将Bundle配置资源
  • 自定义资源, 主要针对的是多语言的字体文件
  • 多语言包,主要针对的是多语言特定类型下的文本和纹理配置
  • 公共资源,必备

主要在 initialize/bll/InitRes.ts中进行。主要代码:

entityEnter(e: Initialize): void {
  var queue: AsyncQueue = new AsyncQueue();

	// 加载远程资源配置
	//this.loadBundle(queue);
	// 加载自定义资源
	//this.loadCustom(queue);
	// 加载多语言包
	//this.loadLanguage(queue);
	// 加载公共资源
	this.loadCommon(queue);
	// 加载游戏内容加载进度提示界面
	this.onComplete(queue, e);

	queue.play();
}

注意:

  • 如果没有远程资源配置,可将 resources/config.json 中的Bundle配置去掉,并且该接口注释掉
  • 自定义资源为可选配置,如果不需要,可以注释掉
  • 多语言包为可选配置,如果不需要,可以注释掉

公共资源是必备的,看下代码相关:

// 加载公共资源的路径是在resources/common中
private loadCommon(queue: AsyncQueue) {
  queue.push((next: NextFunction, params: any, args: any) => {
    oops.res.loadDir("common", next);
  });
}

注: 在resources目录下一定要存在common文件夹,放置必备资源

游戏必备资源加载完成后,会调用onComplete 用于显示Loading页面

private onComplete(queue: AsyncQueue, e: Initialize) {
  queue.complete = async () => {
    // 通过UIID,异步打开Loading页面
    var node = await oops.gui.openAsync(UIID.Loading);
    if (node) e.add(node.getComponent(LoadingViewComp) as ecs.Comp);
    e.remove(InitResComp);
  };
}

游戏Loading页面

在我们首次运行项目的时候,因为资源较少,或者是放错了资源路径,可能会出现的问题:

  • Loading页面一闪而过,似乎游戏卡顿了下
  • 页面显示出现黑屏卡顿

该页面主要用于加载较大的内容资源,主要实现文件是:

  • loading.prefab 预制体页面文件

  • LoadingViewComp.ts 脚本文件

脚本的主要加载逻辑:

private loadGameRes() {
  // 多语言提示文本
  this.data.prompt = oops.language.getLangByID("loading_load_game");

  // 加载目录
  oops.res.loadDir("game", 
    // 加载进度回调
  	this.onProgressCallback.bind(this), 
    // 加载完成回调
    this.onCompleteCallback.bind(this)
  );
}

注: 在resources目录下一定要存在game文件夹,用于放置动态引用的非必备资源


其他


关于多语言或Bundle相关,在后面的文章中会逐渐的说明。

最后,将个人项目整理以后的资源目录分享给大家:
请添加图片描述

再次感谢作者dgflash的分享,oops-framework框架QQ群: 628575875。

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

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

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

相关文章

WordPress:解决xmlrpc.php被扫描爆破的风险

使用WordPress的朋友都知道,一些【垃圾渣渣】会利用xmlrpc.php文件来进行攻击,绕过WP后台错误登录次数限制进行爆破。虽然密码复杂的极难爆破,但及其占用服务器资源。 方法一、利用宝塔防火墙(收费版) 一般可以直接使…

python中jupyter notebook安装教程

一、什么是Jupyter Notebook? Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。 ——Jupyter Notebook官方介绍 https://jupyter-notebook.readthedocs.io/en/stable/notebook.html二…

JMeter怎样测试WebSocket

一、安装WebSocket取样器 1、从JMeter插件管理器官网下载: https://jmeter-plugins.org/ 搜索websocket 1、jetty-http-9.1.2.v20140210.jar 2、jetty-io-9.1.2.v20140210.jar 3、jetty-util-9.1.2.v20140210.jar 4、websocket-api-9.1.1.v20140108.jar 5、w…

太阳能路灯系统在道路照明中的应用

太阳能路灯作为一种极为科学和环保的光源利用形式,一直以来备受关注,但是,目前虽然有很多技术可以证明太阳能路灯的可行性,不过,如何真正的将太阳能路灯应用到道路照明之中,还是需要进行深入分析和探讨的。…

安装两个WIN10/WIN11系统到两个盘中,第二个系统依赖原系统盘引导的问题

前段时间折腾装一个双系统,主要两个方面考虑: 1. 原来的系统又许多软件,想着先保留; 2. 系统想安装到一个固态硬盘中; 在安装的过程中遇到了一些问题,这里记录分享一下。 问题1,运行系统自动安装…

WebUI自动化学习(Selenium+Python+Pytest框架)005

基础知识学习完毕,接下来我们开始学习测试框架啦!!! 首先来回顾一下python自带的Unittest框架: Python基础学习016__UnitTest-CSDN博客文章浏览阅读97次。Testcase:测试用例:这个测试用例是UnitTest的组成部分,不是手…

2021年12月14日 Go生态洞察:Go 1.18 Beta 1 发布与泛型的引入

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

43.0BaseDao抽取dao公共父类

43.1. 回顾 1. 把数据库表中查询的结果封装到一个实体类中。 命名规则:类名和表名一致 类中属性和表的字段对应。 表中的一条记录对应实体的一个对象 多条记录→集合 43.2. 正文 目录 43.1. 回顾 43.2. 正文 43.3. 抽取dao公共父类。 43.4. 引入数据源 43.3. 抽取dao公共…

【算法】算法题-20231128

这里写目录标题 一、55. 跳跃游戏二、274. H 指数三、125. 验证回文串 一、55. 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以&am…

力扣题:字符的统计-11.30

力扣题-11.30 [力扣刷题攻略] Re:从零开始的力扣刷题生活 力扣题1:49. 字母异位词分组 解题思想:将单词进行排序之后通过哈希表进行返回 class Solution(object):def groupAnagrams(self, strs):""":type strs: List[str]:…

【嵌入式Linux程序开发综合实验】-1(附流程图) | ARM开发板 | 测试“Hello World” | Makefile文件 | 实现加法相加

任务:编写在标准输出终端输出“Hello World!”的C语言代码以及输入指定数字相加结果、Makefile,并分别编译出在PC与ARM上运行的可执行程序文件。 设备以及工具 硬件:Linux开发板、PC机、串口连接线 图1 Linux开发板以及串口接线 …

计算机网络(超详解!) 第二节 物理层(下)

1.信道复用技术 复用 (multiplexing) 是通信技术中的基本概念。 它允许用户使用一个共享信道进行通信,降低成本,提高利用率。 1.频分复用 FDM(Frequency Division Multiplexing) 将整个带宽分为多份,用户在分配到一定的频带后,…

pytorch中Conv1d、Conv2d与Conv3d详解

1 卷积介绍 1.1 什么是卷积 卷积(convolution),是一种运算,你可以类比于加,减,乘,除,矩阵的点乘与叉乘等等,它有自己的运算规则,卷积的符号是星号*。表达式…

力扣每日一题(2023-11-30)

力扣每日一题 题目:1657. 确定两个字符串是否接近 日期:2023-11-30 用时:21 m 07 s 时间:11ms 内存:43.70MB 代码: class Solution {public boolean closeStrings(String word1, String word2) {if(word1.…

Kubernetes(K8s)Pod控制器详解-06

Pod控制器详解 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建 控制器创建…

深搜回溯剪枝优化策略-全排列II

LCR 084. 全排列 II - 力扣(LeetCode) 这道题的主体思想和之前讲过的全排列是相似的,不同的是思考的角度要侧重于剪枝方向,所以可以通过这道题对剪枝思想的进一步扩展; 通过题意,可以知道,在上一…

智能电表红外线有什么用?

在如今的智能家居时代,智能电表作为电力行业的一项重要创新,正在逐渐取代传统电表,为用户提供更加便捷和智能的用电方式。而在智能电表的技术中,红外线的应用起到了重要的作用。那么,智能电表红外线有什么用呢&#xf…

【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板

一、 项目初始化 一个项目要有统一的规范,需要使用eslintstylelintprettier来对我们的代码质量做检测和修复,需要使用husky来做commit拦截,需要使用commitlint来统一提交规范(即统一提交信息),需要使用pre…

【C++笔记】红黑树封装map和set

一、map和set的泛型封装逻辑 map和set的底层都是红黑树,所以我们想要用红黑树封装map和set的第一个问题就来了,因为set是key结构而map是key-value结构,怎样用同一个底层结构去封装出两个不同存储结构的容器呢?难道我们要将红黑树…

Spring Security 6.x 系列(8)—— 源码分析之配置器SecurityConfigurer接口及其分支实现

一、前言 本章主要内容是关于配置器的接口架构设计,任意找一个配置器一直往上找,就会找到配置器的顶级接口:SecurityConfigurer。 查看SecurityConfigurer接口的实现类情况: 在 AbstractHttpConfigurer 抽象类的下面可以看到所有…