控制器中的功能并不多,主要是以下这些

//对玩家分数的操作
CC_SYNTHESIZE_READONLY(SaveData *, m_saveData, SaveData);
void update(float tm); //游戏暂停与恢复
void menuPauseCallback(cocos2d::Ref* pSender); //声音控制
void menuMusicCallback(cocos2d::Ref* pSender);

以下是这些功能的实现

bool Controller::init()
{
if (!Layer::init())
{
return false;
} bool bRect = false; do
{
Size winSize = Director::getInstance()->getWinSize(); //从xml文件里读取中文显示出来
auto dictionary = Dictionary::createWithContentsOfFile("fonts/AboutMe.xml");
score_label = Label::createWithTTF(
((__String *)(dictionary->objectForKey("score")))->getCString(),
"fonts/DFPShaoNvW5-GB.ttf",
25);
score_label->setPosition(score_label->getContentSize().width / 2,
winSize.height - score_label->getContentSize().height * 2);
CC_BREAK_IF(!score_label); this->addChild(score_label); //加入显示分数的标签
m_saveData = SaveData::create();
//这里一定要retain一下saveData。在析构函数中release一下
m_saveData->retain();
auto str = __String::createWithFormat("%d", m_saveData->getScore());
m_score = Label::createWithTTF(str->getCString(), "fonts/DFPShaoNvW5-GB.ttf", 25);
m_score->setPosition(Point(score_label->getContentSize().width + m_score->getContentSize().width / 2 + 30,
winSize.height - score_label->getContentSize().height * 2));
CC_BREAK_IF(!m_score); this->addChild(m_score);
//记得更新分数的显示
this->scheduleUpdate(); //游戏声音控制按钮
Sprite *normalMusic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_musicPause.png"));
Sprite *pressedMusic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_musicPause.png"));
pMusicItem = MenuItemSprite::create(
normalMusic,
normalMusic,
NULL,
CC_CALLBACK_1(Controller::menuMusicCallback, this)); //游戏暂停按钮
Sprite *normalPause = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_resume_nor.png"));
Sprite *pressedPause = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_resume_pressed.png"));
pPauseItem = MenuItemSprite::create(
normalPause,
pressedPause,
NULL,
CC_CALLBACK_1(Controller::menuPauseCallback, this)); Menu *menuPause = Menu::create(pMusicItem,pPauseItem, NULL);
menuPause->alignItemsHorizontallyWithPadding(pPauseItem->getContentSize().width/2);
menuPause->setPosition(
Point(winSize.width - pPauseItem->getContentSize().width*2, winSize.height - normalPause->getContentSize().height));
this->addChild(menuPause); } while (0); return true;
} //游戏暂停
void Controller::menuPauseCallback(cocos2d::Ref* pSender)
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/button.mp3");
if (!Director::getInstance()->isPaused())
{
// 图标状态设置
pPauseItem->setNormalImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_pause_nor.png")));
pPauseItem->setSelectedImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_pause_press.png")));
CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); // 停止背景音乐
CocosDenshion::SimpleAudioEngine::getInstance()->stopAllEffects(); // 停止全部的特效
Director::getInstance()->pause(); // 停止全部的动作,敌机飞行,子弹前进等
}
else
{
pPauseItem->setNormalImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_resume_nor.png")));
pPauseItem->setSelectedImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_resume_pressed.png")));
CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();// 恢复
Director::getInstance()->resume(); // 恢复
}
} void Controller::menuMusicCallback(cocos2d::Ref* pSender)
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/button.mp3");
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
// 图标状态设置
pMusicItem->setNormalImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_music.png")));
pMusicItem->setSelectedImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_music.png")));
CocosDenshion::SimpleAudioEngine::getInstance()->stopBackgroundMusic(); // 停止背景音乐
// CocosDenshion::SimpleAudioEngine::getInstance()->stopAllEffects(); // 停止全部的特效
}
else
{
pMusicItem->setNormalImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_musicPause.png")));
pMusicItem->setSelectedImage(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_musicPause.png")));
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/BackgroundMusic.mp3", true);// 恢复
// CocosDenshion::SimpleAudioEngine::getInstance()->resumeAllEffects();
}
} void Controller::update(float tm)
{
auto str = __String::createWithFormat("%d", m_saveData->getScore());
//更新分数和坐标
m_score->setColor(Color3B(255, 0, 0));
m_score->setString(str->getCString());
m_score->setPositionX(score_label->getContentSize().width + m_score->getContentSize().width / 2 + 30);
}

要实现游戏的暂停功能,能够直接将当前执行的场景暂停,而要实现声音的暂停。通过简单的停止背景音乐、音效却不行。

由于不断有新的子弹在发射、新的敌机在爆炸等。所以,我使用的方法是 将背景音乐与其它音效绑定。

比方以下子弹类中的代码

if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/bullet.wav");
}

仅仅有背景音乐处于播放状态,音效才会播放。

尽管功能实现了,只是总感觉方法太水了。。。谁有更好的方式欢迎告知。

【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现的更多相关文章

  1. cocos2dx实现经典飞机大战

    游戏开始层 #ifndef __LayerGameStart_H__ #define __LayerGameStart_H__ #include "cocos2d.h" USING ...

  2. 【一】仿微信飞机大战cocos2d-x3.0rc1

    參考 [偶尔e网事] 的 [cocos2d-x入门实战]微信飞机大战  cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下.能够通过以下链接跳转: cocos2d-x入 ...

  3. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  4. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)

    最近接触过几个版本的cocos2dx,决定每个大变动的版本都尝试一下.本实例模仿微信5.0版本中的飞机大战游戏,如图: 一.工具 1.素材:飞机大战的素材(图片.声音等)来自于网络 2.引擎:coco ...

  5. Cocos2d-x飞机大战教程笔记

    咳咳~跟着大神的教程学做Cocos2d-x的飞机大战...鉴于我是那种跟着教程都会出非常多错的人,所以还是一路跟着做些笔记比較好.并且因为是用课余时间,所以仅仅能断断续续地做,写下来也好让自己别忘记~ ...

  6. js实例--飞机大战

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  7. 用Javascript模拟微信飞机大战游戏

    最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...

  8. 飞机大战编写以及Java的面向对象总结

    面向对象课程完结即可编写一个简单的飞机大战程序.我觉得我需要总结一下 飞机大战中类的设计: 父类:FlyingObject(抽象类) 接口:Award .Enemy 子类:Hero.Bullet.Ai ...

  9. 用DIV+Css+Jquery 实现的旧版微信飞机大战。

    用jquery 实现的旧版微信飞机大战. 以前一直都是做后台和业务逻辑,前端很少去做, 现在个小游戏. 方向键控制方向,Ctrl 键 放炸弹(当然你的有炸弹,哈哈)! 主要都是用div+Css实现的, ...

随机推荐

  1. 【JAVAWEB学习笔记】22_ajax:异步校验用户名和站内查询

    Js原生Ajax和Jquery的Ajax 学习目标 案例1-异步校验用户名是否存在 案例2-站内查询 一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应 ...

  2. 【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1764  Solved: 965 Description Inp ...

  3. JAVA中关于大数问题

    这里只是java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 一.样例:java中的输出a+b import java.io ...

  4. editplus运行php 配置

    工具->配置用户工具->添加工具:Menu Text 改成runphp或者其他任名称.Command 安装的php.exe的地址.如D:\ wamp\php\php5.4.3\php.ex ...

  5. ThinkPHP -- magic_quotes_gpc()引起的反斜杠问题

    magic_quotes_gpc()引起的反斜杠问题,通常是因为没有事先判断它的状态,而对字符串进行处理引起的.   (本文学习借鉴于hechunhua楼主) 一般提供的服务器空间默认PHP 指令 m ...

  6. Linux知识(3)----常用快捷键和命令

    这里收集整理了一些常用的命令. 1.常用快捷键 这个链接介绍很全:http://blog.sina.com.cn/s/blog_8cb5c0e501012l7x.html 1. Ctrl + W: 关 ...

  7. 一些WPF中的滤镜特效——Effect Library

    WPF支持类似PhotoShop的滤镜功能,称之为Effect.在.Net 4.0中,WPF就废弃了对BitMapEffect的支持,转向使用支持GPU加速的Effect类,例如,我们可以使用如下代码 ...

  8. Oracle学习(八):处理数据

    1.知识点:能够对比以下的录屏进行阅读 SQL> --SQL语句 SQL> --1. DML语句(Data Manipulation Language 数据操作语言): insert up ...

  9. mysql配置文件my.ini优化详解

    mysql 5.5.13参数说明:[client]character-set-server = utf8port = 3306socket = /data/mysql/3306/mysql.sock[ ...

  10. Your first NHibernate based application

    Welcome to NHibernate If you're reading this, we assume that you've just downloaded NHibernate and w ...