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

功能需求:

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 }

结果展示:

时间: 2024-11-13 09:07:58

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

工作积累之NDK编译STL (zhuan)

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnust

工作积累(五)——使用[email&#160;protected]注解实现常量功能

之前的博客中提到过如何通过 java.util.ResourceBundle 和 java.util.Properties类通过读取 key-value 文件的形式实现常量功能.其实 spring 已经通过@Value 注解实现,下面看看如何使用. 1.创建.properties文件: 在如下目录创建 keyvalue.properties文件src/main/resources/META-INF/spring/keyvalue.properties ,写入如下内容: test.value=il

[工作积累] NDK通过Java获取package name 和version

////////////////////////////////////////////////////////////////////////// //Java code snippet //get APK's versionCode in AndroidManifest.xml public int getVersionCode() { int versionCode = 1; try{ PackageInfo packageInfo = this.getPackageManager().g

HAL层Camera模块Dump图片--工作积累

导出YUN数据进行调试,分析问题: 1 // dump图像数据 事列 2 void dump(const int width, const int height, void *yBuf, void *uvBuf) 3 { 4 char buf[256] = {'\0'}; 5 FILE* file_fd = fopen(buf, "wb"); 6 snprintf(buf, sizeof(buf), "/data/Effect/%dx%dvideodenoiser%d.yuv

[工作积累] Google/Amazon平台的各种坑

所谓坑, 就是文档中没有标明的特别需要处理的细节, 工作中会被无故的卡住各种令人恼火的问题. 包括系统级的bug和没有文档化的限制. 继Android的各种坑后, 现在做Amazon平台, 遇到的坑很多, 这里记录一下备忘: 先汇总下Android Native下的各种问题, 当然有些限制有明确文档说明,不算坑,但是限制太多还是很不爽: android平台下的某些限制: android下的各种坑 (我的C/C++/汇编/计算机原理博客) OBB的各种bug: OBB的解决方案 arm gcc t

C#使用命令模式实现撤销和恢复功能

第一次写关于设计模式的随笔,最近在使用C#做一个WinForm的项目,其中要求需要支持撤销和恢复功能,想到了以前看过Command模式支持撤销和恢复操作,就在项目中使用了.对命令模式理解的不够深,各位看客请指正. Gof23种设计模式中的Command模式,其意图是这么描述的“将一个请求封装为一个对象,从而是你可以用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作”:另外个人的理解就是可以将调用者和接受者解耦出来.下图为Comand的类图: .首先理解将调用者和接受者解

《暗黑世界GM管理后台系统》部署+功能说明文档

(一)功能描述 该后台共分为三大部分:服务器管理.单服数据统计和扶持账号管理. 1.服务器管理: 根据管理后台数据库中填写的服务器信息(后面会讲到如何填写要管理的服务器的信息到数据库中),该部分可以看到所有服务器的名称,ip地址,开服时间以及开启状况,其中对服务器的开启.关闭功能尚未开放.在运营商及服务器后面的下拉列表中可根据需求选择对应的游戏服务器进行管理. 2.单服数据统计: 同上,需要先在运营商及服务器后面的下拉列表中选择对应的服务器,才可查看相应服务器的信息. 这部分分为单日的详细数据和

vmware 后台运行不能恢复

==百度贴吧== wmlchi: 这是因为和你安装的某个软件有冲突所致.现确定迅雷7有冲突.你卸载掉迅雷7安装上迅雷5就没冲突了,VMWARE就可以正常从后台恢复了. ps:不知道是不是真的,确实装了个迅雷,果断把迅雷卸载了,试试看..

工作积累(九)——前后台传递类Map型参数

最近在工作中整合友盟消息推送服务时,遇到了用 Ajax 向 Java 后台传递自定义参数的需求,当时想要采取 java.util.Map ,但发现 Ajax 无法传递 java.util.Map 类型的参数,后来无奈采取的方式的是采用了这样的 Vo 对象: public ExtraVo {   private List<String> keys;   private List<String> values;   //省略 get | set 方法 } 取值时: if(extraVo