Так что я делаю небольшую игру, похожую на тетрис, где плитки падают друг на друга, уничтожаются и т. Д. Я делаю анимацию холста HTML5 через requestAnimationFrame()
. Этот метод называется собирать плитки висит в воздухе и падение их вниз плавно:Как запустить requestAnimationFrame() синхронно?
function dropTiles() {
var tileArray = getFallingTiles();
function step() {
var finished = true;
for (var index = 0; index < tileArray.length; ++index) {
var currentTile = tileArray[index];
if (currentTile.fallDepth > 0) {
finished = false;
currentTile.erase();
currentTile.positionY -= 1;
currentTile.fallDepth -= 1;
currentTile.draw();
}
}
if (!finished) {
window.requestAnimationFrame(step);
}
}
window.requestAnimationFrame(step);
}
Это основной способ, где выше метод вызывается из:
function doGameEvents() {
setCanvasListeners(false);
do {
var comboFactor = 1;
dropTiles();
while (getGroups()) {
score();
dropTiles();
++comboFactor;
}
if (comboFactor == 1) {
var newTile = getRandomTile();
TILES.push(newTile);
dropTiles();
}
} while (!hasMoves());
setCanvasListeners(true);
}
Все работает нормально, но я заметил, что сразу после того, как dropTiles()
называется, управление сразу же переходит к следующей инструкции, даже если последнее еще не закончено (т.е. score()
вызывается с черепицей, все еще висящей в воздухе).
Так что мой вопрос: как сделать requestAnimationFrame()
синхронным и полностью закончить до того, как управление выйдет из моего метода dropTiles()
?