Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 糖果粉碎传奇式倒计时生活系统jQuery&;音差_Javascript_Jquery_Cordova_Phonegap Plugins_Cordova 3 - Fatal编程技术网

Javascript 糖果粉碎传奇式倒计时生活系统jQuery&;音差

Javascript 糖果粉碎传奇式倒计时生活系统jQuery&;音差,javascript,jquery,cordova,phonegap-plugins,cordova-3,Javascript,Jquery,Cordova,Phonegap Plugins,Cordova 3,我正在开发一个应用程序,我对实现糖果迷恋传奇式倒计时生活系统感兴趣。 我的应用程序是用phonegap(html、css jquery和jquery mobile)开发的,直到现在我还不知道如何使用外部文件,因为我认为在这个算法中需要它。 因此,我希望有5条生命,当用户失败或退出lvl并在10分钟后重新生成时,每条生命都会消失。如果应用程序关闭,如何保持计数器处于活动状态? 或者一个日期减法算法 如果有人有Phonegap方面的知识,我将非常感谢他能帮助我使用JSFIDLE,我将在我的应用程序中

我正在开发一个应用程序,我对实现糖果迷恋传奇式倒计时生活系统感兴趣。 我的应用程序是用phonegap(html、css jquery和jquery mobile)开发的,直到现在我还不知道如何使用外部文件,因为我认为在这个算法中需要它。 因此,我希望有5条生命,当用户失败或退出lvl并在10分钟后重新生成时,每条生命都会消失。如果应用程序关闭,如何保持计数器处于活动状态? 或者一个日期减法算法

如果有人有Phonegap方面的知识,我将非常感谢他能帮助我使用JSFIDLE,我将在我的应用程序中进一步实现它

我也不知道该用什么:本地存储vs数据库

如果有人能为我提供一个关于这个问题的JSFIDLE示例,我将拿出我的50美元奖金


谢谢大家!

Edit:抱歉,这是一些基于PHP的伪代码,但您不需要疯狂的算法或任何东西

我不写手机应用程序,但我知道你想做什么,你想得太多了。当应用程序关闭时,您不需要运行计数器。您可以保存游戏结束时的时间戳,并在下次打开应用程序时引用它

start_game();

if($lives > 0){ //run game
    if($death === true){
        $lives = $lives - 1;
        $timer_value = date(Y-m-d h:i:s);
        end_game($timer_value); //save starting time locally in "end_game" function
    }

} else {
    //buy more lives
}
现在让我们假设用户将其关闭并打开。您可以参照当前时间与保存的时间。每过10分钟,增加一次生命

$old_time = strtotime($timer_value); //635393400
$cur_time = strtotime(date(Y-m-d h:i:s)); //635394600

if( $cur_time - $old time > 600 ) { $lives = $lives + 1; }
if( $cur_time - $old time > 1200 ) { $lives = $lives + 2; }
if( $cur_time - $old time > 1800 ) { $lives = $lives + 3; }
if( $cur_time - $old time > 2400 ) { $lives = $lives + 4; }
if( $cur_time - $old time > 3000 ) { $lives = $lives + 5; }
if( $lives > 5 ) { $lives = 5; }

这是一些可怕的代码lol,但你的想法。您不需要在后台运行计时器(如果不在线进行服务器检查,你真的无法关闭应用程序,这基本上是一样的,但将所有个人生活记录存储在云中而不是手机上。

我会使用与Xhynk建议类似的逻辑。我会使用类似于MilisSecondSunTilYouGainaLife的变量,以及当你丢失fir时st life,设置此变量=1000ms*60sec*10min=600000。然后在主循环中的第一行(大约)记录当前时间。下次它到达循环时,也记录时间并从毫秒减去差值直到你的生命。如果<0,则life++。同时确保在“关闭应用程序”中函数记录时间并在主循环中检查该时间

伪代码:

function game(){
    ...
    while(mainLoop){
         oldTime = curTime
         curTime = GetTime() //I Forget the exact code to get the miliseconds
         deltaTime = curTime - oldTime
         if(deltaTime > milisectionsUntilYouGainALife){
            if(lives < MAX_LIVES){
                lives++
                milisecondsUntilYouGainALife - deltaTime
             }
          }

    }
}
function AppClosing(){
    curTime = GetTime()
 }
function LoseALife(){ 
    milisecondsUntilYouGainALife += 600000
}
函数游戏(){
...
while(主循环){
oldTime=curTime
curTime=GetTime()//我忘记了获取毫秒的确切代码
deltaTime=curTime-oldTime
if(deltaTime>milisectionsUntilYouGainALife){
如果(寿命<最大寿命){
生活++
米利森蒂尔尤盖纳利夫-德尔塔蒂姆
}
}
}
}
函数AppClosing(){
curTime=GetTime()
}
函数LoseALife(){
百万秒直到你的生命+=600000
}

我可能遗漏了一些东西,但这应该会让你走上正轨!

在这段代码中,我使用了
localStorage
,因为它们在所有平台和web上都可用。
使用本地存储,您将获得更好的跨平台兼容性:

  • (本地存储和会话存储)
Localstorage是数组,但每个元素中只能有字符串(使用JSON我们可以存储任何东西,这不是递归的)。对于web来说,它大约是5MB。我想对于移动应用来说,它是无限的。当用户关闭浏览器时,SessionStorage会被删除,我不确定它在移动设备上会如何操作

只是一个小型的日期验证程序

Date.prototype.isValid = function(first_argument) {
    if ( Object.prototype.toString.call(this) !== "[object Date]" )
        return false;
    return !isNaN(this.getTime());
}
从localStorage检索变量中的主var声明

var timeout = null;
var maxlife = 5;
if (undefined === localStorage.life) {
    localStorage.life = maxlife;
}
if (undefined === localStorage.date||localStorage.date=="") {
    localStorage.date = "";
    var date = null;
}else{
    var date = new Date(Number(localStorage.date));
    if(!date.isValid()){
        date = null;
    }
}
var timeoutTime = 5 * 60000;
var life = Number(localStorage.life);
失去生命,如果还不存在,则设置日期。同时设置超时并减去生命(&将其写入本地存储)

添加寿命、设置日期新日期或完全重置日期。如果需要,设置超时并添加寿命(&将其写入本地存储)

这个函数检查从现在和我们失去生命的日期的差异中减去我们获得生命所需的时间的次数

function tillNow(){
    if (life < maxlife&&date!=null) {
        var d = new Date();
        var diff = d - date;
        while (diff - timeoutTime > 0) {
            diff = diff - timeoutTime;
            if (life < maxlife) {
                life++;
                console.log("add");
            }else{
                date = null;
                localStorage.date = "";
                break;
            }
        }
        localStorage.life = life;
        if (life < maxlife) {
            date = new Date((new Date()).getTime()-diff);
            localStorage.date = date.getTime();
            timeout = setTimeout(function(){addLife()}, timeoutTime-diff);
        }
    }
    lives.innerHTML = life;
}
Onload与focus的操作相同,但最初会用一个值填充div

window.onload=function(){
    var lives = document.getElementById("lives");
    lives.innerHTML = life;
    tillNow();
}

抱歉,由于他们不喜欢本地存储,所以无法使用JSFIDLE代码笔。(演示使用15秒作为计时器来获得新生命;)我不耐烦了)

怀疑存储“生命”是个好主意在loca上,可操作的存储。特别是当你考虑在人与人之间进行在线领头羊游戏/竞争时,大多数游戏都是这样的。我建议你使用小型服务器后端(NodeJS就可以了),这将保存并返回玩家的生命。每当有人开始一个关卡时,从服务器加载关卡数据,这样人们每次开始一个关卡时都会失去一个生命。为了重新生成,请保存一个时间戳,如果在任何请求中,上次生命是在>10分钟前给出的,则根据从那以后经过的时间添加1-5。@user1610743好的游戏是这样的。@user1610743不在线..就像《糖果迷恋》中我开始一个lvl时,游戏中会有生命,如果我失去生命,如果我通过lvl,到达下一个lvl,生命就会失去。我也不知道该用什么:本地存储vs DB?有时间戳的部分很好,但如果我失去了总共5个生命戳中的3个,而我在玩第二个生命戳时,3'r呢d必须重新生成,如果我没有松开,则比第4个和第5个更大。如果我也松开,则第二个将丢失…我是jquerry的新手,phonegap和我已丢失。如果你有更多的知识,请发布一个JSFIDLE示例。但是,例如,如果我正在玩4个,并且游戏尚未结束,则5个LIVE也应重新生成。因此,他们将如果我不关闭应用程序,你会重新激活alos。重新激活应该在我失去生命的那一刻开始。a关于if,你告诉我,例如,如果我失去t lifes,当前时间是1200,则会增加3 lifes,因为它也会在第一个if中运行,如果>600,这不是我想要的情况。还有一个问题,存储呢?wich我应该使用?localstorage还是DB?所以实际上整个人生经历都应该和candy crush一样。嘿,伙计!我试着在我的
window.addEventListener('blur', function () {
    clearTimeout(timeout);
});
function tillNow(){
    if (life < maxlife&&date!=null) {
        var d = new Date();
        var diff = d - date;
        while (diff - timeoutTime > 0) {
            diff = diff - timeoutTime;
            if (life < maxlife) {
                life++;
                console.log("add");
            }else{
                date = null;
                localStorage.date = "";
                break;
            }
        }
        localStorage.life = life;
        if (life < maxlife) {
            date = new Date((new Date()).getTime()-diff);
            localStorage.date = date.getTime();
            timeout = setTimeout(function(){addLife()}, timeoutTime-diff);
        }
    }
    lives.innerHTML = life;
}
window.addEventListener('focus', function () {
    tillNow();
});
window.onload=function(){
    var lives = document.getElementById("lives");
    lives.innerHTML = life;
    tillNow();
}