当前位置:   article > 正文

用23种设计模式打造一个cocos creator的游戏框架----(十八)责任链模式_cocos creator中好用的游戏框架

cocos creator中好用的游戏框架

1、模式标准

模式名称:责任链模式

模式分类:行为型

模式意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

结构图:

适用于:

1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2、想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
3、可处理一个请求的对象集合应被动态指定 

2、分析与设计

前面我们了解了命令模式,命令是谁发出的呢,这里引出的责任链模式,巧好可以用上。将一次请技能释放求通过一串责任(命令)链接起来,不同责任(命令)做出不同的技能释放命令。我们假设场上有5个敌对单位时,ai单位释放小技能;有小于10个大于5个敌对单位时,ai单位释放中技能,有10个以上敌对单位时,ai单位释放大技能。

意图:使多个对象(命令)都有机会处理(技能释放)请求,从而避免(技能释放)请求的发送者和接收者之间的耦合关系。将这些对象(命令)连成一条链,并沿着这条链传递该(技能释放)请求,直到有一个对象(命令)处理它为止。

3、开始打造

技能触发基类

  1. export interface ITrigger {
  2. nextTrigger: ITrigger
  3. command: ICommand
  4. setNextTrigger(trigger: ITrigger): void
  5. entryTrigger(param: any): void
  6. canTrigger(param: any): boolean
  7. }
  8. export abstract class SkillTrigger implements ITrigger {
  9. nextTrigger: ITrigger
  10. command: ICommand
  11. setNextTrigger(trigger: ITrigger): void {
  12. this.nextTrigger = trigger;
  13. }
  14. setCommand(command: ICommand): void {
  15. this.command = command;
  16. }
  17. entryTrigger(skillTriggerRequest: ISkillTriggerRequest): void {
  18. console.log('entryTrigger', skillTriggerRequest, this)
  19. if (this.canTrigger(skillTriggerRequest)) {
  20. if (this.command) {
  21. this.command.execute();
  22. }
  23. } else if (this.nextTrigger) {
  24. this.nextTrigger.entryTrigger(skillTriggerRequest);
  25. } else {
  26. console.log("无其他触发器");
  27. }
  28. }
  29. abstract canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean;
  30. }

 小技能,中技能,大技能

  1. // 小技能触发器
  2. export class SmallSkillTrigger extends SkillTrigger {
  3. canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean {
  4. return skillTriggerRequest.enemyCount < 5; // 敌对单位数量小于5时释放小技能
  5. }
  6. }
  7. // 中技能触发器
  8. export class MediumSkillTrigger extends SkillTrigger {
  9. canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean {
  10. return skillTriggerRequest.enemyCount >= 5 && skillTriggerRequest.enemyCount < 10; // 敌对单位数量在5到10之间时释放中技能
  11. }
  12. }
  13. // 大技能触发器
  14. export class LargeSkillTrigger extends SkillTrigger {
  15. canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean {
  16. return skillTriggerRequest.enemyCount >= 10; // 敌对单位数量大于等于10时释放大技能
  17. }
  18. }

技能命令

  1. // 具体技能命令类 - 小技能
  2. export class SmallSkillCommand implements ICommand {
  3. execute(): void {
  4. console.log("释放小技能");
  5. }
  6. }
  7. // 具体技能命令类 - 中技能
  8. export class MediumSkillCommand implements ICommand {
  9. execute(): void {
  10. console.log("释放中技能");
  11. }
  12. }
  13. // 具体技能命令类 - 大技能
  14. export class LargeSkillCommand implements ICommand {
  15. execute(): void {
  16. console.log("释放大技能");
  17. }
  18. }

4、开始使用

  1. // 创建责任链
  2. const smallSkillTrigger = new SmallSkillTrigger();
  3. const mediumSkillTrigger = new MediumSkillTrigger();
  4. const largeSkillTrigger = new LargeSkillTrigger();
  5. // 创建命令
  6. const smallSkillCommand = new SmallSkillCommand();
  7. const mediumSkillCommand = new MediumSkillCommand();
  8. const largeSkillCommand = new LargeSkillCommand();
  9. // 设置触发器的命令
  10. smallSkillTrigger.setCommand(smallSkillCommand);
  11. mediumSkillTrigger.setCommand(mediumSkillCommand);
  12. largeSkillTrigger.setCommand(largeSkillCommand);
  13. smallSkillTrigger.setNextTrigger(mediumSkillTrigger);
  14. mediumSkillTrigger.setNextTrigger(largeSkillTrigger);
  15. let param = {
  16. enemyCount: 8
  17. }
  18. smallSkillTrigger.entryTrigger(param);
  19. // 输出
  20. // 释放中技能

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

闽ICP备14008679号