【乐畅】工作积累 ---- 后台倒计时 ( 体力恢复功能 )

功能需求:

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 }

 

 

 

 

 

 

结果展示:

 

转载于:https://www.cnblogs.com/dudu580231/p/5670021.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值