首页 > 代码库 > cocos2d-x v3.2 FlappyBird 各个类对象具体代码分析(6)

cocos2d-x v3.2 FlappyBird 各个类对象具体代码分析(6)

今天我们要讲三个类,这三个类应该算比较简单的

HelpLayer类

NumberLayer类

GetLocalScore类

HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示游戏怎么玩的,就一张图:


NumberLayer类,涉及到自定义字体的制作,我们提取出来的资源里,有很多数字图片:


现在我们要把它们做成这样子的:


这个跟游戏图片资源差不多,做成这样就可以直接拿来用,省了很多事情,那怎么做了,这里我们要用到一个叫软件,具体使用方法和过程,我这里就不介绍了,大家直接戳这里

http://blog.csdn.net/swejackies/article/details/8967903

介绍的很详细,也感谢这个作者。NumberLayer类这个类中还有一个问题就是单例实现,单例类:顾名思义它就只有一个实例,有时候,一个功能类有很多的实例,会让程序变得十分复杂,单例类解决了这个问题。

GetLocalScore类,本地数据的存取,这个类也很简单,都是调用了,cocos2d-x的一些接口,所以没什么难度。

下面就是这三个类的代码分析:


//HelpLayer.h
#pragma once
#include "cocos2d.h"
class HelpLayer:public cocos2d::Layer
{
public:
	HelpLayer();
	~HelpLayer();
	bool init();
	//回调函数
	void callBack();
	CREATE_FUNC(HelpLayer);

private:
	//单点触控侦听
	cocos2d::EventListenerTouchOneByOne * listener;
	cocos2d::Sprite * gameName;
	cocos2d::Sprite * tutorial;
};

//HelpLayer.cpp
#include "HelpLayer.h"
USING_NS_CC;

HelpLayer::HelpLayer()
{

}

HelpLayer::~HelpLayer()
{

}

bool HelpLayer::init()
{
	if (!Layer::init())
	{
		return false;
	}
	auto origin=Director::getInstance()->getVisibleOrigin();
	auto visibleSize=Director::getInstance()->getVisibleSize();

	//游戏名字
	gameName=Sprite::createWithSpriteFrameName("text_ready.png");
	gameName->setPosition(Point(origin.x+visibleSize.width*0.5,origin.y+visibleSize.height*0.8));
	this->addChild(gameName);

	//玩法提示
	tutorial=Sprite::createWithSpriteFrameName("tutorial.png");
	tutorial->setPosition(Point(origin.x+visibleSize.width*0.5,origin.y+visibleSize.height*0.4));
	this->addChild(tutorial);

	//单点触控侦听,前面几章说到过,这边就不说了
	listener=EventListenerTouchOneByOne::create();
	listener->setSwallowTouches(false);

	listener->onTouchBegan=[](Touch * t,Event * e)
	{
		log("touch began");
		return true;
	};
	listener->onTouchEnded=[=](Touch *t,Event * e)
	{
		//这个layer单击一下就会消失,所以这边检测到点击的时候
		//就会从事件分发器中移除这个侦听
		_eventDispatcher->removeEventListener(listener);
		//这个渐隐动画,因为执行动画的有两个精灵,要有两个这样的动画
		//所以fade_2克隆了一个fade
		auto fade=FadeOut::create(0.5f);
		//克隆
		auto fade_2=fade->clone();

		//动画执行+回调函数
		auto callback=CallFuncN::create(CC_CALLBACK_0(HelpLayer::callBack,this));
		auto sequence=Sequence::create(fade,callback,NULL);
		tutorial->runAction(sequence);
		gameName->runAction(fade_2);

	};
	//上次讲侦听的时候可能没讲,每一个侦听都要加入到事件分发器中,就是下面这句代码
	//第一个参数就是我们的侦听,第二个参数是要加这个侦听的对象
	//这里我们的点击对象就是这整个层,所以是this
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);


	return true;
}
//移除这两个精灵
void HelpLayer::callBack()
{
	this->removeChild(tutorial);
	this->removeChild(gameName);
}

//NumberLayer.h
#pragma once
#include "cocos2d.h"
class NumberLayer:public cocos2d::Layer
{
public:
	NumberLayer();
	~NumberLayer();
	bool init();
	//加分
	void addScore();
	//初始化分数
	void initScore();
	//获得分数
	int getScore();
	//获得单例对象
	static NumberLayer * getInstance();

private:
	cocos2d::Label * numberLabel;
	int score;
};

//NumberLayer.cpp
#include "NumberLayer.h"
USING_NS_CC;
//唯一存在的自身对象(这边一定要赋初值null),注意是静态的
static NumberLayer * instance=NULL;
NumberLayer::NumberLayer()
{
}

NumberLayer::~NumberLayer()
{
}
//单例类最主要部分
NumberLayer * NumberLayer::getInstance()
{
	//判断这个对象是否存在
	if (instance==NULL)
	{
		//如果不存在,那就创建
		NumberLayer * temp=new NumberLayer();
		//然后初始化
		temp->init();
		instance=temp;
	}
	//如果已经存在了,那就直接返回
	return instance;
}

bool NumberLayer::init()
{
	if (!Layer::init())
	{
		return false;
	}

	auto origin=Director::getInstance()->getVisibleOrigin();
	auto visibleSize=Director::getInstance()->getVisibleSize();

	//初始化分数
	score=0;
	//这是自定义字体的使用
	auto str=__String::createWithFormat("%d",score);
	numberLabel=Label::createWithBMFont("font1.fnt",str->getCString());
	numberLabel->setPosition(Point(origin.x+visibleSize.width/2,origin.y+visibleSize.height*0.85));
	this->addChild(numberLabel);




	return true;
}

void NumberLayer::addScore()
{
	score++;
	auto str=__String::createWithFormat("%d",score);
	numberLabel->setString(str->getCString());
}

void NumberLayer::initScore()
{
	score=0;
	auto str=__String::createWithFormat("%d",score);
	numberLabel->setString(str->getCString());
}

int NumberLayer::getScore()
{
	return score;
}

//GetLocalScore.h
#pragma once
#include "cocos2d.h"
class GetLocalScore
{
public:
	GetLocalScore();
	~GetLocalScore();
	static GetLocalScore * getInstance();
	//判断是否存在本地文件
	bool isHaveLocalFile();
	//获取本地文件中的分数
	int getHighScore();
	//写入本地文件分数
	void setHighScore(int);
private:

};


//GetLocalScore.cpp
#include "GetLocalScore.h"
USING_NS_CC;
static GetLocalScore * instance=NULL;
GetLocalScore::GetLocalScore()
{

}

GetLocalScore::~GetLocalScore()
{

}
//这边单例就不介绍了
GetLocalScore * GetLocalScore::getInstance()
{
	if (instance==NULL)
	{
		GetLocalScore * temp=new GetLocalScore();
		instance=temp;
	}
	return instance;
}

bool GetLocalScore::isHaveLocalFile()
{
	//直接去获取这个值,如果存在,返回true
	if (UserDefault::getInstance()->getBoolForKey("isHaveLocalFile"))
	{
		return true;
	}
	else
	{
		//如果不存在,那就创建,并写入分数
		//如果写入的数据是bool型,就用setBoolForKey
		//如果写入的数据是int型,就用setIntegerForKey
		//还有别的类型的写入,方法差不多,这里就不介绍了
		UserDefault::getInstance()->setBoolForKey("isHaveLocalFile",true);
		UserDefault::getInstance()->setIntegerForKey("highScore",0);
		UserDefault::getInstance()->flush();
		return false;
	}
}
//获得分数
int GetLocalScore::getHighScore()
{
	if (isHaveLocalFile())
	{
		return UserDefault::getInstance()->getIntegerForKey("highScore");
	}
	else
	{
		return 0;
	}
}
//写入分数
void GetLocalScore::setHighScore( int n)
{
	if (isHaveLocalFile())
	{
		UserDefault::getInstance()->setIntegerForKey("highScore",n);
		UserDefault::getInstance()->flush();
	}
	else
	{
		UserDefault::getInstance()->setBoolForKey("isHaveLocalFile",true);
		UserDefault::getInstance()->setIntegerForKey("highScore",n);
		UserDefault::getInstance()->flush();
	}
}

今天就到这里

cocos2d-x v3.2 FlappyBird 各个类对象具体代码分析(6)