用23种设计模式打造一个cocos creator的游戏框架----(一)生成器模式

1、模式标准

模式名称:生成器模式

模式分类:创建型

模式意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

结构图:

适用于:

  1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  2. 当构造过程必须允许被构造的对象有不同的表示时。

2、分析与设计

完成一个游戏开发后,我们想稍微修改下配置,修改下ui,调整一下玩法变成一个新的游戏,结合设计模式的意图,我们修改一下我们的意图。

意图:将一个复杂(游戏)对象的构建与表示(小游戏玩法)分离,使得同样的构建过程可以创建不同的表示(小游戏玩法)。

3、开始打造

import { IGame } from "./IGame";export interface IGameBuilder {create(): IGameBuilder;setEnums(): IGameBuilder;setLayer(): IGameBuilder;setAudio(): IGameBuilder;setTimer(): IGameBuilder;setStorage(): IGameBuilder;setConfig(): IGameBuilder;setNet(): IGameBuilder;setVM(): IGameBuilder;setItemFactory(): IGameBuilder;build(): IGame;
}

export class DemoGameBuilder implements IGameBuilder {private main: Mainprivate game: DemoGameconstructor(main: Main) {this.main = main}create(): IGameBuilder {this.game = new DemoGame()return this}setEnums(): IGameBuilder {this.game.setEnums({UUID: UIID,API: NET_GAME_API,PREFAB: ENUM_PREFAB,BGM: ENUM_BGM,})return this;}setLayer(): IGameBuilder {resources.load("prefabs/module_basic/tipsItem") // 公共的xhgame.nodes = new NodesManager(this.main.node);xhgame.gui = new GuiManager(this.main.gui);xhgame.nodes.initNodesMap(this._getInitNodesMap()) // 一些层级关系return this;}setAudio(): IGameBuilder {xhgame.audio = AudioManager.instancereturn this;}setTimer(): IGameBuilder {xhgame.timer.start();return this;}setStorage(): IGameBuilder {xhgame.storage.init('xhgame_jcq', 'xhgame_jcq.hottredpen'); // 初始化本地存储加密return this;}setConfig(): IGameBuilder {let config: IDemoConfig = {aa: 11}xhgame.game.setConfig(config)return this;}setNet(): IGameBuilder {return this;}setVM(): IGameBuilder {this.game.setVM(new DemoVM())return this;}setItemFactory(): IGameBuilder {this.game.setItemFactory(new ItemFactory<DemoUnitItemAttr>())return this;}build(): DemoGame {this.game.init()return this.game}private _getInitNodesMap() {return {}}
}
export class GameDesign {private gameBuilder: IGameBuilder;setGameBuilder(builder: IGameBuilder): void {this.gameBuilder = builder;}buildGame<TG extends IGame>(): TG {return this.gameBuilder.create().setEnums().setLayer().setAudio().setTimer().setStorage().setConfig().setNet().setVM().setItemFactory().build() as TG;}
}

4、开始使用

@ccclass('Main')
export class Main extends Component {/** 界面层节点 */@property({ type: Node, tooltip: "界面层Node" })public gui: Node = null;/** 游戏层节点 */@property({ type: Node, tooltip: "游戏层Node" })public game: Node = null;/** 游戏编码 */@property({ tooltip: "游戏编码" })public gameCode: string = '';start() {if (DEBUG) profiler.showStats();}onLoad() {window['xhgame'] = xhgame // 方便console中查看全局// game.frameRate = 30;// 设计模式3(生成器模式)const gameDesign = new GameDesign();switch (this.gameCode) {case 'demo': // demogameDesign.setGameBuilder(new DemoGameBuilder(this));gameInstance.game = gameDesign.buildGame<DemoGame>()break;case 'jianchuqiao': // 剑出鞘gameDesign.setGameBuilder(new JianchuqiaoGameBuilder(this));gameInstance.game = gameDesign.buildGame<JCQGame>()break;case 'feijian': // 飞剑gameDesign.setGameBuilder(new FeijianGameBuilder(this));gameInstance.game = gameDesign.buildGame<FeijianGame>()break;}gameInstance.game.start()}
}

 有了构建器,下次再分离出一个消除类玩法,只需要new 一个新的构建器就可以了

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

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

相关文章

[MySQL--基础]事务的基础知识

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录&#xff1a;生活中最重要的决定就是要做出决定。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 MySQL数据库 事务的目录&#x1f4d5; 前言事务简介&#x1f680;事务操作&#x1f680;准…

AV1(AOMedia Video 1) 编程指南

AV1&#xff08;AOMedia Video 1&#xff09;是一种开源、免专利费的视频编码格式&#xff0c;由AOMedia&#xff08;开放媒体联盟&#xff09;开发。AV1旨在提供比现有的视频编解码格式&#xff08;如H.264/AVC和HEVC&#xff09;更高的压缩效率&#xff0c;同时保持高质量视频…

ubuntu apt指令集学习心得

ubuntu apt指令集学习心得 在Ubuntu中&#xff0c;我们可以使用以下apt指令集来管理软件包&#xff1a; 1. 更新软件包列表&#xff1a; sudo apt update 2. 升级已安装的软件包&#xff08;将系统中的所有软件包升级到最新版本&#xff09;&#xff1a; s…

Linux:缓冲区的概念理解

文章目录 缓冲区什么是缓冲区&#xff1f;缓冲区的意义是什么&#xff1f;缓冲区的刷新方式 理解缓冲区用户缓冲区和内核缓冲区缓冲区在哪里&#xff1f; 本篇主要总结的是关于缓冲区的概念理解&#xff0c;以及再次基础上对文件的常用接口进行一定程度的封装 缓冲区 什么是缓…

keil添加了头文件仍然报找不到头文件的原因

如图&#xff0c;我在user分组新建Item&#xff0c;可是keil提示头文件不存在&#xff0c;所有的一切设置都是对的&#xff0c;但就是找不到头文件&#xff0c;找了很久&#xff0c;最后才发现是user分组和文件系统中的文件夹不一致的原因。 如图&#xff0c;在分组的文件系统的…

微服务架构之服务发现

在微服务架构中&#xff0c;服务与服务之间需要通过服务发现来找到对方&#xff0c;以便发起请求。 所谓的服务发现就是一种自动监测并发现网络内的的服务的机制。可以调用者动态感知到网络上服务的变化。DNS就是最典型的服务发现系统了。 在微服务架构中的服务发现的工作原理…

【动态规划】03使用最小花费爬楼梯(easy1)

题目链接&#xff1a;leetcode使用最小花费爬楼梯 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求达到楼梯顶部的最低花费. 由题可得&#xff1a; cost[i] 是从楼梯第 i 个…

【附源码】完整版,Python+Selenium+Pytest+POM自动化测试框架封装

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试框架简介 …

【VRTK】【VR开发】【Unity】11-甩臂移动

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 除了一般的移动能力,VRTK还提供更为沉浸的甩臂移动。 【设定摇杆输入中间件】 在Hierarchy中展开Button Input Actions,其下生成两个新的空子对象…

看图学源码之 CopyOnWriteArraySet源码分析

基本介绍 使用内部CopyOnWriteArrayList进行所有操作的Set 特点 它最适合以下应用程序&#xff1a;集合大小通常较小、只读操作的数量远远多于可变操作&#xff0c;并且您需要在遍历期间防止线程之间的干扰。它是线程安全的。突变操作&#xff08; add 、 set 、 remove等&…

主动而非被动:确保网络安全运营弹性的途径

金融部门处理威胁的经验对网络安全领域的任何人都有启发——没有什么可以替代提前摆脱潜在的风险和问题。 从狂野西部的银行劫匪到勒索软件即服务 (RaaS)&#xff0c;全球金融生态系统面临的威胁多年来发生了巨大变化。技术进步带动了金融业的快速发展&#xff0c;从现金交易到…

基于轻量级MnasNet模型开发构建40种常见中草药图像识别系统

文本是前文的后续&#xff1a; 《python基于轻量级GhostNet模型开发构建23种常见中草药图像识别系统》 前文主要是在小批量小种类数据集上尝试开发构建基于轻量级CNN模型的中草药图像识别系统&#xff0c;本文的初衷是想要构建一个大类别大数据集的基础&#xff0c;但是无奈发…

附录1、vuepress中的Markdown语法

# 一、标题 # 说明&#xff1a; #后面跟的内容就是标题&#xff0c;一个#就是一级标题&#xff0c;有几个#就是几级标题&#xff0c;例如2级标题就有两个##&#xff0c;markdown的2级和3级标题会默认自动作为子目录&#xff0c; 注意&#xff1a;#后面必须有个空格&#xff0…

【天线了解】2.WTW天线了解与使用

注意网段&#xff1a;&#xff08;计算机与设备同一网段才可以通信&#xff09; 1.LS28接收机使用的网段是192.168.16.X&#xff0c;所以电脑应该同样设置 2.WTW天线使用网段192.168.98.X 0.WTW使用原理 1.计算机控制LS28&#xff08;接收机&#xff09;&#xff0c;WTW天线。 …

全志H6-ARMLinux第1天:全志概述、刷机登陆、官方外设库、蜂鸣器、超声波测距

1. 全志H616课程概述&#xff08;456.01&#xff09; 1.1 为什么学 学习目标依然是Linux系统&#xff0c;平台是ARM架构 蜂巢快递柜&#xff0c;配送机器人&#xff0c;这些应用场景用 C51、STM32 单片机无法实现第三方介入库的局限性&#xff0c;比如刷脸支付和公交车收费设…

《微信小程序开发从入门到实战》学习四十四

4.3 云开发文件存储 4.3.4 删除文件 在小程序端和云函数端&#xff0c;都可以调用API删除云空间中的文件&#xff0c;这两个API的参数和回调函数参数都是一样。每次调用API最多删除50个文件。使用方法如下代码所示&#xff1a; // 回调风格的API wx.cloud.deleteFile({ file…

python的extend函数详解

文章目录 语法功能示例例1&#xff1a;添加列表例2&#xff1a;添加元组例3&#xff1a;添加集合例4&#xff1a;添加字典&#xff08;只添加键&#xff09;例5&#xff1a;添加字符串例6&#xff1a;混合类型扩展例7&#xff1a;扩展空列表或不可迭代对象 注意事项&#xff1a…

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境 前言一、介绍 mkcert二、安装/使用 mkcert1. 安装2. 使用 总结 前言 本地开发时有些功能只有在 https 证书的情况下才能使用, 例如一些 Web API 一、介绍 mkcert Github地址 mkcert 是一个制作本地可信开发证书的简单工具。…

SmartChart:一站式数据可视化解决方案

在当今的数据驱动的世界中&#xff0c;数据可视化已经成为了一个重要的工具&#xff0c;它可以帮助我们理解复杂的数据集&#xff0c;并从中提取有价值的信息。SmartChart就是这样一个强大的数据可视化工具&#xff0c;它提供了一站式的数据可视化解决方案&#xff0c;无论你是…

Docker实战笔记 二 Springboot Idea 插件打包

1.上传springboot的jar rootcenots-7.5:/home/code#rz -----app.jar 2.编辑Dockerfile rootcenots-7.5:/home/code#vi Dockerfile内容 FROM openjdk:8 # 作者 MAINTAINER nnd # 声明要使用的端口 EXPOSE 8080 # VOLUME 指定了临时文件目录为/tmp。# 将本地包添加到容器中并…