Egret游戏大厅制作思路
Egret游戏大厅制作思路
Egret中,写好的代码最终都被打包到main.js里面,只有库文件会单独生成出来,按需加载。
游戏中有需求,要将一些游戏(或者模块)进行外包,然后从主游戏大厅中进入,那么可以通过第三方库的形式进行开发。
第一步:创建目录
创建三个目录,Plaza,Child,lib分别对应 主游戏大厅、子游戏、库。最终要将子游戏放入到库中。

第二步:开发
这里只做简单的开发,即:从主游戏直接打开子游戏。效果如下:
主游戏:

代码:(通过egret默认的代码制作的界面)
protected createGameScene(): void {
let button = new eui.Button();
button.label = "Click!";
button.horizontalCenter = 0;
button.verticalCenter = 0;
this.addChild(button);
button.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onButtonClick, this);
}
/**
* 点击按钮
* Click the button
*/
private onButtonClick(e: egret.TouchEvent) { }
子游戏:

代码:(只有一个图标)
protected createGameScene(): void {
let icon: egret.Bitmap = this.createBitmapByName("egret_icon_png");
this.addChild(icon);
icon.x = 26;
icon.y = 33;
}
第三步:整理子游戏库
这个时候,我们两个游戏其实都好了。需要将子游戏嫁接到主游戏大厅中。
有几个问题需要解决:
首先,资源冲突
resource/default.res.json
resource/default.thm.json
这两个文件基本上是所有游戏开发中都要用的。并且不能更改(更改后会各种报错,所以保留)。既然我们要嫁接过去,这两个文件在主游戏里面是要重新命名的。否则游戏会把这两个文件解析成主游戏对应的文件,产生冲突,报错。
所以,子游戏中将两个文件名字提取,以及 resource目录也要提取。
我们创建Ress.ts,这个将来也要在主游戏中用。所以我们目录新建文件夹 same,将Ress.ts放入,并且将LoadingUI.ts放入其中(因为主游戏中也有)。目录结构如下:

Ress.ts代码:
class Ress
public constructor() {
}
public static child = ["resource/default.res.json","resource/default.thm.json","resource"]
}
替换Main.ts中路径:
await RES.loadConfig(Ress.child[0],Ress.child[2]);
let theme = new eui.Theme(Ress.child[1], this.stage);
对了,将不用的资源请删除掉,两个项目中不能有同名的资源。
其次:命名空间冲突。
因为两个项目中都有main.ts,有需要给子游戏添加命名空间(所有的都要,防止冲突);
namespace child {
export class Main extends eui.UILayer {
namespace child {
export class AssetAdapter implements eui.IAssetAdapter {
namespace child {
export class ThemeAdapter implements eui.IThemeAdapter {
第四步:将子游戏发布成第三方库:
创建child库

将子游戏src下的文件拷贝到src目录,不要拷贝same目录下文件,会跟主游戏引起冲突。
Typings目录下放入child.d.ts
declare namespace child{
class Main{}
}
让主游戏调用。
生成库 egret build,查看bin目录,生成child.js文件,如果没有child.d.ts手动拷贝(我的是没有生成).

第五步:主游戏引用第三方库child
{
"name": "child",
"path":"../GameLib/child"
}
清理构建,然后libs目录多出来我们刚刚创建的。

主游戏Main.ts
private onButtonClick(e: egret.TouchEvent) {
let game = new child.Main();
this.addChild(game as eui.UILayer);
}
运行看一下。

第六步:完了么?装载子游戏资源
白鹭图片是child游戏里面的么?我们什么都有做呢。现在显示的只是我们把子游戏装载了进来。我们还没有把子游戏资源拿过来。
将父容器中除了与按钮相关的资源删除:

子游戏中将白鹭以外的图片删除:

注意:
子游戏中的资源组与资源都不能与主游戏中的冲突。我们把资源组改名。

发布子游戏,正常的游戏发布流程。我们需要压缩过的资源。
将子游戏拷贝到主游戏中,在主游戏创建新的路径resource-child

子游戏中加载的preload改成child_preload

将子游戏中的文件拷贝到库中。编译(忽略错误);
我们在主游戏中开始运行子游戏。
报错!!!!
将子游戏中的same目录拷贝到主游戏中,公共部分
放一起。
查看Ress,里面路径是对应主游戏的,改成子游戏的路径。
class Ress {
public constructor() {
}
public static child = ["resource-child/child.res.json","resource-child/child.thm.json","resource-child"]
}
可以了,实现目的。
后记:
步骤有些繁琐,尤其是拷贝文件时候。所以可以自己写一个脚本来处理这些繁琐的操作,避免出错。
里面要避免命名空间冲突以及资源冲突。
公用类放到统一的文件夹里面,方便操作。
路径可以用配置的形式动态加载,不用每次编译。
说白了,还是想法操作js(游戏程序员跟web程序员还是不一样,好多概念会模糊吧)
Egret游戏大厅制作思路的更多相关文章
- egret游戏入门之学习资源篇
最近因需要,入手H5游戏. 写游戏当然需要有引擎. H5游戏开发:游戏引擎入门推荐 如何选择 H5 游戏引擎 白鹭引擎和layabox哪个好用,哪个技术更成熟 ? LayaBox 与 Egret 选择 ...
- iOS 14 egret 游戏卡顿问题分析和部分解决办法
现象 总体而言,iOS 14 渲染性能变差,可以从以下三个测试看出. 测试1:简单demo,使用egret引擎显示3000个图(都是同一个100*100 png 纹理),逐帧做旋转.(博客园视频播放可 ...
- Html5 Egret游戏开发 成语大挑战(一)开篇
最近接触了Egret白鹭引擎,感觉非常好用,提供了各种各样的开发工具让开发者和设计者更加便捷,并且基于typescript语言开发省去了很多学习成本,对于我们这种掉微软坑许久的童鞋来说,确实很有吸引力 ...
- C#中国象棋+游戏大厅 服务器 + 客户端源码
来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
- Love2D游戏引擎制作贪吃蛇游戏
代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...
- 常用样式制作思路 自定义按钮~自适应布局~常见bug seajs简记 初学者必知的HTML规范 不容忽略的——CSS规范
常用样式制作思路 学习常用样式总结参考来自这里 带点文字链接列表利用:before实现 1 <!DOCTYPE html> 2 <html lang="en" ...
- Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理
在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变大,即使它是隐蔽的,如果同样的功能在其它的地方也是一样的,那么就要写 ...
- Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理
经过前面的制作,使用Egret的Wing很快完成了开始界面和选关卡界面,下面通常来说就是游戏界面,但此时界面切换和关卡数据还没有准备好,这次讲解界面的切换和关卡数据的解析.前面多次修改了Main.ts ...
- Html5 Egret游戏开发 成语大挑战(四)选关界面
通过前面的开始界面基本上了解了eui的使用方法,可以简单快速的制作一个UI界面,本篇使用第二界面选关界面展示更为难一点的代码控制,来展现关卡地图的内容,请确保素材和资源完整,可以在前面的教程中找到下载 ...
随机推荐
- Linux(十) —— 使用 rz 和 sz 命令上传与下载
以CentOS 7 系统为例,一般上传下载都是使用的第三方工具,但是在操作上并不方便,每次都要找到对应的目录才可以执行上传.下载操作,比较麻烦. 而CentOS为例的 Linux 系统可以通过安装 插 ...
- Java实现 LeetCode 698 划分为k个相等的子集(递归)
698. 划分为k个相等的子集 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, ...
- 第十届蓝桥杯JavaB组省赛真题
试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...
- Java实现 LeetCode 561 数组拆分 I(通过排序算法改写PS:难搞)
561. 数组拆分 I 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), -, (an, bn) ,使得从1 到 n 的 min(ai, bi ...
- Java实现 LeetCode 449 序列化和反序列化二叉搜索树
449. 序列化和反序列化二叉搜索树 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法 ...
- Java实现 LeetCode 342 4的幂
342. 4的幂 给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方. 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶: 你 ...
- Java实现 LeetCode 335 路径交叉
335. 路径交叉 给定一个含有 n 个正数的数组 x.从点 (0,0) 开始,先向北移动 x[0] 米,然后向西移动 x[1] 米,向南移动 x[2] 米,向东移动 x[3] 米,持续移动.也就是说 ...
- 基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一
[摘要]仓储管理存在四大细分场景:出入库管理.盘点.分拣和货物跟踪.本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践. 仓储 ...
- 04.Java基础语法
一.Java源程序结构与编程规范 一个完整的Java源程序应该包含下列部分 package语句,至多一句,必须放在源程序第一句 import语句,没有或者若干句,必须放在所有类定义前 public c ...
- 1.Go 开始搞起
link 1. IDE Go Land 服务器激活 2. 资源 中文网站 翻译组 翻译组wiki 待认领文章 入门指南 中文文档 fork 更新 github 中如何定期使用项目仓库内容更新自己 fo ...
