今天我们要讲三个类,这三个类应该算比较简单的
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)
原文地址:http://blog.csdn.net/u011373759/article/details/39370227