【问题标题】:html5 canvas animation. leaving a trail and reset buttonhtml5画布动画。留下痕迹和重置按钮
【发布时间】:2013-12-14 22:30:52
【问题描述】:

我对此很陌生,我通过观看 youtube 教程使动画正常工作。
这是键盘控制汽车的画布动画。

http://jsfiddle.net/unn9P/

canvas = document.getElementById('canvas');
c = canvas.getContext('2d');
c.clear = function() { 
                        this.clearRect(0,0,1500,1500) };
function wait(fn)    {
                        window.setTimeout(fn, 250)    }
function repeat(fn)  {
         if (requestAnimationFrame) {
             var advance = function() {fn(); requestAnimationFrame(advance);};
             requestAnimationFrame(advance);
          } else window.setInterval(fn, 50);
}
var dx = 0, dy = 0, mousex = 0, mousey=0, mouseclicks = 0;
document.onkeydown = function(e) {
var key = e.keyCode;
if (key == 37) dx=-1; 
 else if (key == 38) dy=-1; 
  else if (key == 39) dx=1; 
   else if (key == 40) dy=1; 
     else return true; 
return false;
};
document.onkeyup = function(e) {
      var key = e.keyCode; 
      if (key == 37 || key == 39) dx=0; 
       else if (key == 38 || key == 40) dy=0;
        else return true; 
      return false;
};
canvas.onmousemove = function(e) {
       var rect = canvas.getBoundingClientRect(); 
       mousex = e.clientX - rect.left; 
       mousey = e.clientY - rect.top;
};
canvas.onmousedown = function(e) {mouseclicks++;};
      a = new Image();
  a.src = 'http://o.ooli.ca/car_top.png';

  wait(function(){  
        x = 50;
        y = 50;
        angle = 0;
        repeat(function() {     
                        angle = angle + dx;
                        x = x - dy * Math.cos(angle * Math.PI / 180);
                        y = y - dy * Math.sin(angle * Math.PI / 180);   
                        c.clear();
                        c.translate(x, y);
                        c.rotate(angle * Math.PI / 180);
                            c.translate(-37, -19);
                        c.drawImage(a, 0, 0);
                        c.setTransform(1, 0, 0, 1, 0, 0); //reset   
        });
});

现在我想在汽车行驶时在汽车后面添加轨迹,并在画布内创建一个重置按钮,它可以帮助我清除轨迹,并将汽车带到初始位置。
我已经阅读了一些教程,但似乎找不到我想要的。
关于我应该如何做到这一点有什么想法/建议吗?

【问题讨论】:

    标签: html animation canvas


    【解决方案1】:

    移动时简单记录你的积分:

    Modified fiddle here

     repeat(function () {
    
         angle = angle + dx;
         x = x - dy * Math.cos(angle * Math.PI / 180);
         y = y - dy * Math.sin(angle * Math.PI / 180);
    
         /// record point
         pts.push([x, y]);
    
         c.clear();
    
         /// render points (see below)
         renderTrail(pts, c);
    
         c.translate(x, y);
         ...
    

    然后有一个函数来渲染记录的点:

    function renderTrail(pts, c) {
        if (pts.length > 1) {
            c.beginPath();
            c.moveTo(pts[0][0], pts[0][1]);
            for(var i = 1, pt; pt = pts[i]; i++) {
                c.lineTo(pt[0], pt[1]);
            }
            c.stroke();
        }
    }
    

    要重置只需清除点数组:

    pts = [];
    

    您可以在您选择绘制按钮的画布上的鼠标单击事件上执行此操作,或者只是在画布顶部放置一个 html 按钮(在其上方,字面意思是在顶部会降低画布的性能)。

    【讨论】:

    • 非常感谢您的帮助!
    猜你喜欢
    • 2023-04-05
    • 2019-06-09
    • 2011-12-30
    • 2019-04-16
    • 1970-01-01
    • 2012-05-11
    • 2010-11-04
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多