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);
}
}