HTML canvas move circle from a to b with animation

后端 未结 1 782
臣服心动
臣服心动 2020-12-22 04:00

I was wondering what would be the best way to move a circle from point A to point B using smooth animation.

I get new coordinates with websocket every second and wou

相关标签:
1条回答
  • 2020-12-22 04:46

    You can calculate the delta time between the current time of your animation, and its starting time. Then, you just have to move your circle by the difference between its original position and its next position, multiplied by this delta time :

    var deltaTime = (currentTime - startTime) / duration;
    var currentX = prevX + ((nextX - prevX) * deltaTime);
    

    You can get this time directly from the argument passed in requestAnimationFrame callback.

    var x = 100;
    var y = 50;
    var r = 10;
    var duration = 1000; // in ms
    var nextX, nextY;
    var startTime;
    
    function anim(time) {
      if (!startTime) // it's the first frame
        startTime = time || performance.now();
    
      // deltaTime should be in the range [0 ~ 1]
      var deltaTime = (time - startTime) / duration;
      // currentPos = previous position + (difference * deltaTime)
      var currentX = x + ((nextX - x) * deltaTime);
      var currentY = y + ((nextY - y) * deltaTime);
    
      if (deltaTime >= 1) { // this means we ended our animation
        x = nextX; // reset x variable
        y = nextY; // reset y variable
        startTime = null; // reset startTime
        draw(x, y); // draw the last frame, at required position
      } else {
        draw(currentX, currentY);
        requestAnimationFrame(anim); // do it again
      }
    }
    
    move.onclick = e => {
      nextX = +x_in.value || 0;
      nextY = +y_in.value || 0;
      anim();
    }
    
    // OP's code
    
    var WIDTH = 600;
    var HEIGHT = 400;
    
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    
    function circle(x, y, r) {
      ctx.beginPath();
      ctx.arc(x, y, r, 0, Math.PI * 2, true);
      ctx.fill();
    }
    
    function clear() {
      ctx.clearRect(0, 0, WIDTH, HEIGHT);
    }
    
    function draw(x, y) {
      clear(WIDTH, HEIGHT);
      ctx.fillStyle = "purple";
      circle(x, y, r);
    }
    
    draw(x, y);
    #canvas {
      border: 1px solid black;
    }
    <label>X: </label><input type="number" id="x_in">
    <label>Y: </label><input type="number" id="y_in">
    <input type="button" id="move" value="MOVE">
    <canvas id="canvas" width=600 height=400></canvas>

    0 讨论(0)
提交回复
热议问题