您的位置:首页 > 其它

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

2016-07-14 12:30 267 查看
功能需求:

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

void LevelMapScrollView::timeHeartLabel()
{
/*
*    判断是否满心
*  是否显示倒计时
*
*/

// 当时时间(秒) // 满心的时间 // 间隔时间
int secTotal = time(0);
int endSec = readTimeHeart();
int secOffset = endSec - secTotal;
// 满 心
if (secOffset <= 0)
{
int heartNum = UserData::shared()->getHeart();
if (heartNum < 10)
{
UserData::shared()->setHeart(10);
}
showHeartTime();
saveTimeHeart(secTotal);
unschedule(schedule_selector(LevelMapScrollView::updateTimeOneHeart));
return;
}

// 当前需要恢复的心
int nrestoreHeart = secOffset / TimeRestoreHeart + 1;
UserData::shared()->setHeart(10 - nrestoreHeart);

// 倒计时 初始时间
m_startTime =  secOffset % TimeRestoreHeart;

log("---- silent ---- LevelMapScrollView :: timeHeartLabel : curSec,endSec,Offsec,startTime : %d, %d, %d, %d" , secTotal, endSec, secOffset, m_startTime);
showHeartTime();
schedule(schedule_selector(LevelMapScrollView::updateTimeOneHeart), 1.0f);

}

void LevelMapScrollView::updateTimeOneHeart( float dt )
{
// 当时时间(秒)
int secTotal = time(0);

// 满心的时间
int endSec = readTimeHeart();

int secOffset = endSec - secTotal;
// 满 心
if (secOffset <= 0)
{
int heartNum = UserData::shared()->getHeart();
if (heartNum < 10)
{
UserData::shared()->setHeart(10);
}
showHeartTime();
saveTimeHeart(secTotal);
unschedule(schedule_selector(LevelMapScrollView::updateTimeOneHeart));
log("---- silent ---- LevelMapScrollView :: updateTimeOneHeart : curSec,endSec,Offsec,startTime,heart : %d, %d, %d, %d, %d" , secTotal, endSec, secOffset, m_startTime, UserData::shared()->getHeart());
return;
}
// 倒计时 初始时间
m_startTime =  secOffset % TimeRestoreHeart;

if (m_startTime <= 0)
{
UserData::shared()->setHeart(UserData::shared()->getHeart() + 1);
showHeartTime();
log("---- silent ---- LevelMapScrollView :: updateTimeOneHeart : curSec,endSec,Offsec,startTime,heart : %d, %d, %d, %d, %d" , secTotal, endSec, secOffset, m_startTime, UserData::shared()->getHeart());
return;
}

showHeartTime();

}

void LevelMapScrollView::showHeartTime()
{
int nHeartNum = UserData::shared()->getHeart();
m_pHeartCountFont->setString(std::to_string(nHeartNum));
if (nHeartNum >= 10)
{
m_pHeartTimeFont->setString("Max");
}
else if (nHeartNum > 5)
{
m_pHeartTimeFont->setString("");
}
else
{
int secTemp = TimeRestoreHeart;
if (0 != m_startTime)
{
secTemp = m_startTime;
}
char strSec[10] = { 0 };
sprintf(strSec, "%02d:%02d", secTemp / 60, secTemp % 60);
m_pHeartTimeFont->setString(strSec);
}
}


结果展示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: