cocos2dx-3.10 C++實現(xiàn)滾動數(shù)字
更新時間:2020年09月18日 11:57:05 作者:琦琦安卓進階
這篇文章主要為大家詳細介紹了cocos2dx-3.10 C++實現(xiàn)滾動數(shù)字效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了cocos2dx-3.10 C++實現(xiàn)滾動數(shù)字的具體代碼,供大家參考,具體內(nèi)容如下
NumberScroller.h
#ifndef _NUMBERSCROLLER_H_ #define _NUMBERSCROLLER_H_ #include "cocos2d.h" USING_NS_CC; /* 這是一個數(shù)字滾動切換控件 更新方向: 1.在規(guī)定時間運動完,速度在變化 2.能指定字體表 3.增加新的更新算法,確保運動到指定數(shù)時候可以及時完成 4.添加能夠指定寬和高以及數(shù)字之間的間隔 */ class NumberColumn : public Node{ private: NumberColumn(); public: static NumberColumn* create(int fontHight); void setNumber(int number,bool direction=true); void setTime(float time); private: bool init(int fontHight); void update(float delta); private: Node* m_numbers; //當前顯示節(jié)點 int m_cur_num; //當前顯示數(shù)字 int m_target_num; //目標顯示數(shù)組 int m_fontHight; //當個字體高度 float m_time; //切換總時間 float update_moveSum; //幾率在兩個數(shù)字更新期間移動的距離 float update_speed; //刷新一次的時間 }; class NumberScroller : public Node{ private: NumberScroller(); public: static NumberScroller* create(int length,int fontWidth,int fontHeight,int fontSpacing); void setTime(float time); void setNumber(int number); int getNumber(); private: bool init(int length, int fontWidth, int fontHeight, int fontSpacing); private: Vector<NumberColumn*> m_columns; //存儲一共的列數(shù) int m_cur_num; //當前顯示數(shù)字 int m_length; //列數(shù) int m_time; //切換總時間 int m_fontWidth; //字體寬度 int m_fontHeight; //字體高度 int m_fontSpacing; //字體間隔 Node* m_visibleNode; //當前可視節(jié)點 }; #endif
NumberScroller.cpp
#include "NumberScroller.h" NumberColumn::NumberColumn(): m_cur_num(0), m_target_num(0), m_time(1.0f), update_moveSum(0), update_speed(0) { } NumberColumn* NumberColumn::create(int fontHight){ NumberColumn* ret = new NumberColumn(); if (ret && ret->init(fontHight)){ ret->autorelease(); return ret; } CC_SAFE_DELETE(ret); return nullptr; } bool NumberColumn::init(int fontHight){ if(!Node::init()) return false; m_numbers = Node::create(); this->addChild(m_numbers); m_fontHight = fontHight; this->scheduleUpdate(); //初始化一列0-9 共十個數(shù)字 for(int i=0;i<10;i++){ char str[2]; str[0] = i + '0'; str[1] = '\0'; auto temp = Label::createWithBMFont("fonts/test.fnt", str); temp->setAnchorPoint(Point(0,0)); temp->setPosition(Point(0, i * fontHight)); m_numbers->addChild(temp); } //為了兼容不同方向的偏轉(zhuǎn) char str[2]; str[0]='0'; str[1]='\0'; //添加字符串結(jié)束符 Label* temp = Label::createWithBMFont("fonts/test.fnt", str); temp->setAnchorPoint(Point(0,0)); temp->setPosition(Point(0, 10 * fontHight)); m_numbers->addChild(temp); return true; } void NumberColumn::setNumber(int number,bool direction){ m_target_num = number; int delta = m_target_num - m_cur_num; //計算數(shù)字間隔 update_speed = (delta * m_fontHight / m_time); //v = s / t } void NumberColumn::setTime(float time){ m_time = time; } void NumberColumn::update(float d){ if(m_cur_num != m_target_num){ //如果當前顯示的數(shù)字不等于目標數(shù)字,即要開始滾動 float dis = update_speed * d; //每次調(diào)用update函數(shù)需要滾動的距離等于update_speed 乘以 d (update_speed在setNumber函數(shù)中已經(jīng)算出) m_numbers->setPositionY(m_numbers->getPositionY() - dis);//每次使整條向下移動dis距離 update_moveSum += dis;//update_moveSum 用于保存現(xiàn)在到底移動了多少距離 if (update_moveSum >= m_fontHight){ //如果現(xiàn)在已經(jīng)移動了一個字大小的距離 //每移動一次累加1 m_cur_num++; //對10求余是為了在每次達到10后從新開始新循環(huán) m_numbers->setPositionY(- (m_cur_num % 10) * m_fontHight); //負數(shù)表示向下移,標準對齊位置 update_moveSum = 0; } } } /* ******************************************************************************************************************************************** ******************************************************************************************************************************************** */ NumberScroller::NumberScroller(): m_cur_num(0), m_length(0), m_time(1.0f) { } NumberScroller* NumberScroller::create(int length, int fontWidth, int fontHeight, int fontSpacing){ NumberScroller* ret = new NumberScroller(); if (ret && ret->init(length, fontWidth, fontHeight,fontSpacing)){ ret->autorelease(); return ret; } CC_SAFE_DELETE(ret); return nullptr; } bool NumberScroller::init(int length, int fontWidth, int fontHeight, int fontSpacing){ if(!Node::init()) return false; m_length = length; m_fontWidth = fontWidth; m_fontHeight = fontHeight; m_fontSpacing = fontSpacing; m_visibleNode = Node::create(); //排好length行數(shù)字 //該demo下為左對齊 for(int i=0;i<length;i++){ NumberColumn* column = NumberColumn::create(fontHeight); m_columns.pushBack(column); column->setAnchorPoint(Point(0,0)); //錨點設(shè)置為0是為了后面設(shè)置遮罩層 column->setPosition(i * (fontWidth + fontSpacing), 0); column->setTime(m_time); //設(shè)置默認運動時間1S m_visibleNode->addChild(column); } /*設(shè)置遮罩層*/ ClippingNode* cliper = ClippingNode::create(); //創(chuàng)建模板 DrawNode* drawNode = DrawNode::create(); Point points[] = { Point(getPosition()), Point(getPositionX(),getPositionY() + m_fontHeight), Point(getPositionX() + m_length * m_fontHeight, getPositionY() + m_fontHeight), Point(getPositionX() + m_length * m_fontHeight, getPositionY()) }; drawNode->drawPolygon(points,4,Color4F(0,0,0,1),0,Color4F(0,0,0,1)); //設(shè)置模板 cliper->setStencil(drawNode); cliper->addChild(m_visibleNode); this->addChild(cliper); //不添加遮罩層的方法 //this->addChild(m_visibleNode); } void NumberScroller::setNumber(int number){ if(number > m_cur_num){ m_cur_num = number; for(int i=0;i<m_length;i++){ m_columns.at(m_length - i -1)->setNumber(number); number /= 10; } } } int NumberScroller::getNumber(){ return m_cur_num; } //對外開放設(shè)置時間的接口 void NumberScroller::setTime(float time){ m_time = time; for(int i=0;i<m_length;i++){ m_columns.at(i)->setTime(time); } }
使用方法
auto numberScroller = NumberScroller::create(1,15,33,10);//這個字體寬度根據(jù)fnt 文件表的相關(guān)參數(shù)計算 numberScroller->setPosition(Director::getInstance()->getVisibleSize().width / 2, Director::getInstance()->getVisibleSize().height / 2); this->addChild(numberScroller); scheduleUpdate(); Director::getInstance()->getScheduler()->schedule([=](float){ CountNum = CountNum + 1; numberScroller->setNumber(CountNum); }, this, 1.0f, false, "countDown");
實現(xiàn)效果:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- 詳解CocosCreator項目結(jié)構(gòu)機制
- 如何使用CocosCreator對象池
- CocosCreator如何實現(xiàn)劃過的位置顯示紋理
- 整理CocosCreator常用知識點
- 全面講解CocosCreator熱更新
- CocosCreator經(jīng)典入門項目之flappybird
- CocosCreator通用框架設(shè)計之網(wǎng)絡(luò)
- 如何用CocosCreator實現(xiàn)射擊小游戲
- Cocos2dx實現(xiàn)數(shù)字跳動效果
- cocos2dx實現(xiàn)刮獎效果
- CocosCreator ScrollView優(yōu)化系列之分幀加載
相關(guān)文章
c++基礎(chǔ)語法:構(gòu)造函數(shù)與析構(gòu)函數(shù)
構(gòu)造函數(shù)用來構(gòu)造一個對象,主要完成一些初始化工作,如果類中不提供構(gòu)造函數(shù),編譯器會默認的提供一個默認構(gòu)造函數(shù)(參數(shù)為空的構(gòu)造函數(shù)就是默認構(gòu)造函數(shù)) ;析構(gòu)函數(shù)是隱式調(diào)用的,delete對象時候會自動調(diào)用完成對象的清理工作2013-09-09kernel劫持modprobe?path內(nèi)容詳解
這篇文章主要為大家介紹了kernel劫持modprobe?path的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05對比C語言中的setbuf()函數(shù)和setvbuf()函數(shù)的使用
這篇文章主要介紹了對比C語言中的setbuf()函數(shù)和setvbuf()函數(shù)的使用,涉及到緩沖區(qū)與流的相關(guān)知識,需要的朋友可以參考下2015-08-08C++替換棧中和.data中的cookie實現(xiàn)步驟詳解
這篇文章主要介紹了C++替換棧中和.data中的cookie實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-10-10