《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗、按键音效等)则要通过playEffect来播放。本节使用该方法以及之前学到的菜单按钮的用法,制作了一个简单的“钢琴”游戏,其中部分代码如范例3-8所示,完整代码详见源文件本章目录下的ChapterThree06项目。
【范例3-8 利用Cocos2d-x实现简单的钢琴】
#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h" //用于播放音乐
USING_NS_CC;
Scene* HelloWorld::createScene()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
; i <= ; i++) //预加载7个音符的mp3文件
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect(
String::createWithFormat("%d.mp3",i)->getCString());
}
//通过按钮,创建7个琴键
auto* pButton1 = MenuItemImage::create("button1.png",
"button2.png",
this,
menu_selector(HelloWorld::note1));
auto* button1 = Menu::create(pButton1, NULL);
button1->setPosition(, ); //设置按钮位置
addChild(button1);
/**此处省略了其他5个按钮的创建过程**/
auto* pButton7 = MenuItemImage::create("button1.png",
"button2.png",
this,
menu_selector(HelloWorld::note7));
auto* button7 = Menu::create(pButton7, NULL);
button7->setPosition( + * , ); //按钮x坐标为 50+90*i其中i为按键编号减1
addChild(button7);
return true;
}
//第一个按键的响应操作,播放第1个音符
void HelloWorld::note1(Cocos2d::Object* pSender)
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("1.mp3");
}
//此处省略了其他5个音符的响应操作
void HelloWorld::note7(Cocos2d::Object* pSender)
{
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("7.mp3");
}
运行之后的界面如图3-13所示。当用户点击按键时按键将发生变化,并播放对应音符的声音效果。

图3-13 “钢琴”界面

图3-14 点击屏幕中的按键将播放音乐
播放这类较短音乐的方法与之前介绍的playBackgroundMusic方法是完全相同的,只不过要将方法名全部改为playEffect就可以了。
此外,由于这类音乐是要反复播放的,比如在钢琴中某个音符是要反复被播放的,而游戏中某些怪物的叫声也是要反复出现的。如果每次要调用playEffect时都会重新对音乐文件进行加载,这就造成了资源浪费,因此可以在场景初始化的时候对这些文件进行一个统一的预加载,如范例第17~22行所示。
提示:实际上在使用playBackgroundMusic方法时也需要对音乐进行预加载,只不过在之前的范例中被简化了。另外实际开发中还需要在程序退出时释放加载了的音乐,释放的方法为unloadEffect。

自学必备!!
《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像
《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字
《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴的更多相关文章
- cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何 ...
- cocos2dx游戏开发——微信打飞机学习笔记(七)——Enemy的搭建
一.文件创建~ Enemy.h Enemy.cpp 二.How to do? 由于我是已经完成成个游戏的功能,所以我会将游戏中enemy所需要的很多功能基本上都先考虑到了,如果大家自己在做的时候也许没 ...
- Django 学习笔记之六 建立一个简单的博客应用程序
最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...
- Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境
Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...
- [原创]java WEB学习笔记12:一个简单的serlet连接数据库实验
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
- UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信
1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...
- cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备
一.环境的搭建 1.Windows开发准备: (1)软件下载及安装 •下载Cocos2d-x 最新版本:http://www.cocos2d-x.org/download 或者从Cocos2d-x G ...
- cocos2dx游戏开发——微信打飞机学习笔记(四)——GameScene的搭建
一.创建文件 首先呢,就是那个创建新的.h 和 .cpp 的文件,然后可以起名为GameScene 最重要的就是一定要创建在Classes的目录下哦= =,别手抖= =. 二.GameScene.h和 ...
随机推荐
- C# 4.0 不要跨程序集用dynamic指向匿名类型 (转载)
今天写代码时偷懒用了dynamic,结果遇到问题,运行时始终无法获取dynamic对象的属性.原问题简化后如下: 程序集A包含SampleClass类,有一个静态方法,接收一个dynamic类型参数并 ...
- 使用supervior 监控 elasticsearch 进程
elasticsearch引擎在使用中可能会出现后台守护进程挂掉的情况,需要手动启动来恢复正常. 这时则可以引用supervior进程管理工具来监控elasticsearch进程状态,实现进程挂掉自动 ...
- FCC Truncate a string 解决方法
三行搞定 function truncate(str, num) { ab = str.length >num?num>3?str.slice(0,num-3)+ "...&qu ...
- Java I/O系列(一)InputStream与OutputStream源码分析及理解
1. InputStream 定义 字节输入流,是一个抽象类,核心是通过read()方法,从数据源中读取一个个字节出来,另有skip,mark功能 核心源码理解 源码: public abstract ...
- 复习宝典之Mysql数据库
查看更多宝典,请点击<金三银四,你的专属面试宝典> 第一章:mysql数据库 1)mysql与mariaDb MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用 ...
- Nginx与Tomcat实现请求动态数据与请求静态资源的分离
上篇博客说明了Nginx在应用架构中的作用,以及负载均衡的思路.这篇实践一下其中的访问静态资源与访问动态资源的操作. 一.认识访问静态资源与访问动态资源的区别 静态资源:指存储在硬盘内的数据,固定的数 ...
- JavaScript中的this详解(彻底弄懂js中的this用法)!
要想学好js,那么其中那些特别令人混淆迷惑的知识点,就一定要弄清楚.this关键字就是其中让初学者比较迷惑的知识点之一,不过灵活运用this可以提升代码的性能和复用性,那么今天我就和大家一起来了解th ...
- transform动画的一个3D的正方体盒子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- day 35初识数据库
一.数据库概述 1.什么是数据库?先来看看百度怎么说的. 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作. 所谓“数据库”系 ...
- Node.js 引用 gm 包错误 Error: Could not execute GraphicsMagick/ImageMagick
今天在学习前后台图像剪切时,下载了有图片剪切瑞士军刀之称的 GraphicsMagick. 给 gm.exe 配置了环境变量,在 npm 下好了 gm 的模块,但是运行却出现了错误. 错误如图: [E ...