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

设计一个 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 延迟执行 onTouchedif (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.rhkb.cn/news/386957.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL常见指令

MySQL中的数据类型 大致分为五种&#xff1a;数值&#xff0c;日期和时间&#xff0c;字符串&#xff0c;json&#xff0c;空间类型 每种类型也包括也一些不同的子类型&#xff0c;根据需要来选择。 如数值类型包括整数类型和浮点数类型 整数类型根据占用的存储空间的不同 又…

Cocos Creator2D游戏开发(7)-飞机大战(5)-让子弹飞

飞机大战(5)-碰撞及积分 参考敌机的生成 子弹由飞机生成,放在player_node节点子弹重复使用,要使用预制体;子弹新增了动画 ①创建一个预制体 命名为playerBullet_prefab ② 双击预制体将bullet1图片拖入预制体 保存,关闭(场景编辑器里面的) ③ 发射子弹 player加入代码 prop…

听说它可以让代码更优雅

一提到静态代码检查工具这个词应该比较好理解&#xff0c;所谓静态代码检查工具就是检查静态代码的工具&#xff0c;完美~ 言归正传&#xff0c;相信很多程序员朋友都听说过静态代码检查工具这个概念&#xff0c;它可能是我们IDE里的某一个插件&#xff0c;可能是计算机中的一…

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案

RK3588作为目前市面能买到的最强国产SOC&#xff0c;有强大的硬件配置。在智能汽车飞速发展&#xff0c;对图像数据矿场要求越来越多的环境下&#xff0c;如何高效采集数据&#xff0c;或者运行AI应用&#xff0c;成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…

Spring验证码

前言&#xff1a;使用Hutool 1.什么是Hutool&#xff1f; 2.代码复制到test类中 3.代码爆红&#xff0c;说明需要引入依赖 4.根据名取Maven仓库相关依赖 5.在pom.xml文件中进行配置 6.引入成功 7. 运行程序 打开d盘&#xff0c;发现已经生成了验证码的图片&#xff0c;路径在…

Codeforces Round 654 (Div. 2) C. A Cookie for You (模拟)

我认为这道题就是个脑筋急转弯。 首先我们知道当a b < n m的时候&#xff0c;饼干总数都不够人的总数&#xff0c;那肯定是NO。 并且注意题干&#xff0c;我们可以得知当a b的时候&#xff0c;第一类和第二类人可以任意选两种饼干中的一种。 之后我们可以分类讨论一下。 …

网格布局 HTML CSS grid layout demo

文章目录 页面效果代码 (HTML CSS)参考 页面效果 代码 (HTML CSS) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

[ BLE4.0 ] 伦茨ST17H66开发-串口UART0的接收与发送

目录 一、前言 二、实现步骤 1.设置回调函数 2.关闭睡眠模式 三、效果展示 四、工程源代码 一、前言 串口通信在任何一款单片机开发中都是尤为重要的。本文涉及的开发所使用的例程依然是基于[ BLE4.0 ] 伦茨ST17H66开发-OSAL系统中添加自己的Task任务文章的工程源码&#x…

windows@powershell@任务计划@自动任务计划@taskschd.msc.md

文章目录 使用任务计划windows中的任务计划任务计划命令行程序开发windows 应用中相关api传统图形界面FAQ schtasks 命令常见用法创建计划任务删除计划任务查询计划任务修改计划任务运行计划任务 PowerShell ScheduledTasks常用 cmdlet 简介1. Get-ScheduledTask2. Register-Sc…

Git远程仓库推送

这里我只连接了两个站点的远程仓库&#xff0c;一个是国内的Gitee&#xff0c;另一个是Github&#xff0c;这两个站点的连接方式主要有两种&#xff0c;第一种就是通过https来连接远程仓库&#xff0c;另一种是通过ssh公钥来连接&#xff0c;这两个站点练接的大致过程都是一样的…

我出一道面试题,看看你能拿 3k 还是 30k!

大家好&#xff0c;我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场&#xff0c;接下来我会出一道经典的后端面试题&#xff0c;你只需要进行 4 个简单的选择&#xff0c;就能判断出来你的水平是新手&#xff08;3k&#xff09;、初级&#xff08;10k&#xff09;、中…

4 款最佳 C# 无头浏览器

摘要&#xff1a; 在当今大数据时代&#xff0c;高效的数据采集成为众多项目的关键一环。对于偏好C#语言的开发者而言&#xff0c;无头浏览器是实现网页自动化交互、数据抓取的强大工具。本文将深入探讨四款顶尖的C#无头浏览器库&#xff0c;分析它们的特性和应用场景&#xf…

怎么把C盘分成两个盘?让C盘分区更简单,赶快试试!

在日常使用电脑的过程中&#xff0c;有时我们可能希望将C盘分割成两个独立的分区&#xff0c;以便更好地管理文件和数据。这种操作需要谨慎进行&#xff0c;因为错误的分区操作可能导致数据丢失。那么&#xff0c;我们该怎么把C盘分成两个盘呢&#xff1f;下面&#xff0c;我将…

lua 游戏架构 之 游戏 AI (六)ai_auto_skill

定义一个为ai_auto_skill的类&#xff0c;继承自ai_base类。ai_auto_skill类的目的是在AI自动战斗模式下&#xff0c;根据配置和条件自动选择并使用技能。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读379次。定义了一套接口和属性&#…

vue3在元素上绑定自定义事件弹出虚拟键盘

最近开发中遇到一个需求: 焊接机器人的屏幕上集成web前端网页, 但是没有接入键盘。这就需要web端开发一个虚拟键盘,在网上找个很多虚拟键盘没有特别适合,索性自己写个简单的 图片: 代码: (代码可能比较垃圾冗余,也没时间优化,凑合看吧) 第一步:创建键盘组件 为了方便使用…

3.2.微调

微调 ​ 对于一些样本数量有限的数据集&#xff0c;如果使用较大的模型&#xff0c;可能很快过拟合&#xff0c;较小的模型可能效果不好。这个问题的一个解决方案是收集更多数据&#xff0c;但其实在很多情况下这是很难做到的。 ​ 另一种方法就是迁移学习(transfer learning…

c++如何理解多态与虚函数

目录 **前言****1. 何为多态**1.1 **编译时多态**1.1.1 函数重载1.1.2 模板 **1.2 运行时多态****1.2.1 虚函数****1.2.2 为什么要用父类指针去调用子类函数** **2. 注意****2.1 基类的析构函数应写为虚函数****2.2 构造函数不能设为虚函数** **本文参考** 前言 在学习 c 的虚…

打造重庆市数字化教育“新名片”,广阳湾珊瑚中学凭实力“出圈”!

分布于教学楼连廊顶部的智能照明设备,根据不同的时间和场景需求自动调节灯光亮度和开关状态;安装于各个教室内的智能黑板、学校同步时钟、学生互动设备,在极简以太全光网的赋能下,为师生提供丰富的教学体验与学习支持......行走于重庆市广阳湾珊瑚中学,像是与充满科技感的“校园…

病理AI领域的基础模型汇总|顶刊专题汇总·24-07-26

小罗碎碎念 本期文献主题&#xff1a;病理AI领域的最新基础模型 今天的推文是一期生日特辑&#xff0c;定时在下午六点二十一分发表&#xff08;今天农历六月二十一&#xff0c;哈哈&#xff09;&#xff0c;算是自己给自己的24岁生日礼物&#xff0c;希望24岁这一年&#xff0…

ollama本地部署大语言模型记录

目录 安装Ollama更改模型存放位置 拉取模型GemmaMistralQwen1.5(通义千问)codellama 部署Open webui测试性能知识广度问题1问题2 代码能力总结 最近突然对大语言模型感兴趣 同时在平时的一些线下断网的CTF比赛中&#xff0c;大语言模型也可以作为一个能对话交互的高级知识检索…