void SceneStart::Quit() { Director::getInstance()->end(); exit(0); }
Director类介绍001
点击关于按钮,显示当前游戏的相关信息。
void SceneStart::About() { Util::replaceLayer(SceneAbout::create()); }
替换场景函数,场景之间的切换在游戏中可能被使用多次,因此写在Util.h头文件中。
切换场景过程
1:创建一个新的场景scene;
2:将要切换的层layer添加至scene;
3:调用Director导演切换至创建的场景scene。
static void replaceLayer(Layer* layer) { Scene* scene = Scene::create(); scene->addChild(layer); //Director::getInstance()->replaceScene(scene); Director::getInstance()->replaceScene(TransitionFade::create(1, scene)); //Director::getInstance()->replaceScene(TransitionFadeBL::create(1, scene)); //Director::getInstance()->replaceScene(TransitionFadeDown::create(1, scene)); //Director::getInstance()->replaceScene(TransitionFadeTR::create(1, scene)); //Director::getInstance()->replaceScene(TransitionFadeUp::create(1, scene)); //Director::getInstance()->replaceScene(TransitionCrossFade::create(1, scene)); //Director::getInstance()->replaceScene(TransitionFlipAngular::create(1, scene)); //Director::getInstance()->replaceScene(TransitionJumpZoom::create(1, scene)); //Director::getInstance()->replaceScene(TransitionPageTurn::create(1, scene, true)); }
Transition…函数为场景切换过渡动画,Fade(消失),FadeBL(Fade Bottom Left,从左下角到右上角逐渐消失)其他过渡动画可以自行尝试。
“关于类中,定义三种读取关于信息的方式以及定义一个返回按钮。
Director作为最上面的场景,依次在Director上添加或者切换图层,因此关于界面首先是一个层。
SceneAbout.h
#ifndef __SceneAbout_H__ #define __ScnenAbout_H__ #include "Util.h" class SceneAbout :public Layer { public: SceneAbout() {}; ~SceneAbout() {}; CREATE_FUNC(SceneAbout); bool init(); void SceneAbout::Back(); void readXml(); void readPlist(); void readJson(); }; #endif // !__SceneAbout_H__
类成员函数的定义
bool SceneAbout::init() { Layer::init(); //初始化父类 Util::addSpriteBackGround(this, IMAGE_BACKGROUND); //添加背景,Plane-001有写 ccMenuCallback buttonFun = std::bind(&SceneAbout::Back, this); Util::createButton(this, buttonFun, IMAGE_MENU_BACK_NORMAL, IMAGE_MENU_BACK_SELECT, winSize.width / 2 - itemSize.width / 12, itemSize.height / 12 - winSize.height / 2);//创建返回按钮 //readXml(); readPlist(); //readJson(); return true; }
调用返回函数,无参。Util::replaceLayer()2.0介绍完成。
ccMenuCallback buttonFun = std::bind(&SceneAbout::Back, this); Util::createButton(this, buttonFun, IMAGE_MENU_BACK_NORMAL, IMAGE_MENU_BACK_SELECT, winSize.width / 2 - itemSize.width / 12, itemSize.height / 12 - winSize.height / 2);//创建返回按钮 //使用回调函数将SceneAbout::Back作为参数传入创建按钮的函数中, //参数:当前**层**指针;按钮回调函数;按钮平常状态;按钮按下状态;按钮摆放位置(X,Y) void SceneAbout::Back() { Util::replaceLayer(SceneStart::create()); }
void SceneAbout::readXml() { auto doc = new tinyxml2::XMLDocument(); doc->Parse(FileUtils::getInstance()->getStringFromFile(XML_ABOUT).c_str()); auto root = doc->RootElement(); //root int i = -2; for (auto e = root->FirstChildElement(); e; e = e->NextSiblingElement())//p { string str = ""; for (auto attr = e->FirstAttribute(); attr; attr=attr->Next())//key string { str += attr->Name(); str += attr->Value(); } Util::setLabelTTF(this, str, winSize.width / 2, winSize.height / 2 - i++ * 100, 36, Color4B::BLACK, Vec2::ANCHOR_MIDDLE); } CC_SAFE_DELETE(doc); }
读XML文件过程:
1:使用C++11的auto来自动匹配变量类型创建tinyxml2对象;并根据XML文件名获取文件句柄;
2:使用->RootElement()获取XML跟节点;
3:使用->FirstChildElement()以及NextSiblingElement()循环所有孩子节点;
4:使用>FirstAttribute()以及->Next()循环每一个孩子节点中的属性以及内容;
5:将属性名以及内容输出即可
读Plsit文件过程:
1:如Plist文件所示,需要的内容均为string类型,因此创建一个typedef std::unordered_map<std::string, Value> ValueMap;类型的变量来存储数据,类似于键值对,本质上是哈希表。
2:循环当前键值对,输出键,值内容。
void SceneAbout::readPlist() { ValueMap vm = FileUtils::getInstance()->getValueMapFromFile(PLIST_ABOUT); int i = -2; for (auto it = vm.begin(); it != vm.end(); ++it) { string str = ""; str += it->first.c_str(); str += it->second.asString().c_str(); Util::setLabelTTF(this, str, winSize.width / 2, winSize.height / 2 - i++ * 100, 36, Color4B::BLACK, Vec2::ANCHOR_MIDDLE); } }
在这里插入代码片
Plane-002