javascript - 让移动Rect更流畅

标签 javascript canvas html5-canvas

我想让我的 Rect 的“动画”更流畅。目前它真的很笨重。我知道这是为什么。其中一个坐标先于另一个成为所需值。

例如,如果我目前在 (0,0) 并且我需要去 (150,75) 并且我每秒平均递增每个,则 y-cord 将比 x-cord 快得多。

enter image description here

var canvas = document.getElementById('canvas');
var ctx = document.getElementById('canvas').getContext('2d');

var aniTimer;

var x;
var y;

var tx = tx || 0;
var ty = ty || 0;

var xDir;
var yDir;

function followMouse(e) {
  x = e.offsetX;
  y = e.offsetY;
  cancelAnimationFrame(aniTimer);
  moveObject();
}

function moveObject() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  
  if (x < tx) {
    xDir = -1;
  } else {
    xDir = 1;
  }
  if (y < ty) {
    yDir = -1;
  } else {
    yDir = 1;
  }
  tx = tx != x ? tx + xDir : tx;
  ty = ty != y ? ty + yDir : ty;
  
  
  ctx.fillRect(tx - 25 , ty + 25, 50, 10);
  if ( tx != x || ty != y ) {
    aniTimer = window.requestAnimationFrame(moveObject);
  }
}

function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
};

canvas.addEventListener('mousemove', _.throttle(function(e) {
  followMouse(e);
}, 100));

window.addEventListener('resize', resizeCanvas, false);

resizeCanvas();
html,
body {
  margin: 0;
  height: 100%;
}

canvas {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<canvas id="canvas"></canvas>

最佳答案

那是因为你设置的 dir [+-1, +-1] 而不是 [dx, dy] (实际位移),它们并不总是成比例的。

查看修改后的代码段:

var canvas = document.getElementById('canvas');
var ctx = document.getElementById('canvas').getContext('2d');

var x;
var y;

var tx = tx || 0;
var ty = ty || 0;

var xDir;
var yDir;

function followMouse(e) {
  x = e.pageX;
  y = e.pageY;
  moveObject();
}

function moveObject() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  var scale =  0.2 * Math.max(canvas.width, canvas.height);
  xDir = (x - tx) / scale;
  yDir = (y - ty) / scale;
  tx = tx != x ? tx + xDir : tx;
  ty = ty != y ? ty + yDir : ty;


  ctx.fillRect(tx - 25, ty + 25, 50, 10);
  if (tx != x || ty != y) {
    window.requestAnimationFrame(moveObject);
  }
}

function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
};

canvas.addEventListener('mousemove', _.throttle(function(e) {
  followMouse(e);
}, 100));

window.addEventListener('resize', resizeCanvas, false);

resizeCanvas();
html,
body {
  margin: 0;
  height: 100%;
}
canvas {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<canvas id="canvas" style="border: 1px solid black"></canvas>

关于javascript - 让移动Rect更流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36981848/

相关文章:

javascript - 拦截 jQuery 移动页面流,在页面更改之前解析 JSON

javascript - 无法将对象转换为原始值

iphone - 带有 HTML5 Canvas 和 Retina 显示屏的 UIWebView

javascript - 在 HTML5 中使用drawImage

css - 调整 Canvas 大小 onclick 按钮

javascript - 使用动态创建的变量来访问对象中的命名对象

javascript - 不同浏览器中的日期解析

javascript - 横幅设计创建者 - 测量

javascript - 如何在 HTML5 canvas 上自动播放视频短片?

javascript - 如何在fabric js中实现橡皮擦