本文实例为大家分享了Cocos2dx实现数字跳动效果的具体代码,供大家参考,具体内容如下
封装的类如下:
.h文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class DigitalBeatText: public cocos2d::Node { public : DigitalBeatText(); ~DigitalBeatText(); static DigitalBeatText *create( int value); void setValue( int newValue); protected : bool init( int value); void setValueNoAction( int newValue); void startRoll(); void stopRoll(); void onTimeHandler( float dt); protected : cocos2d::ui::Text * m_txt; int m_lastValue; int m_newValue; int m_valueGap; //数字跳动间隔 float m_scheduleInterval; //调度器间隔 bool m_isReverse; // true: 从大到小 }; |
.cpp文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
DigitalBeatText::DigitalBeatText() :m_txt(nullptr) , m_lastValue(0) , m_newValue(0) , m_valueGap(0) , m_scheduleInterval(1.0f/60.f) , m_isReverse( false ) { } DigitalBeatText::~DigitalBeatText() { } DigitalBeatText* DigitalBeatText::create( int value) { auto pRet = new DigitalBeatText; if (pRet->init(value)) { pRet->autorelease(); return pRet; } CC_SAFE_DELETE(pRet); return nullptr; } bool DigitalBeatText::init( int value) { if (!Node::init()){ return false ; } char buff[16] = { 0 }; m_txt = ui::Text::create(); m_txt->setFontSize(36); sprintf (buff, "%d" , value); m_txt->setString(buff); this ->addChild(m_txt); return true ; } void DigitalBeatText::setValue( int newValue) { m_isReverse = newValue < m_lastValue; stopRoll(); m_newValue = newValue; startRoll(); } void DigitalBeatText::setValueNoAction( int newValue) { m_lastValue = newValue; m_newValue = newValue; m_txt->setString(cocos2d::StringUtils::toString(m_lastValue)); } void DigitalBeatText::startRoll() { int count = m_newValue - m_lastValue; if (count>0){ m_valueGap = ceil (count / (1.0 / m_scheduleInterval)); } else { m_valueGap = floor (count / (1.0 / m_scheduleInterval)); } schedule(CC_SCHEDULE_SELECTOR(DigitalBeatText::onTimeHandler), m_scheduleInterval); } void DigitalBeatText::stopRoll() { unschedule(CC_SCHEDULE_SELECTOR(DigitalBeatText::onTimeHandler)); } void DigitalBeatText::onTimeHandler( float dt) { m_lastValue += m_valueGap; bool stop = false ; if (!m_isReverse) { if (m_lastValue >= m_newValue){ m_lastValue = m_newValue; stop = true ; } } else { if (m_lastValue <= m_newValue){ m_lastValue = m_newValue; stop = true ; } } m_txt->setString(cocos2d::StringUtils::toString(m_lastValue)); if (stop){ this ->stopRoll(); } } |
使用示例:
1
2
3
4
5
6
7
|
m_index = 1; m_beatT = DigitalBeatText::create(m_index); m_beatT->setPosition(visibleSize*0.5); this ->addChild(m_beatT); m_index += RandomHelper::random_int(0, 100) - 50; m_beatT->setValue(m_index); |
效果如图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/auccy/article/details/85561116