zoukankan      html  css  js  c++  java
  • 【乐畅】工作积累 ---- 后台倒计时 ( 体力恢复功能 )

    功能需求:

    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 }

    结果展示:

  • 相关阅读:
    学习进度条7
    2016年秋季个人阅读计划
    WampServer中MySQL中文乱码解决
    LINK : fatal error LNK1104: 无法打开文件“LIBCD.lib”
    人月神话阅读笔记03
    人月神话阅读笔记02
    个人总结
    人月神话阅读笔记01
    学习进度条15
    学习进度14
  • 原文地址:https://www.cnblogs.com/dudu580231/p/5670021.html
Copyright © 2011-2022 走看看