javascript - 如何强制浏览器重绘图像?

标签 javascript google-chrome animation

我正在开发一个涉及扔雪球的 JavaScript 游戏。我需要雪球在其飞行路径中尽可能频繁地渲染。 Chrome 会执行所有计算,包括设置 style.left 和 style.top 属性,但实际上不会重绘雪球,直到它到达目的地。 Opera 没有这个问题。

相关的一点是,在 renderSnowball() 之后添加 alert() 可以解决问题,但使用alert() 是一个明显的问题。

这是我到目前为止的代码:

function throwSnowball()
{
    var theta = parseFloat(angleField.value) *    Math.PI/180 ;
    var Vir = parseFloat(velocityField.value) ;

    if (!isNaN(Vir) && !isNaN(theta) )
    {

    Vix = Math.cos(theta) * Vir * 50;
    Viy = Math.sin(theta) * Vir * 50;   

time = new Date() ;
var timeThrown = time.getTime() ;

    while (snowballPosY > 0)
    {
        current = new Date() ;
        var currentTime = current.getTime() ;

        var timeElapsed = (currentTime - timeThrown)/5000 ;
        snowballPosX += Vix * timeElapsed;
        snowballPosY += Viy * timeElapsed;
        Viy -= GRAVITY * timeElapsed ;
        renderSnowball() ;      //renderSnowball() sets the style.left
                 // and style.top properties to snowballPosX pixels 
                 // and snowballPosY pixels respectively                        
        timeThrown = currentTime ;
    }

    snowballPosX = 0 ;
    snowballPosY = 50 ;
    renderSnowball() ;
    }
}

最佳答案

你完全阻塞了主线程。您是否尝试过使用 setTimeout(即使超时为零)来允许动画期间发生其他事情?

如果您愿意使用实验技术,requestAnimationFrame会更好。

编辑:setTimeout 方法看起来像这样(替换 while 循环):

var drawAndWait = function() {
  if (snowballPosY > 0) {
    // movement/drawing code here
    setTimeout(drawAndWait, 20 /* milliseconds */);
  } else {
    // reset code that would normally go after your while loop
  }
};
drawAndWait();

因此,每次绘制完成时,它都会在适当的情况下安排再次调用自己。请注意,您的 throwSnowball 函数将快速返回; throw 直到稍后才真正完成。这需要一段时间才能习惯正确的做法;如果一开始不直观,请不要太担心。

关于javascript - 如何强制浏览器重绘图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14008278/

相关文章:

javascript - 从文件中提取数据

google-chrome - 带有 Chrome 的 Visual Studio Code 调试器拒绝连接到本地主机

iphone - 如何在动画时获取项目的坐标?

javascript - 在 Canvas 圆内添加图像

javascript - 按下按钮时图像旋转 croppermaster

css - google chrome for mac定位头痛

android - 如何在android中创建一个 'add to cart'动画?

javascript - 我想让一个词在鼠标悬停期间执行 CSS 动画后消失

javascript - 如何使用浏览器的地址栏更改站点背景颜色?

css - jQueryUI 模态对话框 - 拖动会导致 Google Chrome 中的位置发生意外变化