当前位置: 首页 > news >正文

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

功能需求:

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

相关文章:

  • block防止循环引用的技巧
  • 分布式部署lamp,phpmyadmin,wordpress的安装与应用
  • == 和 equals()的区别
  • Java基本语法-----java常量
  • 开发中的对控件大小 颜色等默认状态的意识
  • 面试资料
  • Linux 常用命令(一)
  • [转载] FFMPEG之AVRational TimeBase成员理解
  • 用GNS3制作路由交换网络拓扑图
  • libevent
  • linux下历史命令history使用方法
  • matlab灰度变彩色+白平衡算法实现
  • Activityd的四种启动模式
  • 详解web.xml中元素的加载顺序
  • HDU 5773 The All-purpose Zero
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Java IO学习笔记一
  • Java读取Properties文件的六种方法
  • JS 面试题总结
  • js面向对象
  • Laravel 菜鸟晋级之路
  • miaov-React 最佳入门
  • nodejs:开发并发布一个nodejs包
  • Python socket服务器端、客户端传送信息
  • REST架构的思考
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue全家桶实现一个Web App
  • Webpack 4 学习01(基础配置)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 计算机常识 - 收藏集 - 掘金
  • 检测对象或数组
  • 使用API自动生成工具优化前端工作流
  • 为视图添加丝滑的水波纹
  • ​Spring Boot 分片上传文件
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #、%和$符号在OGNL表达式中经常出现
  • #NOIP 2014# day.2 T2 寻找道路
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (算法二)滑动窗口
  • (转)ABI是什么
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .NET 中的轻量级线程安全
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net中生成excel后调整宽度
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ??myeclipse+tomcat
  • @Autowired @Resource @Qualifier的区别
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [@Controller]4 详解@ModelAttribute
  • [20170705]diff比较执行结果的内容.txt
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件