用23種設計模式打造一個cocos creator的游戲框架----(十)迭代器模式

1、模式標準

模式名稱:迭代器模式

模式分類:行為型

模式意圖:提供一種方法順序訪問一個聚合對象中的各個元素,且不需要暴露該對象的內部表示.

結構圖:

?

適用于:

? ? 1、當你需要遍歷一個復雜的數據結構,如樹或圖,而不想公開其內部表示時。

? ? 2、當你有一個集合對象,需要提供多種遍歷方式,或者需要自定義遍歷方式時。

? ? 3、當你需要讓代碼獨立于特定的類或接口,使代碼能夠與多種數據類型一起工作時。

主要成員:

  1. 迭代器接口(Iterator):定義遍歷元素所需的方法,例如?next()hasNext()?等。

  2. 具體迭代器(Concrete Iterator):實現迭代器接口,并跟蹤遍歷的當前位置。

  3. 聚合接口(Aggregate):定義創建相應迭代器對象的接口。

  4. 具體聚合(Concrete Aggregate):實現聚合接口,返回具體迭代器的實例。

?2、分析與設計??

在游戲中會經常用到迭代器,一般情況下我們定義一個index,隨著游戲或者操作進行index++,來進行下一步對象或者操作。這里我們用到的場景是新手指引,當某個事件發生時,新手指引聚合器創建一個指引迭代器,指引迭代器指引玩家一步一步的按順序完成。

意圖:提供一種方法順序訪問一個聚合對象(新手指引聚合器)中的各個元素(新手指引),且不需要暴露該對象的內部表示

3、開始打造

?

// 聚合接口
export interface IAggregate {createIterator(): IIterator
}
// 具體的新手指引聚合
export class GuideAggregate implements IAggregate {steps: GuideStep[] = []addStep(step: GuideStep) {this.steps.push(step)}createIterator() {return new GuideIterator(this.steps)}
}
// 迭代器接口
export interface IIterator {hasNext(): booleannext(): any
}

// 具體的新手指引迭代器
export class GuideIterator implements IIterator {private index: number = 0steps: GuideStep[] = []constructor(steps: GuideStep[]) {this.steps = steps}hasNext(): boolean {return this.index < this.steps.length;}next(): GuideStep | null {if (this.hasNext()) {return this.steps[this.index++];} else {return null;}}
}

// 指引步驟
export class GuideStep {private onClickResolver: (() => void) | null = null;guideItem: IGuideItemconstructor(_item: IGuideItem) {this.guideItem = _item}execute() {const targetNode = find(this.guideItem.targetNodePath)// 注冊事件監聽器targetNode.on(Node.EventType.TOUCH_START, this.handleClick)return targetNode // 外面要用到先返回}// 當用戶點擊時,解決 Promiseprivate handleClick = () => {const targetNode = find(this.guideItem.targetNodePath)targetNode.off(Node.EventType.TOUCH_START, this.handleClick)if (this.onClickResolver) {this.onClickResolver();}}// 返回一個 Promise,該 Promise 在用戶點擊后被resolveonClick(): Promise<void> {console.log('等待點擊')return new Promise((resolve) => {this.onClickResolver = resolve;});}
}

4、開始使用

        let guides: IGuideItem[] = [{"group": "battle_start","targetNodePath": "root/UICanvas/battle_index/help_move_up","text": "點擊的虛框","text_size": [200, 200],"text_pos_index": 3}, {"group": "battle_start","targetNodePath": "root/UICanvas/battle_index/help_move_up","text": "點擊的虛框","text_size": [200, 200],"text_pos_index": 3}]// 開始本次的新手指引let guideAggregate = new GuideAggregate();guides.forEach((_item) => {guideAggregate.addStep(new GuideStep(_item));})async function runGuide(guide: GuideAggregate) {// 創建新手指引的指引層PlayerGuideSystem.createGuideNodes(comp)let iterator = guide.createIterator();while (iterator.hasNext()) {console.log('準備指引')let step = iterator.next();if (step !== null) {step.execute();await step.onClick();  // 等待用戶點擊console.log('點擊完成')}}// 清理新手指引的指引層PlayerGuideSystem.clearNodes()console.log('指導層清理完成')}runGuide(guideAggregate);

完工

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208626.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208626.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208626.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

promethesu告警規則配置,alertmanager通過webhook通知

文章目錄 前言一、promethesu告警二、告警配置編寫rule文件prometheus配置prometheus產生告警 三、告警通知prometheus 配置 alertmanageralertmanager 配置 webhook通知編寫接口接收 webhook 總結 前言 如果沒有學習過prometheus的基礎和監控的同學&#xff0c;可以先過一遍這…

融合科技,升級醫療體驗——醫院陪診服務的技術創新

隨著科技的迅猛發展&#xff0c;醫療服務領域也在積極借助技術手段提升患者體驗。本文將探討如何利用先進的技術代碼&#xff0c;將醫院陪診服務推向新的高度。 1. 醫療預約系統的實現 # 通過Python代碼實現醫療預約系統 class MedicalAppointment:def __init__(self, patie…

【Python】Numpy庫近50個常用函數詳解和示例,可作為工具手冊使用

本文以yolo系列代碼為基礎&#xff0c;在其中查找用到的numpy函數&#xff0c;包含近50個函數&#xff0c;本文花費多天&#xff0c;三萬多字&#xff0c;通過豐富的函數原理和示例對這些函數進行詳解。以幫助大家理解和使用。 目錄 np.array()運行示例 np.asarray()函數解析運…

unity 2d 入門 飛翔小鳥 場景延續(八)

1、新建c#腳本如下 代碼&#xff0c;在前方生成生成自身圖片并3s后銷毀自身&#xff0c;在碰撞物體后小鳥死亡后不刪除自身 using System.Collections; using System.Collections.Generic; using UnityEngine;public class CopyScene : MonoBehaviour { //要復制的對象public…

Amazon CodeWhisperer 提供新的人工智能驅動型代碼修復、IaC 支持以及與 Visual Studio 的集成...

Amazon CodeWhisperer 的人工智能&#xff08;AI&#xff09;驅動型代碼修復和基礎設施即代碼&#xff08;IaC&#xff09;支持已正式推出。Amazon CodeWhisperer 是一款用于 IDE 和命令行的人工智能驅動型生產力工具&#xff0c;現已在 Visual Studio 中推出&#xff0c;提供預…

uniapp封裝websocket文件(app、h5兼容)

適合場景&#xff1a;只需要發送一次數據&#xff0c;服務器可以實時返回數據進行渲染。 socket文件 let isSocketClose false; // 是否關閉socket let reconnectCount 5; // 重連次數 // let heartbeatInterval ""; // 心跳定時器 let socketTask null; // web…

uniapp實戰 —— 開發微信小程序的調試技巧

手機真機調試微信小程序 開發版和體驗版的小程序&#xff0c;域名沒有備案時想調試接口訪問效果&#xff0c;可以按下述方式操作&#xff1a; 在手機上點右上方三個點&#xff0c;點擊“開發調試”&#xff0c;開啟調試模式&#xff0c;即可真機訪問接口&#xff08;跳過域名校…

《C++新經典設計模式》之第21章 解釋器模式

《C新經典設計模式》之第21章 解釋器模式 解釋器模式.cpp 解釋器模式.cpp #include <iostream> #include <map> #include <stack> #include <vector> #include <cstring> #include <memory> #include <set> #include <sstream&g…

【Vue3從入門到項目實現】RuoYi-Vue3若依框架前端學習——動態路由與菜單欄

菜單欄 若依框架的側邊欄組件通常由菜單項和子菜單組成。 登錄后&#xff0c;會獲取用戶擁有的路由菜單 {"msg": "操作成功","code": 200,"data": [{"name": "System","path": "/system",…

第一百九十六回 通過藍牙發送數據的細節

文章目錄 1. 概念介紹2. 實現方法3. 代碼與效果3.1 示例代碼3.2 運行效果4. 經驗總結我們在上一章回中介紹了"分享三個使用TextField的細節"沉浸式狀態樣相關的內容,本章回中將介紹SliverList組件.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 通過藍牙設備…

[原創]C++98升級到C++20的復習旅途-個人感覺std::string_literals這個東西實現的不太人性化.

[簡介] 常用網名: 豬頭三 出生日期: 1981.XX.XX QQ聯系: 643439947 個人網站: 80x86匯編小站 https://www.x86asm.org 編程生涯: 2001年~至今[共22年] 職業生涯: 20年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、D…

git操作:使用vscode集成

git操作方式 其實git操作一般有三種方式 分別是終端命令行,開發工具集成,專業的git可視化工具 我前面幾章說的都是git的命令行操作,今天這篇文章主要是針對開發工具vscode集成git操作進行演示 說明一下,這里之所以選擇vscode,是因為本人用的就是vscode,每個開發工具基本都有…

最新PyTorch機器學習與深度學習實踐技術應用

近年來&#xff0c;隨著AlphaGo、無人駕駛汽車、醫學影像智慧輔助診療、ImageNet競賽等熱點事件的發生&#xff0c;人工智能迎來了新一輪的發展浪潮。尤其是深度學習技術&#xff0c;在許多行業都取得了顛覆性的成果。另外&#xff0c;近年來&#xff0c;Pytorch深度學習框架受…

mysql怎么優化查詢?

從多個維度優化&#xff0c;這里的優化維度有四個&#xff1a;硬件配置、參數配置、表結構設計和SQL語句及索引。 其中 SQL 語句相關的優化手段是最為重要的。 一、硬件配置 硬件方面的優化可以有 對磁盤進行擴容、將機械硬盤換為SSD&#xff0c;或是把CPU的核數往上提升一些…

IDEA中,Archetype的作用

在IntelliJ IDEA中&#xff0c;Archetype&#xff08;原型&#xff09;是一種用于創建項目的模板&#xff0c;它定義了項目的基本結構和初始文件。Archetype允許您通過預先構建好的項目框架來快速創建項目&#xff0c;從而節省了手動創建項目所需的時間和精力。 使用Archetype…

spark鏈接hive時踩的坑

使用spark操作hive&#xff0c;使用metastore連接hive&#xff0c;獲取hive的數據庫時&#xff0c;當我們在spark中創建數據庫的時候&#xff0c;創建成功。 同時hive中也可以看到這個數據庫&#xff0c;建表插入數據也沒有問題&#xff0c;但是當我們去查詢數據庫中的數據時&a…

IDEA 出現問題:Idea-操作多次commit,如何合并為一個并push解決方案

??作者主頁&#xff1a;小虛竹 ??作者簡介&#xff1a;大家好,我是小虛竹。2022年度博客之星評選TOP 10&#x1f3c6;&#xff0c;Java領域優質創作者&#x1f3c6;&#xff0c;CSDN博客專家&#x1f3c6;&#xff0c;華為云享專家&#x1f3c6;&#xff0c;掘金年度人氣作…

Python---繼承

1、什么是繼承 我們接下來來聊聊Python代碼中的“繼承”&#xff1a;類是用來描述現實世界中同一組事務的共有特性的抽象模型&#xff0c;但是類也有上下級和范圍之分&#xff0c;比如&#xff1a;生物 > 動物 > 哺乳動物 > 靈長型動物 > 人類 > 黃種人 從哲學…

prometheus服務發現之consul

文章目錄 前言一、Consul 在這里的作用二、原理三、實現過程安裝 consul節點信息&#xff08;exporter&#xff09;注冊進去consul節點信息&#xff08;exporter&#xff09;從consul解除注冊&#xff1a;prometheus配置consul地址 總結 前言 我們平時使用 prometheus 收集監控…

接口的性能優化(從前端、后端、數據庫三個角度分析)

接口的性能優化&#xff08;前端、后端、數據庫&#xff09; 主要通過三方面進行優化 前端后端數據庫 前端優化 接口拆分 不要搞一個大而全的接口&#xff0c;要區分核心與非核心的接口&#xff0c;不然核心接口就會被非核心接口拖累 或者一個接口中大部分返回都很快&…