2021-04-24-飞机大战-002-游戏退出和关于按钮的实现
1 游戏退出按钮
void SceneStart::Quit()
{
Director::getInstance()->end();
exit(0);
}
2 关于按钮
2.0 切换关于场景
点击关于按钮,显示当前游戏的相关信息。
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,从左下角到右上角逐渐消失)其他过渡动画可以自行尝试。
2.1 “关于”类实现
“关于类中,定义三种读取关于信息的方式以及定义一个返回按钮。
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;
}
2.2 返回按钮
调用返回函数,无参。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());
}
2.3 关于.xml
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:将属性名以及内容输出即可
2.4 关于.plist
读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);
}
}
2.5 关于.json
在这里插入代码片