【乐畅】工作积累 ---- 后台倒计时 ( 体力恢复功能 )
功能需求:
1. 需要实现倒计时功能,在屏幕上显示00:00格式的倒计时时间
2. 跳转到别的页面中,也需要在后台倒计时来恢复体力
3. 游戏关闭后,再次进入的时候在指定页面中显示倒计时时间和剩余体力值
4. 体力恢复最大值时,显示Max
。。。。。。
思路:
1. 存储一个时间值(心的倒计时结束时间),使用time(0)来获取一个以秒为单位的时间(时间是从1990-01-01开始的时间)
2. 第一次消耗心的时候,存储 当前时间点 + 每颗心恢复所需的时间
3. 之后每次消耗心的时候就存储 读取的存储的时间点 + 每颗心恢复所需的时间
4. 在一个界面中, 获取当前时间点、结束时间点、间隔时间
5. 如果 间隔时间 = 结束时间点 - 当前时间点 <= 0 :倒计时时间已到或已过,恢复最大体力值,暂停倒计时
间隔时间 > 0 : 倒计时开始,调用schedule的自定义updateTimeOneHeart方法,每秒都改变一下 倒计时的Label
6. 在updateTimeOneHeart方法中,获取当前时间点、结束时间点、间隔时间,
计算 倒计时的初始时间 间隔时间 % 每颗心恢复所需要的时间
当 初试时间为 0 的时候 , 心 + 1;在此之前先判断是否为最大的心值
基本就这些了
代码实现:
在需要显示倒计时的界面的init方法中调用timeHeartLabel()函数就可以了,
本程序中,消耗心的时候程序有个动画,所以需要更新下label
在本程序中,有一个定时更新 Label的函数,
我在其中又调用了showHeartTime方法,用来更新界面中的 心的倒计时的 label
1 void LevelMapScrollView::timeHeartLabel() 2 { 3 /* 4 * 判断是否满心 5 * 是否显示倒计时 6 * 7 */ 8 9 // 当时时间(秒) // 满心的时间 // 间隔时间 10 int secTotal = time(0); 11 int endSec = readTimeHeart(); 12 int secOffset = endSec - secTotal; 13 // 满 心 14 if (secOffset <= 0) 15 { 16 int heartNum = UserData::shared()->getHeart(); 17 if (heartNum < 10) 18 { 19 UserData::shared()->setHeart(10); 20 } 21 showHeartTime(); 22 saveTimeHeart(secTotal); 23 unschedule(schedule_selector(LevelMapScrollView::updateTimeOneHeart)); 24 return; 25 } 26 27 // 当前需要恢复的心 28 int nrestoreHeart = secOffset / TimeRestoreHeart + 1; 29 UserData::shared()->setHeart(10 - nrestoreHeart); 30 31 // 倒计时 初始时间 32 m_startTime = secOffset % TimeRestoreHeart; 33 34 log("---- silent ---- LevelMapScrollView :: timeHeartLabel : curSec,endSec,Offsec,startTime : %d, %d, %d, %d" , secTotal, endSec, secOffset, m_startTime); 35 showHeartTime(); 36 schedule(schedule_selector(LevelMapScrollView::updateTimeOneHeart), 1.0f); 37 38 } 39 40 void LevelMapScrollView::updateTimeOneHeart( float dt ) 41 { 42 // 当时时间(秒) 43 int secTotal = time(0); 44 45 // 满心的时间 46 int endSec = readTimeHeart(); 47 48 int secOffset = endSec - secTotal; 49 // 满 心 50 if (secOffset <= 0) 51 { 52 int heartNum = UserData::shared()->getHeart(); 53 if (heartNum < 10) 54 { 55 UserData::shared()->setHeart(10); 56 } 57 showHeartTime(); 58 saveTimeHeart(secTotal); 59 unschedule(schedule_selector(LevelMapScrollView::updateTimeOneHeart)); 60 log("---- silent ---- LevelMapScrollView :: updateTimeOneHeart : curSec,endSec,Offsec,startTime,heart : %d, %d, %d, %d, %d" , secTotal, endSec, secOffset, m_startTime, UserData::shared()->getHeart()); 61 return; 62 } 63 // 倒计时 初始时间 64 m_startTime = secOffset % TimeRestoreHeart; 65 66 if (m_startTime <= 0) 67 { 68 UserData::shared()->setHeart(UserData::shared()->getHeart() + 1); 69 showHeartTime(); 70 log("---- silent ---- LevelMapScrollView :: updateTimeOneHeart : curSec,endSec,Offsec,startTime,heart : %d, %d, %d, %d, %d" , secTotal, endSec, secOffset, m_startTime, UserData::shared()->getHeart()); 71 return; 72 } 73 74 showHeartTime(); 75 76 } 77 78 79 void LevelMapScrollView::showHeartTime() 80 { 81 int nHeartNum = UserData::shared()->getHeart(); 82 m_pHeartCountFont->setString(std::to_string(nHeartNum)); 83 if (nHeartNum >= 10) 84 { 85 m_pHeartTimeFont->setString("Max"); 86 } 87 else if (nHeartNum > 5) 88 { 89 m_pHeartTimeFont->setString(""); 90 } 91 else 92 { 93 int secTemp = TimeRestoreHeart; 94 if (0 != m_startTime) 95 { 96 secTemp = m_startTime; 97 } 98 char strSec[10] = { 0 }; 99 sprintf(strSec, "%02d:%02d", secTemp / 60, secTemp % 60); 100 m_pHeartTimeFont->setString(strSec); 101 } 102 }
结果展示: