【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现

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

//对玩家分数的操作
	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");
	}

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

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

时间: 2024-10-11 02:58:46

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

cocos2d中分步实现飞机大战----自己飞机的实现

上一节说了背景的滚动,现在开始布置游戏中自己的飞机,为了使GameScene的代码不至于太多,可以吧自己的飞机进行封装,在GameScene中调用就好.创建Plane: Plane.h: #include "cocos2d.h" USING_NS_CC; class plane:public Node{ public: int hp=100; int px,py; CREATE_FUNC(plane); bool init(); void moveTo(int x,int y); };

cocos2d中分步实现飞机大战----游戏场景中背景的滚动

上一节说了场景的跳转,现在开始布置游戏游戏界面.在游戏的主界面,首先要有游戏背景,为了使GameScene的代码不至于太多,可以吧自己的背景进行封装,在GameScene中调用就好,飞机的正常飞行移动可以用北京的移动来实现.创建BackGround: background.h: #include "cocos2d.h" USING_NS_CC; class background:public Node{ public: CREATE_FUNC(background); bool ini

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

最近接触过几个版本的cocos2dx,决定每个大变动的版本都尝试一下.本实例模仿微信5.0版本中的飞机大战游戏,如图: 一.工具 1.素材:飞机大战的素材(图片.声音等)来自于网络 2.引擎:cocos2d-1.0.1-x-0.9.2 3.环境:vs2010 二.使用的类 1.游戏菜单界面类:PlaneWarMenu——派生自CCLayer类. 1 // 游戏菜单界面类 2 class PlaneWarMenu: public CCLayer 3 { 4 public: 5 virtual bo

Cocos2d-x飞机大战教程笔记

咳咳~跟着大神的教程学做Cocos2d-x的飞机大战...鉴于我是那种跟着教程都会出非常多错的人,所以还是一路跟着做些笔记比較好.并且因为是用课余时间,所以仅仅能断断续续地做,写下来也好让自己别忘记~ 2014/4/22  Day01 从apk解压获取素材.再用TexturePacker拼接成plist和png. 话说TexturePacker是收费的啊...7天免费,还能够申请1年的使用期. 之前看书还看到有个神器叫zwoptex,貌似是免费的.可惜仅仅有Mac版...╮(╯_╰)╭Howev

《简单的飞机大战》事实上不简单(1)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>这是一个很easy的<经典飞机大战>游戏.实现的基本功能:包含Boss的随机生成,击中销毁:分数依据击毁Boss的数量添加. 附加功能有:道具的不定时产生,

cocos2d-x-3.3-024-仿微信飞机大战-如何引爆炸弹-实现范围攻击

原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接 承上文 先回答拓展思考里的问题,'物理引擎可否用来做碰撞检测?',答案是肯定的,具体见下面 cocos2d-x-3.3-019-碰撞检测1-矩形区域是否相交 cocos2d-x-3.3-020-碰撞检测2-物理引擎初探 cocos2d-x-3.3-021-碰撞检测3-物理引擎碰撞过滤 子弹如何杀伤敌人在上面的系列中已经实现.本节要实现的功能点是,继续利用碰撞检测实现飞机大战里炸弹的全屏范围攻击 本文DEMO 基于cocos2d-x

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

參考 [偶尔e网事] 的 [cocos2d-x入门实战]微信飞机大战  cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下.能够通过以下链接跳转: cocos2d-x入门实战 这里面我以[cocos2d-x入门实战]微信飞机大战 为蓝本,用cocos2dx 3.0rc1翻版.安装环境什么的,我就不说了,网上都能够找到,我直接从游戏開始界面说起. 想往下看的话,你必须会的一件事,就是你已经能创建出cocos2dx3.rc1的helloworldproject. 以下

《简单的飞机大战》其实不简单(1)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>这是一个非常简单的<经典飞机大战>游戏,实现的基本功能:包括Boss的随机生成,击中销毁:分数根据击毁Boss的数量增加.附加功能有:道具的不定时产生,当英

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

在飞机大战游戏开发中遇到的问题和解决方法: 1.在添加菜单时,我要添加一个有背景的菜单,需要在菜单pMenu中添加一个图片精灵,结果编译过了但是运行出错,如下图: 查了很多资料,调试了很长时间,整个人都要崩溃了. 最后发现引擎中CCMenu::itemForTouch函数中有遍历子节点的行为,但是循环中没有判断子节点类型是否为CCMenuItem.如图:码,这样一来,加入到pMenu中的图片精灵被当作菜单项取了出来使用,导致报错.老版本的果然又不完善的地方,整个人都不好了...果断修改引擎里的源