#include "UILayer.h"
UILayer::UILayer(void)
{
}
UILayer::~UILayer(void)
{
}
bool UILayer::init()
{
if(!Layer::init())
return false;
auto size = Director::getInstance()->getWinSize();
//添加游戏暂停和开始的开关菜单
auto toggle1 = MenuItemImage::create();
toggle1->setNormalSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("pause_button.png"));
auto toggle2 = MenuItemImage::create();
toggle2->setNormalSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("resume_button.png"));
auto menuToggle = MenuItemToggle::createWithCallback(CC_CALLBACK_1(UILayer::menuCallback,this), toggle1,toggle2,NULL);
//刚开始设置选择的index是0,如果点击了暂停设置index为1,toggle中的index是从0开始的,第一个添加进去的
//item的index为0
menuToggle->setSelectedIndex(0);
auto menu = Menu::create(menuToggle,NULL);
menu->setPosition(Point(size.width*0.95,size.height*0.97));
this->addChild(menu);
return true;
}
void UILayer::menuCallback(Ref * ref)
{
auto toggle = (MenuItemToggle *)ref;
//根据用户选择的不同做不同的处理,刚开始我们设置的时候是0,一点击系统就进行了切换,将index设置为了1
if(toggle->getSelectedIndex() == 1)
{
//截取当前场景的图片并且保存
auto size = Director::getInstance()->getWinSize();
//RenderTexture是一个纹理渲染类,我们需要把要渲染的当前场景放进去,这是初始化它的大小
auto render = RenderTexture::create(size.width,size.height);
//开始获取内容
render->begin();
//是用节点的visit方法加入到渲染中
Director::getInstance()->getRunningScene()->visit();
//结束
render->end();
auto index = UserDefault::getInstance()->getIntegerForKey("index", 0);
UserDefault::getInstance()->setIntegerForKey("index", index+1);
auto str = __String::createWithFormat("pause%d.png", index);
//每次截屏都会产生不同名称的图片,要把图片删掉
if(index != 0)
{
auto str = __String::createWithFormat("pause%d.png",index-1);
auto fullPath = FileUtils::getInstance()->getWritablePath() + str->getCString();
if(FileUtils::getInstance()->isFileExist(fullPath))
{
remove(fullPath.c_str());
}
}
//保存图片为PNG格式,当我们想要获取这个文件的时候使用
FileUtils::getInstance()->getWritablePath() + "pause.png";//,通过这个方法就可以取得我们保存的图片啦
render->saveToFile(str->getCString(),Image::Format::PNG);
//对声音的处理
// SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
//3.0截屏需要在截完屏的下一帧才能处理RenderTexture,这点要注意
auto _schedule = this->getScheduler();
auto replaceScene = ](float tm)
{
//最后切换场景
Director::getInstance()->pushScene(Pause::createScene());
};
_schedule->schedule(replaceScene, this, 0.0f,0,0.0f, false, "screenshot");
toggle->setSelectedIndex(0);
}
}
```
#include "Pause.h"
#include "MainGame.h"
Pause::Pause(void)
{
}
Pause::~Pause(void)
{
}
Scene * Pause::createScene()
{
auto scene = Scene::create();
auto layer = Pause::create();
scene->addChild(layer);
return scene;
}
bool Pause::init()
{
if(!Layer::init())
return false;
auto size = Director::getInstance()->getWinSize();
auto index = UserDefault::getInstance()->getIntegerForKey("index");
auto str = __String::createWithFormat("pause%d.png", index-1);
CCFileUtils::sharedFileUtils()->getWritablePath();//提供了一个可以存储的路径
auto fullPath = FileUtils::getInstance()->getWritablePath() + str->getCString();
//这里把截屏的那张图片做为背景图片
auto background = Sprite::create(fullPath);
background->setPosition(Point(size.width/2, size.height/2));
this->addChild(background, 0);
//添加恢复游戏的按钮
auto resume = MenuItemImage::create();
resume->setNormalSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("resume_botton.png"));
//auto resumeToggleItem = MenuItemToggle::createWithCallback(CC_CALLBACK_1(Pause::backtogame, this), resume,NULL);
auto callback = ](Ref * ref)
{
//弹出保存的场景
Director::getInstance()->popScene();
};
resume->setCallback(callback);
auto menu = Menu::create(resume, NULL);
menu->setPosition(Point(size.width*0.95, size.height*0.97));
this->addChild(menu,10000);
//loading的动画效果
Vector vector;
for(int i=0; i<7; i++)
{
auto str = __String::createWithFormat("loading_%d.png", i+1);
auto spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(str->getCString());
vector.pushBack(spriteFrame);
}
auto animation = Animation::createWithSpriteFrames(vector, 0.2f, -1);
auto animate = Animate::create(animation);
//设置用来执行动画的loading图片
auto loading = Sprite::createWithSpriteFrameName("loading_1.png");
loading->setPosition(Point(size.width*0.5,size.height*0.5));
this->addChild(loading);
loading->runAction(animate);
return true;
}
```
我按照这种方法添加,游戏是可以暂停了, 那个runAction的动作也运行了,但就是不能返回游戏,在那个截屏的新场景里, resume的按钮毫无反应,我尝试把resume的位置改变,但游戏里其位置没有变, 是不是我压根没有添加到resume的按钮上去?求大神指导