微信小游戏之三消(三)道具相关方法

news2024/9/9 0:20:01

设计一个 game class。负责了游戏的核心控制逻辑,包括游戏状态管理、方块和道具的生成与效果处理,以及游戏的重新开始和复活流程。通过这些方法,脚本实现了游戏的基本玩法和用户交互。

主要游戏控制方法

  • gameStart():开始游戏,恢复所有方块状态,初始化分数管理器,设置地图。

  • mapSet(num):初始化地图,生成随机的方块布局。

  • checkNeedFall():检查是否需要下落的防抖方法。

  • onFall():方块下落的逻辑。

  • gameOver():游戏结束的逻辑,添加复活页面。

  • askRevive():处理复活请求,显示复活页面。

  • onReviveButton():复活按钮的点击事件。

  • showReviveSuccess():显示复活成功的页面。

  • onReviveCertainBtn():处理确定复活的按钮点击事件。

  • restart():重新开始游戏。

道具相关方法

  • onUserTouched(iid, jid, itemType, color, warning, pos):存储用户点击的方块信息,用于生成道具。

  • generatePropItem(type):根据类型生成道具。

  • checkGenerateProp(chain):检查并生成连锁道具效果。

  • onItem(type, color, pos):处理道具效果,如分数翻倍、炸弹消除等。

预制体实例化方法

  • generatePool():生成对象池,用于方块的实例化和回收。

  • instantiateBlock(self, data, parent, itemType, pos):实例化单个方块,初始化方块组件。

  • recoveryAllBlocks():回收所有方块节点,用于游戏重新开始或结束。

onUserTouched方法实现了处理用户触摸方块或方块被其他方块触发时的逻辑,包括状态检查、动画播放和连锁反应处理。

// onUserTouched 方法用于处理用户触摸方块时的逻辑
onUserTouched(color, isChain, isBomb, time) {
  // 如果提供了延迟时间参数,则使用 setTimeout 延迟执行 onTouched
  if (time) {
    setTimeout(() => {
      this.onUserTouched(color, false, isBomb); // 延迟调用时默认不连锁
    }, time);
    return;
  }

  // 确保 isChain 和 isBomb 参数被正确设置,如果是 null 或 undefined,则给予默认值
  isChain = JSON.stringify(isChain) == 'null' ? true : isChain;
  isBomb = isBomb ? true : false;

  // 保存当前对象的引用
  let self = this;

  // 如果方块状态为可触发,并且是炸弹触发,播放死亡动画然后处理消除逻辑
  if (this._status == 1 && isBomb == true) {
    this._status = 2; // 更新方块状态为已消失
    this.playDieAction().then(() => {
      this.onBlockPop(color, isChain, isBomb); // 处理方块消除后的连锁反应
    });
    return;
  }

  // 如果 color 对象包含 type 属性,表示是用户主动触发的触摸事件
  if (color && color.type) {
    // 如果是用户主动触发,并且方块状态为可触发,游戏状态为可玩,颜色匹配
    if (this._status == 1 && this._game._status == 1 && this.color == color) {
      // 调用游戏的 onUserTouched 方法处理用户触摸事件
      this._game.onUserTouched(this.iid, this.jid, this._itemType, this.color, this.warningType, {
        x: this.node.x,
        y: this.node.y
      });

      // 异步处理分数变化,如果成功则播放死亡动画并处理消除逻辑
      this._game._score.onStep(-1).then((res) => {
        if (res) {
          this.playDieAction().then(() => {
            this.onBlockPop(color, null, null); // 处理消除后的连锁反应
          });
        }
      });
    }
  } else {
    // 如果 color 对象不包含 type 属性,表示是其他方块触发的事件
    // 检查方块状态和游戏状态,如果颜色匹配则播放死亡动画并处理消除逻辑
    if (this._status == 1 && this._game._status == 5 && this.color == color) {
      this.playDieAction().then(() => {
        this.onBlockPop(color, null, null); // 处理消除后的连锁反应
      });
    }
  }
},

详细步骤:

  1. 延迟处理:如果提供了 time 参数,使用 setTimeout 延迟执行 onUserTouched 方法。

  2. 参数校验:确保 isChain 和 isBomb 参数被正确设置,如果不是有效的布尔值,则给予默认值。

  3. 保存当前对象引用:使用 let self = this; 保存当前对象的引用,以便在回调中使用。

  4. 炸弹触发处理:如果方块状态为可触发,并且 isBomb 为 true,更新方块状态并播放死亡动画,然后处理消除逻辑。

  5. 用户主动触发处理:

    • 如果 color 对象包含 type 属性,表示是用户主动触发的触摸事件。

    • 检查方块状态、游戏状态和颜色是否匹配,如果匹配,调用游戏逻辑处理用户触摸事件。

  6. 分数变化处理:异步处理分数变化,如果成功,播放死亡动画并处理消除逻辑。

  7. 其他方块触发处理:

    • 如果 color 对象不包含 type 属性,表示是其他方块触发的事件。

    • 检查方块状态和游戏状态,如果颜色匹配,播放死亡动画并处理消除逻辑。

  8. 处理连锁反应:在 onBlockPop 方法中处理消除后的连锁反应,这可能包括更新分数、检查消除情况等。

generatePropItem 方法实现了异步生成道具方块的逻辑,确保了游戏在生成道具时的流畅性和动画效果。

/**
 * generatePropItem 方法用于生成道具方块
 * @param {number} type - 道具类型
 * @return {Promise} - 返回一个Promise对象,用于异步处理道具生成
 */
generatePropItem(type) {
  return new Promise((resolve, reject) => {
    // 获取当前对象的引用
    let self = this;

    // 检查方块是否已经有道具类型,如果没有则设置默认值
    type = type ? type : 0;

    // 获取方块的实例,如果对象池中有可用的实例则使用,否则创建新的实例
    let block = null;
    if (self.blockPool && self.blockPool.size() > 0) {
      block = self.blockPool.get();
    } else {
      block = cc.instantiate(this.blockPrefab);
    }

    // 设置方块的父节点为blocksContainer,即方块容器
    block.parent = this.blocksContainer;

    // 重置方块的位置和缩放
    block.scale = 1;
    block.x = 0;
    block.y = 0;

    // 初始化方块组件,传入方块数据和道具类型
    block.getComponent('cell').init(self, {
      x: this.target.j, // 列位置
      y: this.target.i, // 行位置
      color: this.target.color, // 方块颜色
      width: this.blockWidth, // 方块宽度
      startTime: null // 动画开始时间
    }, type);

    // 设置方块的动画开始时间,可能基于方块在地图上的位置
    block.getComponent('cell').startTime = (this.target.i + this.target.j + 1) * self._controller.config.json.startAnimationTime / this.rowNum;

    // 将新生成的道具方块放置到目标位置
    block.setPosition(this.target.x, this.target.y);

    // 延迟一定时间后解析Promise,表示道具生成完成
    setTimeout(() => {
      resolve();
    }, 300);
  });
},

详细步骤:

  1. 定义方法和参数:generatePropItem 方法接受一个参数 type,表示生成的道具类型。

  2. 返回 Promise:返回一个新的 Promise 对象,用于异步处理道具生成。

  3. 获取当前对象引用:使用 let self = this; 获取当前对象的引用,以便在回调函数中使用。

  4. 检查道具类型:如果 type 参数未提供或无效,则设置默认值为0。

  5. 获取方块实例:检查对象池 blockPool 是否存在且有可用的方块实例,如果有则从对象池中获取,否则实例化一个新的方块。

  6. 设置方块父节点:将方块的父节点设置为 blocksContainer,即方块容器节点。

  7. 重置方块位置和缩放:重置方块的位置和缩放,确保方块在生成时从正确的位置和大小开始。

  8. 初始化方块组件:使用 init 方法初始化方块组件,传入方块数据和道具类型。

  9. 设置动画开始时间:根据方块在地图上的位置,设置方块的动画开始时间。

  10. 设置方块位置:将方块的 setPosition 设置为 this.target.x 和 this.target.y,即目标位置。

  11. 延迟解析 Promise:使用 setTimeout 在300毫秒后解析 Promise,表示道具生成完成。

onItem 函数是处理用户与道具交互的逻辑部分当玩家使用不同类型的道具时,游戏能够正确地响应并执行相应的效果。

// 当用户使用道具时调用此函数
// type 表示道具的类型
// color 表示道具的颜色
// pos 表示道具使用的位置
onItem(type, color, pos) {
  switch (type) {
    case 1: // 分数翻倍道具
      // 初始化分数翻倍提示框
      this._score.tipBox.init(this._score, 1);
      // 为指定颜色的方块添加分数翻倍效果
      this._score.addMult(color, pos);
      // 播放双倍分数的音效
      this._controller.musicMgr.onDouble();
      // 对所有处于活动状态的方块执行表面效果动作
      this.executeSurfaceActionForActiveBlocks(pos);
      break;

    case 2: // 炸弹道具,消除同种颜色的方块
      // 初始化炸弹提示框
      this._score.tipBox.init(this._score, 2);
      // 游戏界面震动效果
      this.node.runAction(AC.shackAction(0.1, 10));
      // 如果社交模块处于激活状态,则触发手机震动
      if (this._controller.social.node.active) {
        this._controller.social.onShakePhone();
      }
      // 设置道具连锁标志为真
      this.isPropChain = true;
      // 播放炸弹爆炸的音效
      this._controller.musicMgr.onBoom();
      // 对所有同色且非锁定状态的方块执行触摸效果,并消除
      this.executeTouchEffectAndEliminateSameColorBlocks(color);
      break;

    case 3: // 加步数道具
      // 初始化步数增加提示框
      this._score.tipBox.init(this._score, 4);
      // 播放双倍分数的音效
      this._controller.musicMgr.onDouble();
      // 对所有活动状态的方块执行表面效果动作
      this.executeSurfaceActionForActiveBlocks(pos);
      // 增加步数
      this._score.onStep(3).then();
      break;

    case 4: // 消除全部单身的方块
      // 初始化消除单身方块提示框
      this._score.tipBox.init(this._score, 5);
      // 设置道具连锁标志为真
      this.isPropChain = true;
      // 播放魔法效果的音效
      this._controller.musicMgr.onMagic();
      // 对所有单身且非锁定状态的方块执行触摸效果,并消除
      this.executeTouchEffectAndEliminateSingleBlocks(pos);
      break;
  }
},

// 对所有处于活动状态的方块执行表面效果动作
executeSurfaceActionForActiveBlocks(pos) {
  for (let i = 0; i < this.rowNum; i++) {
    for (let j = 0; j < this.rowNum; j++) {
      if (this.map[i][j] && this.map[i][j].getComponent('cell')._status == 1) {
        let distance = Math.sqrt(Math.pow(pos.x - this.map[i][j].x, 2) + Math.pow(pos.y - this.map[i][j].y, 2));
        if (distance != 0) {
          this.map[i][j].getComponent('cell').surfaceAction(distance);
        }
      }
    }
  }
},

// 对所有同色且非锁定状态的方块执行触摸效果,并消除
executeTouchEffectAndEliminateSameColorBlocks(color) {
  for (let i = 0; i < this.rowNum; i++) {
    for (let j = 0; j < this.rowNum; j++) {
      if (this.map[i][j] && this.map[i][j].getComponent('cell').color == color && this.map[i][j].getComponent('cell')._status != 2) {
        this.map[i][j].getComponent('cell').onTouched(color, false, true);
      } else {
        this.map[i][j].runAction(AC.rockAction(0.2, 10));
      }
    }
  }
},

// 对所有单身且非锁定状态的方块执行触摸效果,并消除
executeTouchEffectAndEliminateSingleBlocks(pos) {
  for (let i = 0; i < this.rowNum; i++) {
    for (let j = 0; j < this.rowNum; j++) {
      if (this.map[i][j] && this.map[i][j].getComponent('cell').isSingle && this.map[i][j].getComponent('cell')._status != 2) {
        let distance = Math.sqrt(Math.pow(pos.x - this.map[i][j].x, 2) + Math.pow(pos.y - this.map[i][j].y, 2));
        this.map[i][j].getComponent('cell').onTouched(color, false, true, distance);
      }
    }
  }
},

详细步骤:

  1. case 1:当用户使用分数翻倍道具时,初始化提示框,为指定颜色的方块添加分数翻倍效果,并播放音效。然后对所有活动状态的方块执行表面效果动作。

  2. case 2:当用户使用炸弹道具时,初始化提示框,执行界面震动效果,如果社交模块激活则触发手机震动。设置道具连锁标志,播放音效,并消除所有同色且非锁定状态的方块。

  3. case 3:当用户使用加步数道具时,初始化提示框,播放音效,对所有活动状态的方块执行表面效果动作,并增加步数。

  4. case 4:当用户使用消除单身方块道具时,初始化提示框,设置道具连锁标志,播放音效,并消除所有单身且非锁定状态的方块。

  5. 辅助函数:executeSurfaceActionForActiveBlocks 对所有活动状态的方块执行表面效果动作;executeTouchEffectAndEliminateSameColorBlocks 对所有同色且非锁定状态的方块执行触摸效果并消除;executeTouchEffectAndEliminateSingleBlocks 对所有单身且非锁定状态的方块执行触摸效果并消除。

更多详细分析 看以下链接

微信小游戏之三消(三)道具相关方法 (qq.com)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzI0NTE3ODY5Mg==&mid=2247483773&idx=1&sn=fb65288026d00df5333d0cfb9dca8ee8&chksm=e953c956de24404046a54cc11c6b1be51db21803666226616067be8fd06effa75b2f9fb4577b&token=2142210075&lang=zh_CN#rd

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

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

相关文章

攻防世界 re 新手模式 2

IgniteMe 32位无壳 一些简单信息&#xff0c;看关键函数 可以得到v7[i]的值 比较简单的逆向 #include<stdio.h> #include<string.h> int main() {char flag[40];char s[40];char str[]"GONDPHyGjPEKruv{{pj]XrF";char ch[] {0x0D, 0x13, 0x17, 0x11,…

AI到底有没有前景?到底要不要学习AI?

前言 在当今这个科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了一个热门话题。对于想要进入这一领域的学习者来说&#xff0c;心中难免会有一些疑问&#xff1a;“AI到底有没有前景&#xff1f;”、“我到底要不要学习AI&#xff1f;”、“我学…

Vue使用阿里巴巴字体

阿里巴巴字体使用效果 字体包下载 官方下载链接 解压字体文件到指定的文件夹 引用字体文件 我的是uniApp的项目&#xff0c;所以在公共css样式中引用这个字体文件 /*每个页面公共css */ font-face {font-family: "alimamFont";font-weight: 400;src: url("~/s…

Could not install packages due to an EnvironmentError: [WinError 5]

Could not install packages due to an EnvironmentError: [WinError 5] 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城…

WordPress原创插件:启用关闭经典编辑器和小工具

WordPress原创插件&#xff1a;启用关闭经典编辑器和小工具 主要功能 如图所示&#xff0c;用于启用或禁用经典编辑器和经典小工具&#xff0c;以替代Gutenberg编辑器。 插件下载 https://download.csdn.net/download/huayula/89592822

[Windows CMD] 检测网络连通性 ping

ping 是一个非常常用的网络工具&#xff0c;用于测试网络连接的可达性和测量网络延迟。它通过发送 ICMP (Internet Control Message Protocol) Echo Request 数据包到目标主机&#xff0c;并等待接收回显应答 (Echo Reply) 来工作。ping 命令可以帮助您快速检测网络问题&#x…

oracle 19c RAC-OracleLinux8.10安装19c遇到的问题

问题一&#xff1a; 操作系统是OracleLinux8.10 使用$ORACLE_HOME/gridSetup.sh -applyPSU /patch/36582629 安装集群正常&#xff0c;但安装数据库软件时 $ORACLE_HOME/runInstaller -applyPSU /patch/36582629报错&#xff0c;因赶工不使用applyPSU参数安装正常&#xff0c…

一款超实用的网络实时监控工具,助你轻松掌握 Docker 容器网络状态

1. 什么是 check-docker-connection check-docker-connection 主要用于监控 Docker 容器的网络连接情况。它可以显示指定容器的网络连接状态&#xff0c;包括 TCP 和 UDP 连接的数量。用户可以通过容器 ID 或名称来指定要监控的容器&#xff0c;或者指定显示连接数最多的前 N …

linux:用户管理,增删改

1.查看当前登录的用户信息 [root@bgx ~]# id #查看当前所登陆的用户信息 # uid:用户id,系统只能识别uid,不能识别名字,人看名字 # gid:组id uid=0(root) gid=0(root) groups=0(root) [root@bgx ~]# id oldboy #查看其它用户的信息 uid=1000(oldboy) gid=1000(oldboy) g…

【CTFHub】文件上传漏洞详解!

Webshell&#xff1a; 又称一句话木马。WebShell就是以网页文件形式存在的一种代码执行环境&#xff0c;主要用于网站管理、服务器管理、权限管理等操作。 WebShell根据不同的语言分为:ASP木马、PHP木马、JSP木马(上传解析类型取决于网站服务端编写语言类)&#xff0c;该类木马…

生成式人工智能的下一代基础设施是集群系统

GenAI 的存储和网络 本研究报告探讨了生成式人工智能 (GenAI) 在转变人工智能数据中心方面的关键作用。强调了存储和网络在支持人工智能/机器学习工作负载方面的重要性。 我们强调需要高容量、经济高效的存储&#xff0c;以处理不同数据处理阶段的不同 I/O 模式。 还讨论了检…

如何使用CANoe自带的TCP/IP Stack验证TCP的零窗口探测机制

如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少…

项目实战_表白墙(简易版)

你能学到什么 一个比较简单的项目&#xff1a;表白墙&#xff08;简易版&#xff09;&#xff0c;浏览器&#xff1a;谷歌升级版将在下个博客发布 效果如下 正文 说明 我们是从0开始一步一步做这个项目的&#xff0c;里面的各种问题&#xff0c;我也会以第一人称视角来解…

国服最强文字转音频?Fish Speech

官网文档与示例 Fish Speech V1.2 是一款领先的文本到语音 (TTS) 模型&#xff0c;使用 30 万小时的英语、中文和日语音频数据进行训练。我尝试用1066运行&#xff0c;但是质量不尽如人意&#xff0c;建议使用RTX系列的显卡进行推理。 使用结果展示 text """20…

有哪些高性价比开放式耳机推荐?五大实力超群热门款分享

开放式耳机的优点包括不堵塞耳道&#xff0c;佩戴稳固性高&#xff0c;能较好的感知外界的声音等等&#xff0c;以上这些优势使得开放式耳机特别适配户外运动场景&#xff0c;在工作、日常生活等场景下使用也是绰绰有余。有哪些高性价比开放式耳机推荐&#xff1f;如果你还不知…

常用传感器讲解十五--触摸传感器(KY-036)

常用传感器讲解十五–触摸传感器&#xff08;KY-036&#xff09; 具体讲解 这个比较简单&#xff0c;就是触摸后给个信号 电路连接 在Arduino上将VCC引脚连接到5V。 将GND连接到Arduino的GND。 将OUT连接到Arduino上的D2 代码实现 void setup() {pinMode(2, INPUT);Seri…

鸿蒙HarmonyOS开发:@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

文章目录 一、装饰器二、概述三、限制条件四、装饰器说明五、Toggle组件1、子组件2、接口3、ToggleType枚举4、事件 六、示例演示1、代码2、效果 一、装饰器 State装饰器&#xff1a;组件内状态Prop装饰器&#xff1a;父子单向同步Link装饰器&#xff1a;父子双向同步Provide装…

大模型是如何“炼”成的?揭秘AI背后的训练秘籍!

在当今科技飞速发展的时代&#xff0c;大模型&#xff08;Large Language Models&#xff09;已成为人工智能领域的璀璨明星。它们如同经过精心雕琢的艺术品&#xff0c;能够处理各种复杂的任务。然而&#xff0c;这些大模型并非天生如此强大&#xff0c;它们需要经过严格的训练…

VScode | 我的常用插件分享

系列文章目录 本系列文章主要分享作位前端开发的工具之------VScode的使用分享。 文章目录 目录 系列文章目录 文章目录 前言 一、Vetur 三、别名路径跳转 四、Prettier 五、koroFileHeader 六、vue-helper 总结 前言 本文主要分享VScode的好用插件。 一、Vetur Vue的Vetur插…