用23种设计模式打造一个cocos creator的游戏框架----(十三)模板方法模式

news2024/12/28 19:57:15

1、模式标准

模式名称:模板方法模式

模式分类:行为型

模式意图:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

结构图:

适用于:

1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

2、各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。

3、控制子类扩展。模板方法旨在特定点调用“hook”操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。

2、分析与设计 

模板方法模式还是比较简单的,在这里我们以前面第一个的构建好的游戏为例。每个游戏在游戏开始的时候,都有初始化玩家,加载资源,进入游戏大概这三个过程的小骨架。修改一下我们的意图

意图:定义一个操作中(游戏开始)的算法骨架(加载过程),而将一些步骤延迟到子类(每个游戏)中。

3、开始打造

抽象游戏基类 

export abstract class AbstractGame implements IGame {

    ......


    abstract initPlayer(): any
    abstract loadingAndInit(): Promise<void>
    abstract enterGame(): void

    async start() {
        this.initPlayer()
        await this.loadingAndInit();
        this.enterGame()
    }

}

 4、开始使用

main.ts

    onLoad() {

        window['xhgame'] = xhgame // 方便console中查看全局

        const gameDesign = new GameDesign();
        switch (this.gameCode) {
            case 'demo': // demo
                gameDesign.setGameBuilder(new DemoGameBuilder(this));
                gameInstance.game = gameDesign.buildGame<DemoGame>()
                // 添加有update的系统
                xhgame.game.updateSystems.push(GameMoveSystem)
                xhgame.game.updateSystems.push(GameLoadingSystem)
                break;
            case 'feijian': // 飞剑
                gameDesign.setGameBuilder(new FeijianGameBuilder(this));
                gameInstance.game = gameDesign.buildGame<FeijianGame>()
                // 添加有update的系统
                xhgame.game.updateSystems.push(GameMoveSystem)
                xhgame.game.updateSystems.push(GameLoadingSystem)
                break;
        }
        gameInstance.game.start()
    }
export class DemoGame extends AbstractGame{

    /** 游戏实体 */
    gameEntity: DemoGameEntity
    /** 玩家实体 */
    playerEntity: DemoPlayerEntity
    /** 战役实体 */
    battleEntity: DemoBattleEntity

    
    // 登录并初始化玩家
    initPlayer() {
        const player_entity = xhgame.game.playerEntity
        player_entity.attachComponent(PlayerLoginComp).callback = () => {
            player_entity.attachComponent(PlayerResourceComp) // 玩家资源组件
        }
    }

    // 加载资源
    loadingAndInit() {
        return new Promise<void>((resolve, reject) => {
            GameLoadingSystem.startLoading(
                async (resolveCallback: Function) => {
                    xhgame.camera.normal()
                    await this.loadMap()
                    await this.initBattle()
                    resolveCallback && resolveCallback()
                },
                () => {
                    resolve()
                })
        })
    }

    // 进入游戏
    enterGame() {
        let unitItem001 = xhgame.itemFactory.createUnitItem('kuloubing', UnitType.UnitSpine)
        let unitItem002 = xhgame.itemFactory.createUnitItem('kuloubing', UnitType.UnitSpine)

        unitItem001.idle()
        unitItem002.idle()


    }


}

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

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

相关文章

LIS检验系统,涵盖实验室全部管理流程,适合各种实验机构的业务流程

LIS检验系统源码&#xff0c;云LIS医学检验系统源码 LIS检验系统涵盖实验室的全部管理流程&#xff0c;包括从检验申请、标本采集、实验检测、报告发布的、质控管理、科室事务、试剂管理等完整流程的功能&#xff0c;实现智能化、自动化、规范化管理&#xff0c;遵循医学实验室…

人工智能的技术演进与未来趋势

人工智能的技术演进与未来趋势 一、引言 人工智能&#xff08;AI&#xff09;已经成为当今科技领域的热门话题&#xff0c;其在各个行业的应用越来越广泛。从智能语音助手到自动驾驶汽车&#xff0c;从智能家居系统到医疗诊断&#xff0c;AI技术已经深入到我们的日常生活。在…

排序算法:【插入排序】

一、插入排序&#xff1a;时间复杂度、原地排序 原理&#xff1a;可以想象成打扑克牌时候&#xff0c;发到手里的牌&#xff0c;我们一张一张拿起来插到手里牌的适当位置。 将待排序列表的第一个元素看作是一个有序序列&#xff08;或叫有序区&#xff09;&#xff0c;然后从第…

坚守数字化创新烽火之地 百望云入选新华社“品牌信用建设典型案例”

潮起海之南&#xff0c;风好正扬帆。2023年12月2日-5日&#xff0c;南海之滨&#xff0c;由新华通讯社、海南省人民政府、中国品牌建设促进会主办的主题为“聚焦新质生产力&#xff0c;增强发展新动能”的2023中国企业家博鳌论坛在海南博鳌隆重举行。 群贤毕至&#xff0c;高朋…

推荐3dmax常用15款插件,快来了解一下吧!

推荐3dmax常用15款插件&#xff0c;快来了解一下吧&#xff01; 插件是3ds MAX软件的重要组成部分&#xff0c;提供了太多便利&#xff0c;也提升了建模、渲染和动画的效率&#xff0c;下面就给大家推荐25款常用的3dMax插件。 1&#xff09;DashedShape DashedShape实线转虚线…

树莓派上电发送IP地址到邮箱

创建python脚本文件 auto_send_email.py #!/usr/bin/python3import subprocess import smtplib from email.mime.text import MIMEText import datetime import time import osdef check_ping():hostname "www.baidu.com"response os.system("ping -c 1 &quo…

Redis对象——内存回收,对象共享和空转时长

一. 内存回收 因为C语言不具备内存回收功能&#xff0c;所以Redis在自己的对象系统中构建了一个引用计数技术实现内存回收机制。通过这一机制&#xff0c;程序可以通过跟踪对象的引用计数信息&#xff0c;在适当的时候自动释放对象并进行内存回收。 内每一个对象的引用计数信息…

2024美赛备战2--模型建立(*****必看****)

建模 美赛涉及的建模知识范围非常广且深&#xff0c;纵观美赛真题不难发现&#xff0c;很多的模型 都是读研或者读博的时候才会真正深入开始研究&#xff0c;因此&#xff0c;对于做建模的同学来说&#xff0c; 是无法在赛前吃透大量模型的。推荐本科生分两个步骤去有效准备比赛…

2022年拉丁美洲中东和非洲医疗机器人市场及全球概况报告

今天分享的是机器人系列深度研究报告&#xff1a;《2022年拉丁美洲中东和非洲医疗机器人市场及全球概况报告》。 &#xff08;报告出品方&#xff1a;Apollo Reports&#xff09; 报告共计&#xff1a;195页 研究方法论 2.1通过桌面研究和内部存储库的假设 a)最初&#xff…

Python爬取酷我音乐

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

Docker入门指南:从基础到实践

在当今软件开发领域&#xff0c;Docker已经成为一种不可或缺的工具。通过将应用程序及其依赖项打包成轻量级的容器&#xff0c;Docker实现了开发、测试和部署的高度一致性。本文将深入研究Docker的基本概念&#xff0c;并通过详细的示例代码演示如何应用这些概念于实际场景中。…

【Qt开发流程】之UI风格、预览及QPalette使用

概述 一个优秀的应用程序不仅要有实用的功能&#xff0c;还要有一个漂亮美腻的外观&#xff0c;这样才能使应用程序更加友善、操作性良好&#xff0c;更加符合人体工程学。作为一个跨平台的UI开发框架&#xff0c;Qt提供了强大而且灵活的界面外观设计机制&#xff0c;能够帮助…

moviepy基本参数用法大全

阅读本文档的前置说明&#xff1a; 本文档用于讲解Python的moviepy库的自带函数的用法&#xff0c;主要目的是讲一下每个函数的每个参数的含义&#xff0c;无需一开始就全部掌握&#xff0c;粗略看一下就行&#xff0c;可以在后面自己开发过程&#xff0c;遇到不会用的函数再回…

[Linux基础知识]页表

文章目录 1.页表 环境变量2.进程 1.页表 环境变量 一个分页存储管理系统中&#xff0c;地址长度为 32 位&#xff0c;其中页号占 8 位&#xff0c;则页表长度是 页号即页表项的序号&#xff0c;总共占8个二进制位&#xff0c;意味着页表项的个数就是2^8 在CPU和物理内存之间进行…

Axure官方软件安装、汉化保姆级教程(带官方资源下载)

1.下载汉化包 百度云链接&#xff1a;https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取码&#xff1a; jqxn 2.解压压缩包 3.安装Axure 进行安装 点击next 打勾&#xff0c;然后next, 默认是c盘&#xff0c;修改成自己的文件夹&#xff08;不要什么都放c盘里…

STM32MP157D-DK1开发板固件烧录

本篇介绍STM32MP157D-DK1开发板如何烧录官方固件。 1 开发板基础硬件介绍 1.1 常用接口 板子上的各种接口功如下&#xff0c;本篇固件烧录&#xff0c;主要用的接口包括&#xff1a; CN6&#xff1a;供电接口B2&#xff1a;复位按键CN11&#xff1a;ST-LINK USB&#xff08…

STM32F407-14.1.0-01高级定时器简介

TIM1 和 TIM8 简介 高级控制定时器&#xff08;TIM1 和 TIM8&#xff09;包含一个 16 位自动重载计数器&#xff0c;该计数器由可编程预分频器驱动。 此类定时器可用于各种用途&#xff0c;包括测量输入信号的脉冲宽度&#xff08;输入捕获&#xff09;&#xff0c;或者生成输出…

WooCommerce商城个人微信支付网关 适合个人微信收款

点击获取WooCommerce商城个人微信支付网关 适合个人微信收款原文https://gplwp.eastfu.com/product/woocommerce-ge-ren-wei-xin-zhi-fu-wang-guan-shi-he-ge-ren/ 个人微信支付网关接口&#xff0c;无需提现&#xff0c;100%资金安全&#xff0c;官方清算&#xff0c;金额无限…

外包干了2年,技术退步明显...

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Linux系统---基于Pipe实现一个简单Client-Server system

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、题目要求 Server是一个服务器进程&#xff0c;只能进行整数平方运算。Client要计算一个整数的平方的平方的平方&#xff0c;即…