【问题标题】:Start a function from a loop but only once从循环中启动一个函数,但只启动一次
【发布时间】:2018-10-09 17:13:11
【问题描述】:

好的,所以我正在为在线 4 人游戏制作大厅功能。一切准备就绪,当所有 4 名玩家都加入大厅时,我想开始倒计时 10 秒,让玩家在客户端点击接受匹配。(灵感来自 csgo) 我使用 ajax 调用和刷新 php 文件中的大厅数据,因此实时统计显示谁在大厅中。 这是一个循环,这里出现了问题。我希望在所有 4 个玩家都加入时调用倒计时函数,并在玩家离开时立即停止它,但是当父函数进入循环时(在 javascript 中使用 set interval),它也会重复调用倒计时函数. 试过这个,但没有帮助。

function loadlobbymodule(x){
var spl = x.split(",");
var lid = spl[1];
    $.ajax({
    url: 'inc/fn/lobbyload.php?lid='+ lid,
    success: function(data) {
        var spl = data.split(",");
        var p1 = spl[0];
        var p2 = spl[1];
        var p3 = spl[2];
        var p4 = spl[3];
        var pl = spl[4];
        var pleft = 4 - pl;
        var p1_i = spl[5];
        var p2_i = spl[6];
        var p3_i = spl[7];
        var p4_i = spl[8];
        if(p1!=''){
            $('#slot1').html('<img src="../../img/' + p1_i +'" width="100px" height="100px"><Br><br>' + p1);
        } else{
            $('#slot1').html('');
        }
        if(p2!=''){
            $('#slot2').html('<img src="../../img/' + p2_i +'" width="100px" height="100px"><Br><br>' + p2);
        }else{
            $('#slot2').html('');
        }
        if(p3!=''){
            $('#slot3').html('<img src="../../img/' + p3_i +'" width="100px" height="100px"><Br><br>' + p3);
        }else{
            $('#slot3').html('');
        }
        if(p4!=''){
            $('#slot4').html('<img src="../../img/' + p4_i +'" width="100px" height="100px"><br><br>' + p4);
        }else{
            $('#slot4').html('');
        }
        $('#slotl').html(pleft + ' players left to join.');
        if(pl == 4){
            var accept = 1;
        } else{
            var accept = 0;
        }
        //alert(accept + ' sent');
        accepto(accept);
      }

});
}
function accepto(x){
    //alert(x + ' reached');
    if (x == 1){
        if (!timeleft){
            timeleft = 10;
            var downloadTimer = setInterval(function(){
            timeleft--;
            $('.h3').html('All players joined. Accept in ' + timeleft + ' seconds');
            if(timeleft <= 0)
                clearInterval(downloadTimer);
            },1000);
        }
    } else {
        $('.h3').html('Waiting for players to join');
    }
}setInterval(function(){loadlobbymodule(loll)}, 500);

【问题讨论】:

    标签: javascript php ajax loops


    【解决方案1】:

    将计时器设为全局并不断检查活跃玩家

    window.myGlobalTimer = yourTimer()
    listening_PlayerThatLeave : ()=>{
      clearTimeout(myGlobalTimer)
    }
    
    listening_AllPlayersIn : ()=>{
      window.myGlobalTimer
    }
    
    /* dont keep making a new timeOut everytime , instead use the global var*/
    function accepto(x){
        //alert(x + ' reached');
        if (x == 1){
            if (!timeleft){
                timeleft = 10;
    //here
                var downloadTimer = setInterval(function(){
                timeleft--;
                $('.h3').html('All players joined. Accept in ' + timeleft + ' seconds');
                if(timeleft <= 0)
                    clearInterval(downloadTimer);
                },1000);
            }
        } else {
            $('.h3').html('Waiting for players to join');
        }
    }
    

    【讨论】:

    • 嘿,很抱歉这么晚才检查,你能教我如何将它集成到我的代码中吗??
    猜你喜欢
    • 2020-10-08
    • 2011-12-20
    • 2015-06-07
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多