当前位置:   article > 正文

用23种设计模式打造一个cocos creator的游戏框架----(十)迭代器模式_cocos creator 3.x 游戏框架

cocos creator 3.x 游戏框架

1、模式标准

模式名称:迭代器模式

模式分类:行为型

模式意图:提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示.

结构图:

适用于:

    1、当你需要遍历一个复杂的数据结构,如树或图,而不想公开其内部表示时。

    2、当你有一个集合对象,需要提供多种遍历方式,或者需要自定义遍历方式时。

    3、当你需要让代码独立于特定的类或接口,使代码能够与多种数据类型一起工作时。

主要成员:

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

  2. 具体迭代器(Concrete Iterator):实现迭代器接口,并跟踪遍历的当前位置。

  3. 聚合接口(Aggregate):定义创建相应迭代器对象的接口。

  4. 具体聚合(Concrete Aggregate):实现聚合接口,返回具体迭代器的实例。

 2、分析与设计  

在游戏中会经常用到迭代器,一般情况下我们定义一个index,随着游戏或者操作进行index++,来进行下一步对象或者操作。这里我们用到的场景是新手指引,当某个事件发生时,新手指引聚合器创建一个指引迭代器,指引迭代器指引玩家一步一步的按顺序完成。

意图:提供一种方法顺序访问一个聚合对象(新手指引聚合器)中的各个元素(新手指引),且不需要暴露该对象的内部表示

3、开始打造

 

  1. // 聚合接口
  2. export interface IAggregate {
  3. createIterator(): IIterator
  4. }
  1. // 具体的新手指引聚合
  2. export class GuideAggregate implements IAggregate {
  3. steps: GuideStep[] = []
  4. addStep(step: GuideStep) {
  5. this.steps.push(step)
  6. }
  7. createIterator() {
  8. return new GuideIterator(this.steps)
  9. }
  10. }
  1. // 迭代器接口
  2. export interface IIterator {
  3. hasNext(): boolean
  4. next(): any
  5. }
  1. // 具体的新手指引迭代器
  2. export class GuideIterator implements IIterator {
  3. private index: number = 0
  4. steps: GuideStep[] = []
  5. constructor(steps: GuideStep[]) {
  6. this.steps = steps
  7. }
  8. hasNext(): boolean {
  9. return this.index < this.steps.length;
  10. }
  11. next(): GuideStep | null {
  12. if (this.hasNext()) {
  13. return this.steps[this.index++];
  14. } else {
  15. return null;
  16. }
  17. }
  18. }
  1. // 指引步骤
  2. export class GuideStep {
  3. private onClickResolver: (() => void) | null = null;
  4. guideItem: IGuideItem
  5. constructor(_item: IGuideItem) {
  6. this.guideItem = _item
  7. }
  8. execute() {
  9. const targetNode = find(this.guideItem.targetNodePath)
  10. // 注册事件监听器
  11. targetNode.on(Node.EventType.TOUCH_START, this.handleClick)
  12. return targetNode // 外面要用到先返回
  13. }
  14. // 当用户点击时,解决 Promise
  15. private handleClick = () => {
  16. const targetNode = find(this.guideItem.targetNodePath)
  17. targetNode.off(Node.EventType.TOUCH_START, this.handleClick)
  18. if (this.onClickResolver) {
  19. this.onClickResolver();
  20. }
  21. }
  22. // 返回一个 Promise,该 Promise 在用户点击后被resolve
  23. onClick(): Promise<void> {
  24. console.log('等待点击')
  25. return new Promise((resolve) => {
  26. this.onClickResolver = resolve;
  27. });
  28. }
  29. }

4、开始使用

  1. let guides: IGuideItem[] = [{
  2. "group": "battle_start",
  3. "targetNodePath": "root/UICanvas/battle_index/help_move_up",
  4. "text": "点击的虚框",
  5. "text_size": [200, 200],
  6. "text_pos_index": 3
  7. }, {
  8. "group": "battle_start",
  9. "targetNodePath": "root/UICanvas/battle_index/help_move_up",
  10. "text": "点击的虚框",
  11. "text_size": [200, 200],
  12. "text_pos_index": 3
  13. }]
  14. // 开始本次的新手指引
  15. let guideAggregate = new GuideAggregate();
  16. guides.forEach((_item) => {
  17. guideAggregate.addStep(new GuideStep(_item));
  18. })
  19. async function runGuide(guide: GuideAggregate) {
  20. // 创建新手指引的指引层
  21. PlayerGuideSystem.createGuideNodes(comp)
  22. let iterator = guide.createIterator();
  23. while (iterator.hasNext()) {
  24. console.log('准备指引')
  25. let step = iterator.next();
  26. if (step !== null) {
  27. step.execute();
  28. await step.onClick(); // 等待用户点击
  29. console.log('点击完成')
  30. }
  31. }
  32. // 清理新手指引的指引层
  33. PlayerGuideSystem.clearNodes()
  34. console.log('指导层清理完成')
  35. }
  36. runGuide(guideAggregate);

完工

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/152548
推荐阅读
相关标签
  

闽ICP备14008679号