javascript - 为 javascript 游戏创建计时器会产生不良结果

标签 javascript html canvas timer

我正在使用 Canvas/JavaScript 在 HTML5 中设计游戏。 我的目标是创建一个计时器,在您需要射击尽可能多的敌人时,它会从一定的分钟数倒计时到零。我一直忙于寻找有效的计时器,但一些实现导致浏览器崩溃(可能是无限循环)或 (timeInSeconds) 的倒计时变得很快。

这是我最近实现的代码,试图让它工作

function setTimerCountdown(){
timeInSeconds = timeInSeconds - 1;
    ctx.fillText(timeInSeconds, 200,180);
}

我已经有一个用于更新游戏的 setInterval 这是代码,这段代码位于 js 文件的底部

var main = function () {

var now = Date.now();
var delta = now - then;
update(delta / 1000);
render();
then = now;
};

// Let's play this game!
reset();
var then = Date.now();
var fps = 60;
setInterval(main, 1000/fps); // Execute as fast as possible

然后我有额外的代码,例如渲染函数,它将图片和文本渲染到屏幕上,这里是代码

var render = function () {

returnKillsNeeded(stageNum);
            ctx.drawImage(startGameImg, 0,0);
            ctx.font = "24px Helvetica";
            ctx.textAlign = 'center';
            ctx.textBaseline = "top";
            ctx.fillText("press Enter to start", 250, 300);
            ctx.fill();
    if(gameStart){
if (bgReady) {
ctx.drawImage(bgImage, 0, 0);


}
setInterval(setTimerCountdown, 1000);
setTimeOut(setTimerCountdown, 1000);
ctx.fillStyle="#522900";
ctx.fillRect(0,480,500,120);

这个想法是从 120 开始倒计时(我知道没有可用的捕捉来阻止时间进入负值,以及不必要的代码,即 currentTime 和 time. 如前所述,几次实现尝试都被证明是不成功的,

我的问题是,我应该在渲染方法中使用 setInterval 或 setTimeOut 或计时器的任何方面吗?上面引用的代码是否与我应该用来创建计时器的代码相同?我知道那里有很多示例,但我似乎无法深入了解如何将这些代码应用到我的代码中,而不会搞砸我迄今为止所做的所有工作。我附上了链接,我愿意用它来向你展示我的研究,但由于这个网站上的弹出窗口令人沮丧(修复你的代码结构),我已经排除了来自名为 goTreeHouse 的 youtube channel 的视频链接 - 在 javascript 和几个堆栈中创建一个计时器已经问过的问题。

添加更多可能相关的信息。我没有使用任何 API(JQuery 等)。仅 HTML5、CSS、JavaScript(使用 Notepad++ )。

感谢您的帮助,同时指出您当前看到的代码中的任何错误。另外我想还有一个 div 标签,只有 1 个被使用是 Canvas 的 div 标签,所有文本、图像和音乐都是通过 js,再次没有额外的 API

编辑: 下面是编辑后的代码,还要注意渲染函数中的 if 语句 block ,这是为了阻止负数显示在屏幕上(但是它没有考虑到函数在后台仍在更新并且负值越来越大,我会研究解决这个问题。

//Thanks to GameAlchemist
function createCountDown(timeRemaining) {
    var startTime = Date.now();
    return function() {
    return timeRemaining - ( Date.now() - startTime );
    }
}
var currentCountDown = createCountDown(30000);

// Draw everything
var render = function () {



var countDownValue = currentCountDown();

returnKillsNeeded(stageNum);
            ctx.drawImage(startGameImg, 0,0);
            ctx.font = "24px Helvetica";
            ctx.textAlign = 'center';
            ctx.textBaseline = "top";
            ctx.fillStyle="#FF0000";
            ctx.fillText("press Enter to play", 250, 450);
            ctx.fill();
    if(gameStart){
if (bgReady) {
ctx.drawImage(bgImage, 0, 0);


}

ctx.fillStyle="#522900";
ctx.fillRect(0,480,500,120);
ctx.drawImage(scoreImg, 22,522);
ctx.drawImage(livesImg, 360,522);

ctx.drawImage(progressImg, 200,492);
createProgressBar();
createProgressPercent();
ctx.fillText("progress", 170,492);
setEnemyHealthText();
drawPlayer();
if(countDownValue <=0){
    countDownValue = 0;
    }else{
ctx.fillText(countDownValue, 200,190);
}

最佳答案

使用闭包,几行代码就可以实现倒计时。
因为我猜你需要不止一个倒计时(每个阶段一个),这里有一个返回倒计时函数的函数:

function createCountDown(timeRemaining) {
    var startTime = Date.now();
    return function() {
       return timeRemaining - ( Date.now() - startTime );
    }
}

就是这样!

现在要使用它,请执行以下操作:

// creating a coundown, at stage start
var currentCountDown = createCountDown(30000); // 30 seconds countdown

//... during the game, just use with :
var countDownValue = currentCountDown();     // in ms

关于javascript - 为 javascript 游戏创建计时器会产生不良结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19244394/

相关文章:

javascript - Meteor JS main.js 只接受 'imports' 目录而不是 'client'

iOS 设备上的 html 电子邮件

javascript - Google 上的 URL 变量 'My Maps'

html - 如何用 HTML5 canvas 将一个圆分成三等份?

jquery - 在图像上绘制对象并拖动图像

javascript - 如何使用 Meteor JS 访问服务器端代码中的客户端变量?

javascript - 有没有更简洁的方法来编写这个更改数组中项目的 reducer 函数?

javascript - 使用 Django 开发服务器时 HTML5 视频元素不可搜索

javascript - 图片不显示,高宽调整为0*0,但原图还在

javascript - Canvas 圆弧偏移从 1.5PI 开始