博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Cocos2d-x中增加暂停按钮的步骤
阅读量:4465 次
发布时间:2019-06-08

本文共 2179 字,大约阅读时间需要 7 分钟。

1.在GameScene.cpp的init方法中先定义一个里面放着可变换并在变换的时候会响应事件的MenuItem的Menu,这个Menu里面的可变换MenuItem又由两个小MenuItem组成,每个小MenuItem都有两种状态,一种是正常的状态,还有一种是按下去的状态。

//加入暂停按钮

auto pause_sp1 = Sprite::create("jewel1.png");
auto pause_sp2 = Sprite::create("jewel2.png");
auto resume_sp1 = Sprite::create("jewel4.png");
auto resume_sp2 = Sprite::create("jewel6.png");

auto pauseitem = MenuItemSprite::create(pause_sp1, pause_sp2);

auto resumeitem = MenuItemSprite::create(resume_sp1, resume_sp2);
auto pauseButton = MenuItemToggle::createWithTarget(this, menu_selector(GameScene::pauseButtonCallBack), pauseitem, resumeitem, nullptr);
pauseButton->setAnchorPoint(Vec2(0, 0));

//注意,这里的Position如果没有设置好的话,是不会显示暂停按钮的,而且这里的Position的设置比较特殊,设置的位置是以屏幕左下四分之一和另外看不见的四分之三为一个设置区域,等到添加到Menu中去的时候,会自动适应屏幕,变成原来左下四分之一移动到了屏幕右上四分之一,整体往屏幕左上移动了四分之一屏幕大小的距离,所以有的时候看不见按钮是因为没有设置好Position的关系

pauseButton->setPosition(Vec2(size.width / 2 - pauseButton->getContentSize().width, size.height / 2 - pauseButton->getContentSize().height)); //位于右上角

auto menu = Menu::create(pauseButton, nullptr);

addChild(menu, 10, PAUSE_MENU);

 

2.写可变换MenuItem的响应事件

void GameScene::pauseButtonCallBack(Ref* pSender)

{
  //log("press pause button!");

  /*

  * 暂停/开启 步骤:
  *1.关闭/开启 触摸监听
  *2.遍历子节点,把除了暂停按钮的 关闭/开启 渲染(onExit)
  *3.关闭/开启 敌机的刷新schedule
  *4.关闭/开启 物理引擎的模拟
  */
  log("Im in the ff!!");
  static int i = 0;
  if (0 == i)
  {
    i = 1;

    _eventDispatcher->pauseEventListenersForTarget(this);

    auto vec = this->getChildren();
    for (auto &child : vec)
    {
      if (child->getTag() != PAUSE_MENU)
      child->onExit();
    }

  //unschedule(schedule_selector(GameScene::refreshAnEnemy));

  unscheduleUpdate();

  ((Scene*)this->getParent())->getPhysicsWorld()->setAutoStep(false);

  }

  else
  {
    i = 0;

    _eventDispatcher->resumeEventListenersForTarget(this);

    auto vec = this->getChildren();

    for (auto &child : vec)
    {
      if (child->getTag() != PAUSE_MENU)
      child->onEnter();
    }

    //schedule(schedule_selector(GameScene::refreshAnEnemy), refresh_delay[m_level]);

    scheduleUpdate();

    ((Scene*)this->getParent())->getPhysicsWorld()->setAutoStep(true);

  }
}

 

转载于:https://www.cnblogs.com/HangZhe/p/5806421.html

你可能感兴趣的文章
C# 子线程与主线程通讯方法一
查看>>
006——修改tomacat的编码
查看>>
《C程序设计语言》笔记 (八) UNIX系统接口
查看>>
git常用命令
查看>>
Android必知必会-获取视频文件的截图、缩略图
查看>>
(转)理解Bitblt、StretchBlt与SetDIBitsToDevice、StretchDibits
查看>>
python之路-基础篇-第七周
查看>>
高性能队列Disruptor系列2--浅析Disruptor
查看>>
ViurtualBox配置虚拟机Linux的网络环境
查看>>
VLC 媒体播放器
查看>>
勿忘国耻2018/09/18
查看>>
Jenkins部署码云SpringBoot项目
查看>>
多标签分类(multi-label classification)综述
查看>>
史上最全面的Spring-Boot-Cache使用与整合
查看>>
图的遍历(深度优先与广度优先搜索两种方案)
查看>>
快速读入模板
查看>>
把一张图片变成base64
查看>>
impdp报错: ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误
查看>>
\n ^ \t的使用
查看>>
css盒模型
查看>>