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

news2025/1/18 6:53:06

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: Main
    private game: DemoGame

    constructor(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.instance
        return 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': // demo
                gameDesign.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.coloradmin.cn/o/1293857.html

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

相关文章

原生cesium、mars3d、supermap-cesium在vue3+vite中引入

1. 原生cesium 需要下载 yarn add cesiumyarn add vite-plugin-cesium2. mars3d 需要下载 yarn add mars3d mars3d-cesiumyarn add vite-plugin-mars3d3. supermap-cesium 只需要引入官网下载的包&#xff0c;build文件夹下的cesium&#xff0c;以及项目中引入的其他cesiu…

Densely Connected Convolutional Networks(2018.1)

文章目录 Abstract1. Introduction提出问题以前的解决方法我们的方法效果 2. Related Work3. DenseNetsResNets.Dense connectivity.Composite function.Pooling layers.Growth rate.Bottleneck layers.Compression.Implementation Details. 4. Experiments5. DiscussionModel …

C语言之动态内存管理(malloc calloc realloc)

C语言之动态内存管理 文章目录 C语言之动态内存管理1. 为什么要有动态内存管理2. malloc 和 free2.1 malloc2.2 free2.3 例子 3. calloc 和 realloc3.1 calloc3.2 realloc 4. 常见的动态内存错误4.1 对NULL指针的解引⽤操作4.2 对动态开辟空间的越界访问4.3 对⾮动态开辟内存使…

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 变量篇】

文章目录 Trace32 查看变量值Var.view 查看变量值Var.view 查看数据类型的大小Var.view 根据变量地址查看变量值 Trace32 查看变量值 步骤1 步骤2 步骤3&#xff1a; 步骤4&#xff1a; 查看结构体变量 str_t32 的值 struct t32_str {uint32_t t32_val;uint32_t …

苹果手机ios系统安装了一个免签应用书签webclip描述文件该如何卸载?

随着移动应用的普及&#xff0c;越来越多的用户开始关注到苹果免签的应用。相比于需要通过 App Store 审核和签名的应用&#xff0c;免签应用无需经过苹果的审核过程&#xff0c;可以直接安装和使用。那么&#xff0c;苹果免签应用是如何制作的呢&#xff1f;本文将介绍制作苹果…

震坤行2023安全月活动顺利收官

震坤行2023安全月活动顺利收官 2023年6月&#xff0c;是第22个全国“安全生产月”&#xff0c;主题为 “人人讲安全、个个会应急”。震坤行工业超市(上海)有限公司基于国家 “安全生产月”的主题要求&#xff0c;以及公司具体的安全形势&#xff0c;于6月1日在全公司范围内正式…

计算机毕业设计 基于大数据的智能家居销量数据分析系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

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

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

【Python】Faker库详解:创建测试数据轻而易举

Python Faker库详解&#xff1a;创建测试数据轻而易举 在软件开发和测试过程中&#xff0c;通常需要大量的测试数据来模拟真实环境。Python的Faker库为开发者提供了一个方便、灵活且强大的工具&#xff0c;用于生成各种虚构数据。本文将深入介绍Faker库&#xff0c;演示其基本…

GateWay网关介绍以及整合knife4j聚合所有服务的接口文档

为什么使用网关&#xff1f; 因为多个微服务的端口不同&#xff0c;前端调用不方便&#xff0c;使用网关可以统一接收处理前端的请求&#xff0c;同时方便接口的集中处理&#xff0c;比如鉴权、聚合接口文档、限流等等.. 这里使用Knife4j文档工具来实现接口文档&#xff1a;K…

Linux系统调试课:USB 常用调试方法

文章目录 一、USB调试工具有哪些二、USB相关节点2.1、USB枚举成功标志2.2、USB speed查询2.3、USB 查询PID、VID沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要 介绍 USB 常用调试方法。 一、USB调试工具有哪些

LeetCode:1466. 重新规划路线(DFS C++、Java)

目录 1466. 重新规划路线 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 1466. 重新规划路线 题目描述&#xff1a; n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有…

【带头学C++】----- 九、类和对象 ---- 9.8 动态对象创建

目录 9.8 动态对象创建 9.8.1 动态创建对象基础概念 9.8.2 C语言创建动态对象的 9.8.3 new创建动态对象 9.8.4 delete释放动态对象 9.8.5 动态对象数组 9.8 动态对象创建 9.8.1 动态创建对象基础概念 在创建数组时&#xff0c;我们通常需要预先指定数组的长度&#xff0…

二分查找|差分数组|LeetCode2251:花期内花的数目

作者推荐 贪心算法LeetCode2071:你可以安排的最多任务数目 本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 0 开始的二维整数数组 flowers &#xff0c;其中 flowers[i] [starti, endi] 表示第 i 朵花的 花期 从 starti 到 endi &#xff08;都 包含&#x…

低代码与MES:智能制造的新篇章

一、引言 随着工业4.0和智能制造的兴起&#xff0c;企业对于生产过程的数字化、智能化需求日益迫切。制造执行系统&#xff08;MES&#xff09;作为连接计划层与控制层的关键信息系统&#xff0c;在提升生产效率、优化资源配置、保障产品质量等方面发挥着重要作用。然而&#…

Linux Docker 安装Nginx

1.21、查看可用的Nginx版本 访问Nginx镜像库地址&#xff1a;https://hub.docker.com/_/nginx 2、拉取指定版本的Nginx镜像 docker pull nginx:latest #安装最新版 docker pull nginx:1.25.3 #安装指定版本的Nginx 3、查看本地镜像 docker images 4、根据镜像创建并运行…

创投课程研报专题课 | 如何写出高质量研报

协会邀请了来自GPTDAO的分析师——Will作为VC创投课程研报专题课的嘉宾&#xff0c;将于北京时间12月2日(周六)晚上21:00 PM-22:00 PM&#xff0c;与所有对Web3投资、创业心怀热忱的朋友一同探讨《如何写出高质量的研报》这个激动人心的话题。 浙江大学学生区块链协会&#xff…

连号区间数

/* 两重循环,如果是连号区间,那么区间长度必然 最大值 - 最小值 第二层循环的时候可以更新每个区间的最大值,最小值。中间的元素不需要考虑 *//* 暴力做法:在第二层循环时,每次多创建一个数组存放i~j之间的数,对其排序Arrays.sort(data,i,j1) 然后再多一层循环判断d[k] 1 d[k…

集合的几个遍历方法

1. 集合的遍历 1.0 创建集合代码 List<String> strList new ArrayList<>(); strList.add("huawei"); strList.add("xiaomi"); strList.add("tencent"); strList.add("google"); strList.add("baidu");1.1 fo…

css 十字分割线(含四等分布局)

核心技术 伪类选择器含义li:nth-child(2)第2个 lili:nth-child(n)所有的lili:nth-child(2n)所有的第偶数个 lili:nth-child(2n1)所有的第奇数个 lili:nth-child(-n5)前5个 lili:nth-last-child(-n5)最后5个 lili:nth-child(7n)选中7的倍数 border-right: 3px solid white;borde…