原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11999229

一个游戏打到一半尿点咋整?难道要憋着。。。这不科学啊!

好吧,把暂停游戏和恢复游戏的功能加进去吧,否则也太对不起观众了!

1.暂停功能的加入

再给游戏加个层叫ControlLayer,这个层包含了2个元素,暂停功能和分数显示功能。分数显示和本地存储在后面介绍。

我们先看看暂停功能是怎么加入的。

//加入暂停按钮
bool ControlLayer::init()
{bool bRet=false;do {CC_BREAK_IF(!CCLayer::init());CCSize winSize=CCDirector::sharedDirector()->getWinSize();//加入PauseMenuCCSprite* normalPause=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_pause_nor.png"));CCSprite* pressedPause=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_pause_pressed.png"));pPauseItem=CCMenuItemImage::create();//创建CCMenuItempPauseItem->initWithNormalSprite(normalPause,pressedPause,NULL,this,menu_selector(ControlLayer::menuPauseCallback));//载入双态图和回调函数pPauseItem->setPosition(ccp(normalPause->getContentSize().width/2+10,winSize.height-normalPause->getContentSize().height/2-10));CCMenu *menuPause=CCMenu::create(pPauseItem,NULL);//创建CCMenu,可以这么理解CCMenuItem是CCMenu的孩子menuPause->setPosition(CCPointZero);this->addChild(menuPause,101);bRet=true;} while (0);return bRet;
}
//暂停按键的回调函数
void ControlLayer::menuPauseCallback(CCObject* pSender)
{if(!CCDirector::sharedDirector()->isPaused())//如果游戏处于正常状态{//更改为恢复按钮的双态pPauseItem->setNormalSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_resume_nor.png"));pPauseItem->setSelectedSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_resume_pressed.png"));CCDirector::sharedDirector()->pause();//暂停游戏,这是导演控制的}else//否则{//更改为暂停按钮的双态pPauseItem->setNormalSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_pause_nor.png"));pPauseItem->setSelectedSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_pause_pressed.png"));CCDirector::sharedDirector()->resume();//开麦拉!}
}

这里没有使用CCMenuItemToggle的原因是它没办法实现一个图案的两个状态(normal和pressed),所以这里我手动进行替换。

2.游戏暂停状态下的触摸问题

如果就这么完了,那也弱爆了。。。游戏的调试过程中发现了这么一个问题,当游戏暂停的时候,主角飞机仍然可以跟随触摸移动,这个bug就坑爹了,你可以在快挂掉的时候按下pause,把飞机挪到安全的位置,然后再按下resume,死不了了。。。

原来cocos2d-x在暂停CCScene之后触摸仍然是有效的,所以我们需要在暂停之后屏蔽触摸。

这个的解决方案主要是两种:

(1)使用CCLayer的setTouchEnabled方法,但是这样可能会引起程序的崩溃,因为系统在派发触摸事件时发现响应列表为空,会触发一个断言。

(2)写一个NoTouchLayer,在这个层里响应触摸并吞噬触摸操作,使比它游戏级低的无法接收到触摸分发。但是优先级又不能高于CCMenu,也就是-128,不然恢复按钮也会被屏蔽,导致游戏无法恢复,除非是同一优先级。使用方法就是addChild和removeChild。关于触摸事件和优先级,请移步:http://blog.csdn.net/jackystudio/article/details/11860007,再次强调,触摸优先级和addChild的Z轴顺序无关。

//NoTouchLayer.h
class NoTouchLayer :public CCLayer
{
public:virtual bool init();   // implement the "static node()" method manually LAYER_CREATE_FUNC(NoTouchLayer); virtual void registerWithTouchDispatcher(); virtual bool ccTouchBegan (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); virtual void ccTouchMoved (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); virtual void ccTouchEnded (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
};//NoTouchLayer.cpp
bool NoTouchLayer::init(){  if (!CCLayer::init() )  {  return false;  }  setTouchEnabled(true);//设置触摸有效return true;
}  void NoTouchLayer::registerWithTouchDispatcher()
{  CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -127 , true);//优先级低于-128(CCMenu),同时高于其他层(0),true表示吞噬触摸CCLayer::registerWithTouchDispatcher();
}  bool NoTouchLayer::ccTouchBegan (CCTouch *pTouch, CCEvent *pEvent)
{     return true;//返回true接收触摸
}  void NoTouchLayer::ccTouchMoved (CCTouch *pTouch, CCEvent *pEvent)
{
}  void NoTouchLayer::ccTouchEnded (CCTouch *pTouch, CCEvent *pEvent)
{
}  

3.第三种暂停屏蔽触摸的方法

因为游戏只有主角可以被触摸移动,所以只在PlaneLayer中的MoveTo函数里,做如下判断:

if(isAlive && !CCDirector::sharedDirector()->isPaused())

这样就够了。如果游戏暂停就不让飞机移动。好像也没有什么问题。

效果图(暂停状态)


【cocos2d-x入门实战】微信飞机大战之十一:游戏暂停和触摸屏蔽相关推荐

  1. 【cocos2d-x入门实战】微信飞机大战之十:UFO层特殊道具

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11961795 游戏的趣味性就在于不时的给你一些惊喜.当然如果只是简单的子弹打 ...

  2. Unity游戏开发官方入门教程:飞机大战(六)——创建子弹

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  3. Unity游戏开发官方入门教程:飞机大战(二)——创建飞船对象

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  4. Unity游戏开发官方入门教程:飞机大战(五)——实现飞船控制脚本

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  5. Unity游戏开发官方入门教程:飞机大战(十)——敌人的爆炸和移动

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

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

    上一篇:[二]仿微信飞机大战cocos2d-x3.0rc1 今天的任务是: 1.我机子弹无限量发射 2.三种类型敌机的出现 3.敌机自己碰墙死掉 一.效果界面展示 暂时没有实现子弹打中敌机 二.工程解 ...

  7. cocos2d-x-3.3-022-仿微信飞机大战-开篇介绍

    原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接 写在最前面 微信飞机大战,触控的大神JackyStudio 已经在他的专栏微信飞机大战讲解中完整细致的实现了一遍,基于cocos2d- ...

  8. 【C语言游戏】微信飞机大战 | PlaneFight(EasyX,drawAlpha绘制透明贴图,计时器,计帧器,游戏难度自动调整,接受鼠标消息,源码素材免费分享)

    一.数据结构介绍 struct aircraft //所有飞机的结构体 typedef struct aircraft{ int type;//飞机类型 int HP;//剩余血量 int bomb_ ...

  9. 《飞机大战》安卓游戏开发源码(三)

    为什么80%的码农都做不了架构师?>>>    本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/1 ...

最新文章

  1. K - 迷宫问题 POJ - 3984
  2. CDN的工作原理以及其中的一些技术-阿里
  3. Windows下编译jcef
  4. Web ML+ WebAssembly 支持实现 Google Meet 背景模糊功能
  5. OCA读书笔记(1) - 浏览Oracle数据库架构
  6. python实现定时任务的方式_Python实现定时执行任务的三种方式简单示例
  7. Google服务你都用了哪些?
  8. 课工场新闻管理jsp修改项目_jspmvc实验室预约管理系统
  9. java 蓝桥杯算法训练 最大值与最小值的计算(题解)
  10. Docker容器虚拟化与传统虚拟机比较
  11. Java多线程面试题总结,Java岗
  12. vb中WindowsMediaPlayer的常用属性和方法
  13. stm32毕业设计 单片机智能温控风扇
  14. Topaz Video Enhance AI 1.9 视频增强软件
  15. PDF+word生成pdf+嵌入所有字体
  16. 数显之家快讯:【SHIO世硕心语】2021,新的一年写给自己的5句话!
  17. Windows7 开机自启脚本
  18. Android 科大讯飞开发相关
  19. JavaScript(总结完毕)2021.3.7
  20. 百度Apollo计划跟踪:感知与预测中神经网络的分析

热门文章

  1. 使用canal 监听mysql binlog获取增量数据
  2. 微发展论坛,微信二次开发和公众号营销的交流中心
  3. 智慧物业——智慧城市落地发展的坚强后盾
  4. 账号由大小写字母+数字+特殊字符组成 正则表达
  5. 逻辑斯蒂回归模型——逻辑斯蒂分布、二项逻辑斯蒂回归模型、参数估计与多项逻辑斯蒂回归
  6. 织梦php页面中调用标签,织梦dede:php标签中调用其他普通标签和页面相关变量及全局配...
  7. 【安全知识分享】承包商入厂安全培训课件(106页).pptx(附下载)
  8. 为什么我会选择 AI-TestOps 让测试更智能
  9. Arduino 多种按键模式下的检测
  10. 计算机基础知识20(专业术语翻译)