上一节学习了使用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--实战一个简单的钢琴的更多相关文章

  1. cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建

    一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何 ...

  2. cocos2dx游戏开发——微信打飞机学习笔记(七)——Enemy的搭建

    一.文件创建~ Enemy.h Enemy.cpp 二.How to do? 由于我是已经完成成个游戏的功能,所以我会将游戏中enemy所需要的很多功能基本上都先考虑到了,如果大家自己在做的时候也许没 ...

  3. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

  4. Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境

    Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...

  5. [原创]java WEB学习笔记12:一个简单的serlet连接数据库实验

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  7. UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信

    1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...

  8. cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备

    一.环境的搭建 1.Windows开发准备: (1)软件下载及安装 •下载Cocos2d-x 最新版本:http://www.cocos2d-x.org/download 或者从Cocos2d-x G ...

  9. cocos2dx游戏开发——微信打飞机学习笔记(四)——GameScene的搭建

    一.创建文件 首先呢,就是那个创建新的.h 和 .cpp 的文件,然后可以起名为GameScene 最重要的就是一定要创建在Classes的目录下哦= =,别手抖= =. 二.GameScene.h和 ...

随机推荐

  1. VS2012打开Web项目提示《ASP.NET 4.X 尚未在Web服务器上注册。你需要手动将...》解决方案

    用VS12创建的WEB项目时,默认使用IIS Experess开发服务器,但是每次打开会提示如下提示 但是同一个项目用VS13或VS15打开时,就能正常打开,不会出现以上提示信息. 怀疑是IIS Ex ...

  2. 关于DP

    关于DP 似乎摸到了门槛呢,学着学着Dijkstra突然有了感觉. 我们遍历的时候会遍历整张图的每个点每条边,然后与已知的对比大小,如果比现在方案好,就放入数组 那么,DP岂不是同样的思想? 在背包问 ...

  3. python 用户注册用户名

    实现用户注册网站,编辑用户名时判断是否已经存在: 若存在则提示“The name you used have already existed,please change your name” 若不存在 ...

  4. 10JavaScript作用域

    (作用域可访问变量的集合) 1.JavaScript 作用域 在 JavaScript 中, 对象和函数同样也是变量. 在 JavaScript 中, 作用域为可访问变量,对象,函数的集合. Java ...

  5. redis必会

    1.NosqL 非关系型数据库,里面包含Redis和MondoDB2.为什么会用到关系型数据库?因为当数据量太多,访问人数过多的时候,在访问关系型数据库时会到硬盘里进行读写过多 这样就会导致访问速度很 ...

  6. Field Security Profile Helper

    using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; /// <summary> /// 安全字 ...

  7. 每天一个Linux命令之mkdir

    Linux mkdir命令 mkdir [-p] filename 用于创建一个空目录 如果该目录下有相同名称的目录那么会报错 apple@apple-Pro  ~/Documents/java_d ...

  8. U盘直接读写(今天用到了)

    #ifndef INVALID_SET_FILE_POINTER #define INVALID_SET_FILE_POINTER (DWORD)-1 #endif #define FILE_BEGI ...

  9. ASP.NET 并发控制

    当多个用户试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响.处理这种情况的系统叫做“并发控制”. 并发控制的类型 通常,管理数据库中的并发有三种常见 ...

  10. PL/SQL轻量版(三)——游标与异常处理

    一.游标 1.概念 游标是一个 指向上下文的句柄( handle) 或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上下文区会发生些什么事情. 2.游标处理 处理显式游标 主要包含以下四个 ...