今天我们要讲三个类,这三个类应该算比較简单的
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(); } }
今天就到这里