cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)
今天我们要讲三个类,这三个类应该算比較简单的
HelpLayer类
NumberLayer类
GetLocalScore类
HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示游戏怎么玩的,就一张图:
NumberLayer类,涉及到自己定义字体的制作,我们提取出来的资源里,有非常多数字图片:
如今我们要把它们做成这样子的:
这个跟游戏图片资源差点儿相同,做成这样就能够直接拿来用,省了非常多事情,那怎么做了,这里我们要用到一个叫软件,详细用法和过程,我这里就不介绍了,大家直接戳这里
http://blog.csdn.net/swejackies/article/details/8967903
介绍的非常具体,也感谢这个作者。NumberLayer类这个类中另一个问题就是单例实现,单例类:顾名思义它就仅仅有一个实例,有时候,一个功能类有非常多的实例,会让程序变得十分复杂,单例类攻克了这个问题。
GetLocalScore类,本地数据的存取,这个类也非常easy,都是调用了,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)的更多相关文章
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(7)
今天我们介绍最后两个类 GameOverLayer类 GameLayer类 GameLayer类是整个游戏中最重要的类,由于是整个游戏的中央系统,控制着各个类(层)之间的交互,这个类中实现了猪脚小鸟和 ...
- C++ 类对象内存模型分析
编译环境:Windows10 + VS2015 1.空类占用的内存空间 类占内存空间是只类实例化后占用内存空间的大小,类本身是不会占内存空间的.用sizeof计算类的大小时,实际上是计算该类实例化后对 ...
- Android开发之dp转像素,像素转换为dp工具类,详细代码,带有源文件下载地址。
import android.content.Context; /** * @author 官网:http://blog.csdn.net/qq_21376985 * * David编写: 微博:ht ...
- C++派生类中如何初始化基类对象(五段代码)
今天收到盛大的面试,问我一个问题,关于派生类中如何初始化基类对象,我在想派生类对于构造函数不都是先构造基类对象,然后在构造子类对象,但是如果我们在成员初始化列表先初始化派生类的私有成员,在函数内去调用 ...
- C++ 类对象和 指针的区别
C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...
- Android 通过 Intent 传递类对象或list对象
(转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...
- NSLog(@"%@",类对象); 默认输出类名
NSLog()函数输出Objective-c对象时,输出的是该对象的description方法的返回值.也就是说,以下两行代码作用完全一样(假设p是指向任何对象的指针变量). NSLog(@" ...
- WPF整理-XAML构建后台类对象
1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...
- class中new与未new的区别 类对象占用空间--转载
转载自http://blog.sina.com.cn/shuiwuhendeboke 颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...
随机推荐
- Wix打包系列 (六)制作升级和补丁包
原文:Wix打包系列 (六)制作升级和补丁包 前面我们已经知道怎么制作一个完整安装包了,但我们的软件往往不能一次性就满足客户的需要,当客户需要我们给软件进行升级的时候,我们应该怎么做呢? 在这之前,我 ...
- ASP.NET Web Service应用发布到IIs怎么做
首先把你写的webservice Publish 到 一个文件夹 D:\MyWebService 下,在IIS下的website里面new一个虚拟目录,别名(Alias)随便输一个(这个别名是用于别的 ...
- Netflix公司监控内部安全的开源项目
Netfix公司已经公布了三个内部工具,用于捕捉黑客在使用互联网服务时留下的痕迹. AndyHoernecke和Netflix公司的云安全团队成员ScottBehrens指出:"很多安全团队 ...
- Swift的属性,方法,下标脚本以及继承
从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并非太多.理解Swift的面向对象理念,语法以及类结构,构造析构过程对于非常好的应用Swift语言将会有比較大的帮助. 属性 存储属性 ...
- android2.2应用开发之IccCard(sim卡或USIM卡)
tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51 ...
- Android SDK 5.0 这个语句带来折腾 - 生命在于折腾!
Android SDK 5.0 带来的这番折腾 - 生命在于折腾! 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...
- J2SE基础:4.面向对象的特性一
面向对象的特性 封装 继承多态 封装: 定义: 通过对象的封装,实现了模块化和信息隐藏. 通过对类的成员施以一定的訪问权限,实现了类中成员 的信息隐藏 注意点: 对象自已该做的一些事情与方法不能交与其 ...
- hdu1869六度分离,spfa实现求最短路
就是给一个图.假设随意两点之间的距离都不超过7则输出Yes,否则 输出No. 因为之前没写过spfa,无聊的试了一下. 大概说下我对spfa实现的理解. 因为它是bellmanford的优化. 所以之 ...
- 深入理解计算机系统之旅(四)处理器(CPU)的体系结构
1.前言 处理器是很复杂的系统,它不是一蹴而就的,它是经过不断的升级.更新.设计之后的产物,而且如今还在保持着不断的更新. 处理器仅仅能运行一系列的指令,每条指令都仅仅是运行某个简单的操作,比方数字相 ...
- 无法识别的属性“targetFramework”。请注意,属性名是大写和小写。错误的解决方案
"/CRM"应用server错. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查以下的特定错误具体信息并适当地改动配置文件. 分析器错误消息: 无法识别的属性 ...