【发布时间】:2021-12-16 11:35:01
【问题描述】:
我试图让游戏定期刷新画布,主循环包括一个重播屏幕的函数和一个让计算机计算移动的函数(如果轮到它的话)。玩家可以选择 1-9 步,然后,如果计算机在玩家最后一次移动后还没有离开,它将使用一个非常深的树来计算它的移动。计算机移动需要几秒钟才能移动。尽管在计算机移动之前已经更新了画布,但直到计算机离开后它才会刷新,这意味着玩家和计算机移动是同时显示的,而不是顺序显示的。我可以做些什么来确保画布每 100 毫秒更新一次,而不是在计算机计算出它的移动之后才更新?
function playGame() {
function doKeyDown(evt) {
console.log(evt.keyCode)
if (evt.keyCode > 48 && evt.keyCode < 58) {
game.makeMove(evt.keyCode-48); // 1-9 are user actions
}
}
function mainLoop(ctx, game, board) {
board.showBoard(ctx); // display board
game.makeMove(0); // zero is computer move
}
Canvas.canvas = document.getElementById("myCanvas");
let game = new Game();
let board = new Board(game);
window.addEventListener( "keydown", doKeyDown, true);
Canvas.ctx = Canvas.canvas.getContext('2d');
setInterval(() => {mainLoop(Canvas.ctx, game, board)}, 100);
};
document.addEventListener('DOMContentLoaded', playGame);
【问题讨论】:
-
欢迎来到 JavaScript 的单线程特性。当 JS 主动运行时,浏览器不能做任何事情,包括渲染屏幕。
-
如果可能的话,考虑使用 Web Workers 并行计算一些东西。
标签: javascript canvas 2d-games