zoukankan      html  css  js  c++  java
  • 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();
    	}
    }
    

    今天就到这里

  • 相关阅读:
    PyQt5复杂控件(树控件、选项卡控件(滚动条控件、多文档控件、停靠控件)
    PyQt5单元格操作大全
    PyQt5打印机
    PyQt5剪切板操作
    PyQt5的菜单栏、工具栏和状态栏
    PyQt5日历控件及相关操作
    PyQt5控件支持拖拽方法
    《Lua程序设计》第3章 表达式 学习笔记
    Lua中的table构造式(table constructor)
    《Lua程序设计》第2章 类型与值 学习笔记
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4331638.html
Copyright © 2011-2022 走看看