cocos2dx3.3开发FlappyBird总结十三:数字特效类

cocos2dx3.3开发FlappyBird总结十三:数字特效类,第1张

概述由于显示得分其实是数字精灵的组合,因此需要先设计一个存储数字精灵数列的类: #ifndef __EngryBird__NumberSeries__#define __EngryBird__NumberSeries__#include "cocos2d.h"/** * This class is for ScoreNumber, and it will store a list of sp

由于显示得分其实是数字精灵的组合,因此需要先设计一个存储数字精灵数列的类:

#ifndef __EngryBird__NumberSerIEs__#define __EngryBird__NumberSerIEs__#include "cocos2d.h"/** * This class is for scoreNumber,and it will store a List of sprite frames. * With it,you can load number sprite with name format and get sprite frame * with index. */class NumberSerIEs : public cocos2d::Ref {public:  /**   * The default constructor   */  NumberSerIEs();  /** * The default destructor */  ~NumberSerIEs();  /** * The init method,will init the super init method first * * @return true if succeeded,otherwise false */  virtual bool init();  CREATE_FUNC(NumberSerIEs);  /** * Load sprite frame with a format name * * @param format The name format,eg. "number1_%d" * @param base The begin index */  voID loadNumber(const char *foramt,int base = 0);  /** * Get sprite frame with an index * * @param index The index in the _numberVector * * @return a sprite frame object */  cocos2d::SpriteFrame* at(int index);private:  /**   * Store number sprite frames   */  cocos2d::Vector<cocos2d::SpriteFrame *> _numberVector;};#endif /* defined(__EngryBird__NumberSerIEs__) */

这个类只有一个成员变量,_numberVector,存储的是一组数字精灵帧,这样就可以通过数字作为下标,直接获取对应的精灵帧。

在初始化时:

bool NumberSerIEs::init() {  _numberVector = cocos2d::Vector<SpriteFrame *>(kMaxnumberCount);  return true;}

因此数字就是0~9这几个,所以是固定的,写成一个宏常量

下面这个方法是获取得分组合精灵,如得分为42,则把对应的精灵帧4和2加入到组合中,

voID NumberSerIEs::loadNumber(const char *foramt,int base) {  for (int i = base; i < kMaxnumberCount + base; ++i) {    char name[20];    sprintf(name,foramt,i);    auto frame = AtlasLoader::getInstance()->getSpriteFrame(name);    _numberVector.pushBack(frame);  }}

base表示从什么数字开始,这样写是因为有的精灵的名称不是从0开始的,如bird_045~bird_088,那么base就是45了

获取数字精灵帧的时候,传数字过来,就是获取对应的数字精灵帧了,

SpriteFrame* NumberSerIEs::at(int index) {  if (index >= 0 && index < _numberVector.size()) {    return _numberVector.at(index);  }  return NulL;}

考虑代码的健壮性,增加了范围的判断

下面是数字特效类了,设计为全局共享类,
首先,显示的方式为居中,居左,居右,因此先设计一个枚举来表示。

/** * The alignment */typedef enum {  kGravityDirectionCenter = 1,kGravityDirectionleft,kGravityDirectionRight} GravityDirection;

看看加载得分精灵方法:

bool scoreNumber::loadNumber(const char *name,const char *format,int base) {  auto serIEs = NumberSerIEs::create();  serIEs->loadNumber(format,base);  _numberContainer.insert(name,serIEs);  return true;}

这里_numberContainer是一个Map类型的容器,用于存储得分,因为游戏不断重复的话,同样的得分,就可以直接获取,而不用重复了。

下面这个方法是把数字得分转换成精灵数字,并调整方向:

Node* scoreNumber::convert(const char *name,int number,GravityDirection direction) {// 首先根据key,取得数字组合  auto serIEs = _numberContainer.at(name);  auto zero = Sprite::createWithSpriteFrame(serIEs->at(0));  // 如果得分为0,直接显示  if (number == 0) {    zero->setAnchorPoint(Vec2(0.5,0));    return zero;  }  // seperate the number and load number sprite into the node  // 使用node节点来容纳数字精灵  auto node = Node::create();  float totalWIDth = 0.0f;  while (number) {  // 循环获取每一位数字,然后获取对应的精灵,添加到node中并计算  // node的总宽    int tmp = number % 10;    auto sprite = Sprite::createWithSpriteFrame(serIEs->at(tmp));    totalWIDth += sprite->getContentSize().wIDth;    node->addChild(sprite);    number /= 10;  }  // set the content size of node  node->setContentSize(Size(totalWIDth,zero->getContentSize().height));  // caculate the wIDth of each number  float perWIDth = totalWIDth / node->getChildrenCount();  ssize_t index = 0;  float anchorX = 0;  bool isMinus = true;  if (direction == kGravityDirectionCenter) {    anchorX = 0.5f;    index = node->getChildrenCount() / 2;  } else if (direction == kGravityDirectionRight) {    anchorX = 1.0f;    index = node->getChildrenCount();  } else if (direction == kGravityDirectionleft) {    anchorX = 0.0f;    isMinus = false;    index = 0;  }  // 获取显示的方式来调整精灵的位置  for (auto child : node->getChildren()) {    child->setAnchorPoint(Vec2(anchorX,0));    float posX = perWIDth * (isMinus ? index-- : index++);    child->setpositionX(posX);  }  return node;}

下一步,先说明一下用到的宏

总结

以上是内存溢出为你收集整理的cocos2dx3.3开发FlappyBird总结十三:数字特效类全部内容,希望文章能够帮你解决cocos2dx3.3开发FlappyBird总结十三:数字特效类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1050108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存