用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: 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 一个新的构建器就可以了

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cocos Creator是一款面向游戏开发者的跨平台游戏开发工具,它集成了Cocos2d-x游戏引擎和Cocos Studio编辑器,支持多种平台上的游戏开发,如iOS、Android、Windows等。 消灭星星是一款基于Cocos Creator开发的游戏。在游戏中,玩家需要消除屏幕上的星星,以获得分数。游戏开始时,屏幕上会随机生成一些星星,玩家可以通过点击相连的星星来消除它们。消除的星星越多,得到的分数就越高。玩家可以通过不断消除星星来刷新高分记录,挑战自己的极限。 在消灭星星游戏中,Cocos Creator提供了丰富的功能和工具,为游戏开发者提供了便利。开发者可以使用Cocos Creator的图形界面编辑器来创建游戏场景、导入资源和设置游戏规则等。同时,Cocos Creator还提供了强大的脚本编写功能,开发者可以使用JavaScript或TypeScript编写游戏逻辑,实现游戏中的各种功能。 除了基本的消除星星玩法,Cocos Creator还支持添加特殊道具、关卡设计、人物角色等功能。开发者可以根据自己的需求,自定义游戏的玩法和功能,使游戏更加有趣和有挑战性。 总而言之,Cocos Creator游戏开发工具提供了强大的功能和便捷的开发环境,使开发者可以轻松地开发出各种各样的游戏,包括消灭星星这样的小而精致的休闲游戏。无论是想要学习游戏开发还是实现自己的游戏创意,Cocos Creator都是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值