2021-04-24-飞机大战-002-游戏退出和关于按钮的实现

2021-04-24-飞机大战-002-游戏退出和关于按钮的实现

1 游戏退出按钮

void SceneStart::Quit()
{
	Director::getInstance()->end();
	exit(0);
}

Director类介绍001

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

2021-04-24-飞机大战-002-游戏退出和关于按钮的实现

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

2021-04-24-飞机大战-002-游戏退出和关于按钮的实现
读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

在这里插入代码片

2.6 效果显示

2021-04-24-飞机大战-002-游戏退出和关于按钮的实现

源码

Plane-002

上一篇:【设计模式自习室】建造者模式


下一篇:jenkins执行Build Now报错系列(一)Failed to change to remote director