循环第一次执行与下一次执行之间的延迟

Omer

我正在尝试制作simon游戏,我快完成了,但是遇到了问题。在simon游戏中,当simon给您提供您需要记住并随后重复的顺序(由闪烁的灯光和每个灯光的音频表示)时,每次闪烁(带有音频)与下一个闪烁之间会有短暂的延迟。

因此,现在,我的simon可以发出声音,但可以立即完成所有声音。我尝试使用setIntarvelsetTimeout但仍然可以立即播放所有音频。

由于添加闪烁并不难,所以我将其保留到最后。

然后我建立了一个计时器函数:

function timer(delayInMS) {
    var time = new Date();
    var currentTime = time.getTime();
    var nextTime = time.getTime() + delayInMS;
    while (currentTime != nextTime) {
        time = new Date();
        currentTime = time.getTime();
        }
}

并在播放音频的函数中使用了它,但它仍在做相同的事情-一次播放所有内容。

这是负责音频的功能:

function playAudio(btnSound) {
    if (btnSound == "c") {
        c.play();
    }
    if (btnSound == "g") {
        g.play();
    }
    if (btnSound == "a") {
        a.play();
    }
    if (btnSound == "d") {
        d.play();
    }
}

这个功能负责游戏的逻辑:

var btns = ["c", "g", "a", "d"];
var randomOrder = "";

var playerInputOrder = "";

var timer = 1000;    //For timer()

function randomSimon() {
var randomBtn = btns[Math.floor(Math.random() * 4)];
randomOrder += randomBtn;
for  (i = 0; i <= randomOrder.length - 1; i++) {
    for (s = 0; s <= i; s++) {
        var someText = "";
        someText += randomOrder.charAt(s);
        playAudio(randomOrder.charAt(s));
        document.getElementById('debug').innerHTML = someText; //this is for debugin, should be ignored.
        timer(500);
    }
}

}

这是整个脚本,供您更好地阅读:

var isGameStarted = false;

var d = new Audio("dSharpNote.wav");
var a = new Audio("aSharpNote.wav");
var g = new Audio("gSharpNote.wav");
var c = new Audio("cNote.wav");

var btns = ["c", "g", "a", "d"];
var randomOrder = "";

var playerInputOrder = "";

var timer = 1000;

function startGame() {
    isGameStarted = true;         //So players won't be able to just press the simon's buttons.
    randomOrder = "";             //A variable to keep the random order given by the simon.
    playerInputOrder = "";        //A variable to keep the random order the player inputs.
    randomSimon();                //Called to give the first button in the order.
}

function randomSimon() {                                       //Adds one random button to the order and saves the order.
    var randomBtn = btns[Math.floor(Math.random() * 4)];       //Adds the random button.
    randomOrder += randomBtn;                                  //Saves the random order.
    for  (i = 0; i <= randomOrder.length - 1; i++) {           //this should play all the audios one by one according the saved order
        for (s = 0; s <= i; s++) {
            var someText = "";
            someText += randomOrder.charAt(s);
            playAudio(randomOrder.charAt(s));
            document.getElementById('debug').innerHTML = someText;         //this is for debugin, should be ignored.
            timer(500);
        }
    }
}

function timer(delayInMS) {
    var time = new Date();
    var currentTime = time.getTime();
    var nextTime = time.getTime() + delayInMS;
    while (currentTime != nextTime) {
        time = new Date();
        currentTime = time.getTime();
    }
}

function playerProgress(btn) {                        //Getting the player's input and checks if it's in the right order.
    if (isGameStarted == true) {
        var btnClicked = btn.id;                      //Gets the id of the button the player clicked.
        playAudio(btnClicked);                        //So this could play it's audio.
        playerInputOrder += btnClicked;
        if (playerInputOrder.length == randomOrder.length) {
            if (playerInputOrder == randomOrder) {
                playerInputOrder = "";
                setTimeout(randomSimon, 1000);
            } else {
                document.getElementById('scoreText').innerHTML = randomOrder + " Game Over!";
                isGameStarted = false;               //Makes the player unable to play the simon's button's audios.
            }
        }
        document.getElementById('debug').innerHTML = playerInputOrder;
    }
}

function playAudio(btnSound) {
    if (btnSound == "c") {
        c.play();
    }
    if (btnSound == "g") {
        g.play();
    }
    if (btnSound == "a") {
        a.play();
    }
    if (btnSound == "d") {
        d.play();
    }
}

function someInterval() {
    var i = 0;
    var anInterval = setInterval(function() {
        i++;
        if (i > 11) {
            clearInterval(anInterval);
            timer *= 2;
        }
    }, timer);
}
菲利普·弗兰

因此,您想在每个playAudio通话后暂停一下吗?

我还是会超时

var sounds = {};
sounds.a = ...;
sounds.b = ...;

function playAudio(sound, callback) {
    if (typeof sounds[sound] === "undefined") {
        throw "sound not available";
    }
    sounds[sound].play();
    if (typeof callback !== "undefined") {
        window.setTimeout(callback, 500);
    }
}

// play a - pause - b - pause c
playAudio("a", function(){
    playAudio("b", function() {
        playAudio("c");
    });
});

如果您先构建序列,那么也可以动态进行

var sequence = ["a", "b", "c"];
var pointer = 0;

playAudio(sequene[pointer], function() {
    pointer += 1;
    if (typeof sequence[pointer] !== "undefined") {
        playAudio(sequence[pointer], this); // this will be bound to the function itself
    } else {
        alert("sequence finished");    
    }
});

这未经测试,但可以正常工作,如果没有,请通知我。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将类变量从程序的第一次执行传递到下一次执行?

第一次执行setInterval函数而不会延迟

for循环仅在第一次迭代时执行

Javascript“ for”循环未在第一次完全执行

对于下一次迭代之前的循环延迟

在进行下一次迭代之前,如何使我的for循环完全执行任务?

如何在第一次循环迭代后获取更改的内容(字符串)以用于机器人框架的下一次迭代

Javascript / jQuery:在第一次AJAX调用成功时开始“闪烁”,在下一次停止

如何延迟ReactiveCommand.CreateFromTask第一次执行

在不将第一次执行延迟指定的时间之后

scheduleAtFixedRate第一次运行后未执行

rxjs仅在第一次执行tap

函数在第一次单击时未执行

仅Python执行第一次打印

以下程序是否在外循环的第一次迭代中执行嵌套循环?

为什么在第一次循环后不执行while循环?

“ For”循环第一次迭代

Cin在循环的第一次迭代后无法执行

如何在下一次迭代之前在JavaScript循环中添加延迟?

该功能旨在每15次单击执行一次,但始终在第一次单击时执行

在JS / JQUery中执行下一次循环迭代之前,如何使代码等待x秒?

等待循环中的异步功能完成执行,然后再进行下一次迭代

在第二次执行时暂停函数的第一次执行(Python)

2的下一次幂

如何等待将在下一次分派时执行的块成功?

Foreach 应该等待下一次迭代,直到 wait 在节点中执行

$ .get在下一次执行代码之前不起作用

GPU MATLAB 在第一次和第二次执行之间给出不同的经过时间

save()被调用一次,但是第一次在猫鼬中执行两次