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();
	}
}

今天就到这里

时间: 2024-11-09 01:31:03

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

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

今天介绍的是管道层 PipeLayer.h PipeLayer.cpp 管道层主要实现的是管道从右边往左边平移,结束后移除,而且管道还要长短高低不一样,然后就是如何判断小鸟通过一个管道.先说管道的平移,这个很简单,用一个函数把两跟管道封装好,让它moveby或者moveto好了,平移结束后,用一个回调函数移除自己就够了,当然封装好管道后,我们要把每一个管道放到一个数组里,方便管理嘛:然后就是管道高低不一样这里用一张图表示: 最后就是小鸟通过管道判断,这里我们是判断一个完整的管道是否通过屏幕中心线

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

好久没写博客了,今天早上起来不知怎么的就打开了csdn,工作简历也投了好几家,都石沉大海,在学校也闲着没事,就打算把以前写的Flappy Bird里面的一些代码分析发出来. Flappy Bird 网上也有很多的教程,我其中的有些代码也是参考网上的,不能算是完全原创吧,但是也有很大一部分代码都是按照我自己的想法,设计写出来的,接触cocos2d-x已经差不多有一年了,从以前的2x到现在的3x,改变了很多东西,作为一个新手我还有很多东西要去学习. 开始前有几点注意事项要说明: 1)我的Flappy

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

今天我们介绍最后两个类 GameOverLayer类 GameLayer类 GameLayer类是整个游戏中最重要的类,因为是整个游戏的中央系统,控制着各个类(层)之间的交互,这个类中实现了猪脚小鸟和它的敌人(管道和草地- . -)碰撞检测,说道物理引擎的碰撞检测,我也是第一次接触,也没多大难度,就直接调用了cocos2d-x的接口,这个类就是游戏的主场景,游戏就是在这里进行的. GameOverLayer类,游戏结束后一些分数的显示,还有就是奖牌的实现(楼主写的很简单......),这边比较有

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

今天要讲的使我们猪脚类 SpriteBird.h SpriteBird.cpp 猪脚类要注意的是三种状态的切换,和单点触控侦听的设置,还有就是小鸟在飞行的过程中,头部会上下的摆动,物理模型这里就不说了,小鸟头部的摆动是靠小鸟Y轴的速度来判定的,当小鸟向上飞的时候,速度是正的,所以头部摆动的旋转角度也是向上,当小鸟下落的时候,速度是负的,所以头部摆动的旋转角度是向下的. 小鸟的三种状态: 下面是代码 //SpriteBird.h #pragma once #include "cocos2d.h&q

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

今天介绍两个比较简单的类 GameBegin.h LandLayer.h 需要注意的有两点,一个是草地的滚动,还有一个是物理模型,都在LandLayer.h中实现,分析都在代码注释中. 先上GameBegin场景的效果图 这张图可以解析为 背景图的添加 游戏名字 小鸟以及小鸟飞行动画 按钮 草地(草地是会滚动的) //GameBegin.h #pragma once #include "cocos2d.h" class GameBegin:public cocos2d::Layer {

面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一

黑马程序员_类对象创建代码的执行顺序测试总结

class StaticCode { // 类的非静态成员变量(实例变量)定义语句: // 作用:用来存储对象的特有数据的成员变量. // 运行:当类对象被创建时就执行,按照顺序自上而下执行,和构造代码块平级.(即当有多个构造函数 // 代码块和多个非静态成员变量时,JVM按照自上而下的顺序来执行所有语句,包括构造代码块里的代码 // 和非静态成员的声明.) // 存储位置:非静态变量位于堆内存中的对象实体中. int num = 3; // 构造代码块 { System.out.println

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一