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

//对玩家分数的操作
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. Python编程举例-iter和next结合定制可迭代对象

    class Foo: def __init__(self,n): self.n = n def __iter__(self): return self def __next__(self): if s ...

  2. 【栈模拟dfs】Cells UVALive - 3486

    题目链接:https://cn.vjudge.net/contest/209473#problem/D 题目大意:有一棵树,这棵树的前n个节点拥有子节点,告诉你n的大小,以及这n个节点各有的子节点个数 ...

  3. asp.net core结合Gitlab-CI实现自动化部署

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在之前的文章中写过k8s+Jenkins+GitLab-自动化部署asp.net core项目 的topic,这次讲解一 ...

  4. Git in Powershell saying 'Could not find ssh-agent'

    加入系统环境变量D:\Program Files\Git\usr\bin

  5. python语言特性总结

    一直想学习python,虽然编程写了不少,但有时仍不得要领.这篇blog主要是记录python的一些主要特性. 前言 python学习总结,包括python的一些基本语法,高级特性,函数式编程,面向对 ...

  6. BZOJ 4516: [Sdoi2016]生成魔咒 后缀自动机 性质

    http://www.lydsy.com/JudgeOnline/problem.php?id=4516 http://blog.csdn.net/doyouseeman/article/detail ...

  7. 执行时间 Exercise07_16

    import java.util.Arrays; import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:执行时间 * */ pu ...

  8. bzoj1798 维护序列

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  9. [转]JSONObject,JSONArray使用手册

    您的评价:          收藏该经验       这两个是官网的API JSONObject API JSONArray API 里面有这两个类的所有方法,是不可多得的好材料哦~ 配合上面的API ...

  10. [转]安卓虚拟机启动后报错: 类似 SDK Manager] Error: Error parsing .devices.xml 解决方案

    昨天用android sdk manager 更新了android sdk, 我是在myeclipse上面安装adt来开发android的现在每次打开myeclipse都报错, 而且我每次打开虚拟机的 ...