用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.hqwc.cn/news/257221.html

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

相关文章

⭐Unity 搭建UDP客户端(01) 配合网络调试助手测试

1.接收来自服务器的消息 using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine;public class UDPManager:MonoBehaviour {public string recvStr; //服务器返回值public string UDPClientAddRess "192.168.2.39&q…

儿童护栏围栏CE认证EN1930检测标准

儿童门护栏也叫儿童游戏围栏&#xff0c;游戏围栏和儿童护栏&#xff0c;安全护栏等。市面上的儿童围栏以塑料&#xff0c;木质材料结构为主。主要作用是为了解放妈妈的双手&#xff0c;提供一个安全舒适的环境给6个月-3岁的宝宝。使用儿童围栏有利于培养宝宝的独立意识&#x…

深入探索C语言中的二叉树:数据结构之旅

引言 在计算机科学领域&#xff0c;数据结构是基础中的基础。在众多数据结构中&#xff0c;二叉树因其在各种操作中的高效性而脱颖而出。二叉树是一种特殊的树形结构&#xff0c;每个节点最多有两个子节点&#xff1a;左子节点和右子节点。这种结构使得搜索、插入、删除等操作…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

概率测度理论方法(第 2 部分)

一、说明 欢迎回到这个三部曲的第二部分&#xff01;在第一部分中&#xff0c;我们为测度论概率奠定了基础。我们探索了测量和可测量空间的概念&#xff0c;并使用这些概念定义了概率空间。在本文中&#xff0c;我们使用测度论来理解随机变量。 作为一个小回顾&#xff0c;在第…

贪吃的猴子 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 一只贪吃的猴子&#xff0c;来到一个果园&#xff0c;发现许多串香蕉排成一行&#xff0c;每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香…

flask web开发学习之初识flask(三)

文章目录 一、flask扩展二、项目配置1. 直接配置2. 使用配置文件3. 使用环境变量4. 实例文件夹 三、flask命令四、模版和静态文件五、flask和mvc架构 一、flask扩展 flask扩展是指那些为Flask框架提供额外功能和特性的库。这些扩展通常遵循Flask的设计原则&#xff0c;易于集成…

编程实战:自己编写HTTP服务器(系列2:请求)

系列入口&#xff1a;编程实战&#xff1a;自己编写HTTP服务器&#xff08;系列1&#xff1a;概述和应答&#xff09;-CSDN博客 本文介绍如何处理请求。 目录 一、概述 二、成员变量 三、接收并分解请求 四、完整代码 五、HTTP处理框架 一、概述 请求和应答结构其实差不多…

电子学会C/C++编程等级考试2021年03月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:最小新整数 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。 现在从m位中删除k位(0<k < m),求生成的新整数最小为多少? 例如: n = 9128456, k = 2, 则生成的新整数最小为12456…

导入JDBC元数据到Apache Atlas

前言 前期实现了导入MySQL元数据到Apache Atlas, 由于是初步版本&#xff0c;且功能参照Atlas Hive Hook&#xff0c;实现的不够完美 本期对功能进行改进&#xff0c;实现了导入多种关系型数据库元数据到Apache Atlas 数据库schema与catalog 按照SQL标准的解释&#xff0c;…

DDD架构思想专栏一《初识领域驱动设计DDD落地》

引言 最近准备给自己之前写的项目做重构&#xff0c;这是一个单体架构的小项目&#xff0c;后端采用的是最常见的三层架构。因为项目比较简单&#xff0c;其实采用三层架构就完全够了。但是呢&#xff0c;小编最近在做DDD架构的项目&#xff0c;于是就先拿之前写的一个老项目试…

使用React 18、Echarts和MUI实现温度计

关键词 React 18 Echarts和MUI 前言 在本文中&#xff0c;我们将结合使用React 18、Echarts和MUI&#xff08;Material-UI&#xff09;库&#xff0c;展示如何实现一个交互性的温度计。我们将使用Echarts绘制温度计的外观&#xff0c;并使用MUI创建一个漂亮的用户界面。 本文…