当前位置: 首页 > news >正文

cocos creator让所有button点击时播放音效

原理:

利用prototype属性,通过重写 cc.Button.prototype._onTouchEnded 方法,以便在按钮被点击时播放音频。通过重写其 _onTouchEnded 方法,可以添加自定义行为,如播放音频。

概念解释:

prototype:每个 JavaScript 函数都有一个 prototype 属性,这个属性是一个对象。这个对象包含了所有实例对象共享的属性和方法。JavaScript 对象通过原型链实现继承。当你访问一个对象的属性或方法时,JavaScript 引擎会首先在对象自身上查找。如果找不到,它会沿着原型链(prototype)向上查找,直到找到该属性或方法,或者到达原型链的顶端(即 null)。

onTouchEnded:onTouchEnded 是 cc.Button 类的一个私有方法,它处理按钮的触摸结束事件。

以下是详细的实现步骤和代码示例:

实现步骤

  1. 保存原始方法:保存 cc.Button.prototype._onTouchEnded 方法,以便在重写方法中调用原始行为。而不影响默认的方法。
  2. 重写方法:重写 cc.Button.prototype._onTouchEnded 方法,在新方法中添加播放音频的功能,然后调用原始方法。

实现代码

// 假设 AudioManager 是一个管理音频播放的单例类
class AudioManager {public static playButtonClickAudio() {// 播放按钮点击音效的逻辑console.log("Button click audio played");}
}class CustomButton {public static hackCCButtonToPlayAudio() {// 保存原始的 _onTouchEnded 方法const originalOnTouchEnded = cc.Button.prototype._onTouchEnded;// 重写 _onTouchEnded 方法cc.Button.prototype._onTouchEnded = function (event) {// 播放按钮点击音效AudioManager.playButtonClickAudio();// 调用原始的 _onTouchEnded 方法originalOnTouchEnded.call(this, event);};}
}// 在游戏初始化时调用这个方法
CustomButton.hackCCButtonToPlayAudio();

扩展功能 

有时我们并不希望所有按钮都播放同一个音效,对于有些按钮我们需要播放定制的音效,或者说我们需要根据不同的按钮标签来播放不同的音效。

这时可以在需要的按钮上添加一个自定义属性,用于指定要播放的音效文件。然后,在重写 _onTouchEnded 方法时,根据这个属性来播放对应的音效。

在 Cocos Creator 编辑器中,选中需要自定义音效的按钮节点,添加一个名为 customAudio 的属性,并设置其值为对应的音效文件名。

// 假设 AudioManager 是一个管理音频播放的单例类
class AudioManager {public static playAudio(audioName: string) {// 播放指定音效的逻辑console.log(`Playing audio: ${audioName}`);// 实际播放音效的代码,根据你的音频管理实现}public static playButtonClickAudio() {// 播放默认按钮点击音效的逻辑this.playAudio("default_button_click");}
}class CustomButton {public static hackCCButtonToPlayAudio() {// 保存原始的 _onTouchEnded 方法const originalOnTouchEnded = cc.Button.prototype._onTouchEnded;// 重写 _onTouchEnded 方法cc.Button.prototype._onTouchEnded = function (event) {// 获取 customAudio 属性const customAudio = this.node.getComponent(cc.Button).customAudio;if (customAudio) {// 播放自定义音效AudioManager.playAudio(customAudio);} else {// 播放默认按钮点击音效AudioManager.playButtonClickAudio();}// 调用原始的 _onTouchEnded 方法originalOnTouchEnded.call(this, event);};}
}// 在游戏初始化时调用这个方法
CustomButton.hackCCButtonToPlayAudio();

 根据按钮的不同标签来播放不同的音效,可以通过获取按钮的 label 属性来实现。

// 假设 AudioManager 是一个管理音频播放的单例类
class AudioManager {public static playAudio(audioName: string) {// 播放指定音效的逻辑console.log(`Playing audio: ${audioName}`);// 实际播放音效的代码,根据你的音频管理实现}public static playButtonClickAudio() {// 播放默认按钮点击音效的逻辑this.playAudio("default_button_click");}
}class CustomButton {public static hackCCButtonToPlayAudio() {// 保存原始的 _onTouchEnded 方法const originalOnTouchEnded = cc.Button.prototype._onTouchEnded;// 重写 _onTouchEnded 方法cc.Button.prototype._onTouchEnded = function (event) {// 获取按钮节点上的 Label 组件const label = this.node.getComponentInChildren(cc.Label);if (label) {// 获取标签文本内容const labelText = label.string;// 根据标签文本内容播放不同的音效switch (labelText) {case "Play":AudioManager.playAudio("play_button_click");break;case "Pause":AudioManager.playAudio("pause_button_click");break;case "Stop":AudioManager.playAudio("stop_button_click");break;default:// 播放默认按钮点击音效AudioManager.playButtonClickAudio();break;}} else {// 如果没有 Label 组件,播放默认按钮点击音效AudioManager.playButtonClickAudio();}// 调用原始的 _onTouchEnded 方法originalOnTouchEnded.call(this, event);};}
}// 在游戏初始化时调用这个方法
CustomButton.hackCCButtonToPlayAudio();

相关文章:

cocos creator让所有button点击时播放音效

原理: 利用prototype属性,通过重写 cc.Button.prototype._onTouchEnded 方法,以便在按钮被点击时播放音频。通过重写其 _onTouchEnded 方法,可以添加自定义行为,如播放音频。 概念解释: prototype&#…...

mybatisplus自带的雪花算法(IdType.ASSIGN_ID)无法自动生成弊端缺点,以及改进方法

前言 今日在使用mybatisplus的雪花算法自动给id赋值时发现怎么都是null的情况,这尼玛测了半天,终于发现巨坑,废话不多说,直接上干货 IService.save 只有调用IService中的save方法才能正常生成id,像IService.saveBatc…...

单位转换:将kb转换为 MB ,GB等形式

写法一&#xff1a; function formatSizeUnits(kb) {let units [KB, MB, GB, TB, PB,EB,ZB,YB];let unitIndex 0;while (kb > 1024 && unitIndex < units.length - 1) {kb / 1024;unitIndex;}return ${kb.toFixed(2)} ${units[unitIndex]}; } console.log(for…...

优思学院|「按计划推动型」与「需求拉动型」的生产模式

针对生产架构做对比分类的用语&#xff0c;主要有按计划推进型与需求拉动型。 「按计划推动型」与「需求拉动型」两者乃是生产架构上常使用、成对比的两个用语。不过&#xff0c;有时不只用来指单纯的生产现场架构&#xff0c;也有人把它应用在更广泛的生产架构设计上。 按计划…...

解释什么是lambda函数?它有什么好处?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

码农:如何快速融入团队

问题&#xff1a; 码农如何快速融入团队&#xff1f; 记住一个标准&#xff1a;能干事、能抗事。 总结一个字&#xff1a; 靠谱。 适用范围&#xff1a;新手码农、老司机码农、测试、DBA、运维、产品经理、项目经理、架构师、技术专家、。。。。适用于任何行业的打工者。 下面要…...

Android 通知组

一. 通知组简介 从 Android 7.0&#xff08;API 级别 24&#xff09;开始&#xff0c;您可以在一个组中显示相关通知。如下所示: 图 1. 收起&#xff08;顶部&#xff09;和展开&#xff08;底部&#xff09;的通知组。 注意 &#xff1a;如果应用发出 4 条或更多条通知且未…...

【机器学习】ChatTTS:开源文本转语音(text-to-speech)大模型天花板

目录 一、引言 二、TTS&#xff08;text-to-speech&#xff09;模型原理 2.1 VITS 模型架构 2.2 VITS 模型训练 2.3 VITS 模型推理 三、ChatTTS 模型实战 3.1 ChatTTS 简介 3.2 ChatTTS 亮点 3.3 ChatTTS 数据集 3.4 ChatTTS 部署 3.4.1 创建conda环境 3.4.2 拉取源…...

宏集物联网工控屏通过 S7 ETH 协议采集西门子 1200 PLC 数据

前言 为了实现和西门子PLC的数据交互&#xff0c;宏集物联网HMI集成了S7 PPI、S7 MPI、S7 Optimized、S7 ETH等多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC。 本文主要介绍宏集物联网HMI如何通过S7 ETH协议采集西门子1200 PLC的数据&#xff0c;文中详细介…...

C语言学习记录(十一)——指针基本知识及运算

文章目录 前言1. 指针的概念2.指针变量的说明3. 指针的含义4. 指针运算①指针加减&#xff1a;②指针的关系运算符 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 1. 指针的概念 在C语言中&…...

Oracle中 ROW_NUMBER()的语法及在对应不同需求下应如何使用

Oracle数据库中的ROW_NUMBER()函数是一个窗口函数&#xff0c;它为查询结果集中的每一行分配一个唯一的序号。这个函数在数据分析、分页查询、数据去重和排名问题等方面非常有用。ROW_NUMBER()函数的语法如下&#xff1a; ROW_NUMBER() OVER ( [ PARTITION BY column ] ORDER …...

德邦快递大件可以寄2米长物品吗?大件跨省行李用哪个快递便宜?

搬家或寄送特殊尺寸物品时&#xff0c;快递的选择尤为关键。特别是2米长的大件物品&#xff0c;是否能够承运&#xff1f;哪家快递在跨省大件行李方面更经济&#xff1f;今天&#xff0c;就为你解答这些疑问。 1、祺祺寄快递小程序&#xff1a; “祺祺寄快递”小程序&#xff…...

C# 在WPF .net8.0框架中使用FontAwesome 6和IconFont图标字体

文章目录 一、在WPF中使用FontAwesome 6图标字体1.1 下载FontAwesome1.2 在WPF中配置引用1.2.1 引用FontAwesome字体文件1.2.2 将字体文件已资源的形式生成 1.3 在项目中应用1.3.1 使用方式一&#xff1a;局部引用1.3.2 使用方式二&#xff1a;单个文件中全局引用1.3.3 使用方式…...

万能自定义预约小程序源码系统 适合任何行业在线预约报名 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;线上预约已成为各行各业不可或缺的一部分。为满足广大企业和个人对在线预约系统的需求&#xff0c;我们特别推出了这款“万能自定义预约小程序源码系统”。该系统以其高度的灵活性和可扩展性&#xff0c;为各行各业提供了完美的在线预约…...

【MySQL备份】mysqldump篇

目录 1.简介 2.基本用途 3.命令格式 3.1常用选项 3.2常用命令 4.备份脚本 5.定时执行备份脚本 1.简介 mysqldump 是 MySQL 数据库管理系统的命令行实用程序&#xff0c;用于创建数据库的逻辑备份。它能够导出数据库的结构&#xff08;如表结构、视图、触发器等&#xf…...

控制台扫雷(C语言实现)

目录 博文目的实现思路项目创建文件解释 具体实现判断玩家进行游戏还是退出扫雷棋盘的确定地图初始化埋雷玩家扫雷的实现雷判断函数 源码game.cgame.h扫雷.c 博文目的 相信不少人都学习了c语言的函数&#xff0c;循环&#xff0c;分支那我们就可以写一个控制台的扫雷小游戏来检…...

操作系统期末复习 | 批处理程序 | PV实现同步互斥 | 调度算法 | 页面置换算法 | 磁盘调度算法

操作系统引论 批处理程序 单道批处理&#xff1a;引入脱机输入/输出技术&#xff0c;并由监督程序负责控制作业的输入、输出。主要优点是缓解了一定程度的人机速度矛盾&#xff0c;资源利用率有所提升。主要缺点是内存中仅能有一道程序运行&#xff0c;只有该程序运行结束之后…...

字符串的六种遍历方式

在 Java 中&#xff0c;有多种遍历字符串的方法。以下是几种常见的遍历字符串的方法&#xff0c;并附有示例代码 1. 使用 for 循环 这是最常见和基础的遍历方法&#xff0c;通过索引访问每个字符。 public class StringTraversal {public static void main(String[] args) {S…...

在码云(Gitee)上建立分支(Branch)的步骤如下:

步骤一&#xff1a;登录码云 首先&#xff0c;打开码云的官方网站&#xff08;gitee.com&#xff09;&#xff0c;输入用户名和密码登录你的账号。 步骤二&#xff1a;创建仓库 登录后&#xff0c;在页面右上方的搜索框中输入仓库名称&#xff0c;并点击“创建”按钮创建新的仓…...

JVM专题四:JVM的类加载机制

Java中类的加载阶段 类加载 Java中的类加载机制是Java运行时环境的一部分&#xff0c;确保Java类可以被JVM&#xff08;Java虚拟机&#xff09;正确地加载和执行。类加载机制主要分为以下几个阶段&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;这个阶段&#x…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...