Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset=utf-8 />
<title>Move rectangle using time based animation</title>
  <script>
    var canvas, ctx;
    var width, height;
    var x, y, incX; // incX is the distance from the previous drawn rectangle to the new one
    var speedX; // speedX is the target speed of the rectangle, in pixels/s
    
    // for time based animation
     var now, delta;
     var then = new Date().getTime();
    
    // Called after the DOM is ready (page loaded)
    function init() {
      // init the different variables
      canvas = document.querySelector("#mycanvas");
      ctx = canvas.getContext('2d');
      width = canvas.width;
      height = canvas.height;
      
      x=10; y = 10;
      // Target speed in pixels/second, try with high values, 1000, 2000...
      speedX = 200;
      
      // Start animation
      requestAnimationFrame(animationLoop);
    }
    
    function animationLoop() {
      // Measure time
      now = new Date().getTime();
      // How long between the current frame and the previous one ?
      delta = now - then;
      //console.log(delta);
      // Compute the displacement in x (in pixels) in function of the time elapsed and
      // in function of the wanted speed
      incX = calcDistanceToMove(delta, speedX);
            
      // an animation is : 1) clear canvas and 2) draw shapes, 
      // 3) move shapes, 4) recall the loop with requestAnimationFrame
      
      // clear canvas
      ctx.clearRect(0, 0, width, height);
      
      for(var i = 0; i < 20000000; i++) {
        // just to slow down the animation
      }
      
      ctx.strokeRect(x, y, 10, 10);
      
      // move rectangle
      x += incX;
      
      // check collision on left or right
      if((x+10 >= width) || (x <= 0)) {
        // cancel move + inverse speed
        x -= incX;
        speedX = -speedX;
      }
      
      // Store time
      then = now;
      
      requestAnimationFrame(animationLoop);
    }  
    
   
 
    // We want the rectangle to move at speed pixels/s (there are 60 frames in a second)
    // If we are really running at 60 frames/s, the delay between frames should be 1/60
    // = 16.66 ms, so the number of pixels to move = (speed * del)/1000. If the delay is twice
    // longer, the formula works : let's move the rectangle twice longer!
  var calcDistanceToMove = function(delta, speed) {
    return (speed * delta) / 1000; 
  }
    
  </script>
</head>
  
<body onload="init();">
  <canvas id="mycanvas" width="200" height="50" style="border: 2px solid black"></canvas>
</body>
</html>
Output 300px

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
MichelBuffapro
0viewers