【问题标题】:How do I move an image in JavaScript?如何在 JavaScript 中移动图像?
【发布时间】:2015-09-05 08:43:48
【问题描述】:

我正在尝试使用 JS 绘制和移动图像。

这段代码一直有效,直到 moveImage 函数什么都不做。谁能帮我解决这个问题?

我相信如果我将图像放在 html 中,我可以移动它,但如果可能的话,我希望让脚本代码代替它。

function init() {
  var x = 1, y = 1;

  var context = document.getElementById("Vehicle").getContext("2d");
  var img = new Image();
  img.onload = function () { context.drawImage(img, x, y, 24, 20); }
  img.src = "images/Image.png";

  //move
  function moveImage(imgX, imgY) { 
    img.style.left = imgX + "px";
    img.style.top = imgY + 'px';
  }

  setInterval(function () {
    var FPS = 60;
    x++;
    y++;
    if (x > 1000) { x = 1; }
    if (y > 1000) { y = 1; }
    moveImage(x, y);
  }, 1000/FPS);
};

我的猜测是 img.style.left/right 要么不正确,要么我没有正确指向 img。

如果没有办法做到这一点,有没有办法让我删除(不仅仅是隐藏)图像,以便我可以在新位置重新绘制它?

【问题讨论】:

  • 你能提供一个小提琴吗?
  • 你打电话给init()了吗?
  • 尝试在初始化代码中设置img.style.position = 'absolute',AFAIK leftright仅在positionabsolutefixed时适用。
  • 为什么图片会移动?它在屏幕上不存在,您已经绘制了它的 副本,但它不会更新,只是因为您移动了一个不相关的元素。每次更改图像时,您都需要重新绘制

标签: javascript image canvas move


【解决方案1】:

您有范围问题。您在区间内定义FPS。这需要在之前完成,以便可以在间隔步长参数上使用。

var FPS = 60;
var timer = (1000/FPS);

setInterval(function () {
    x++;
    y++;
    if (x > 1000) { x = 1; }
    if (y > 1000) { y = 1; }
    moveImage(x, y);
  }, timer);

此外,您不能简单地在画布上重新定位图像。它需要重新绘制到画布上。

一旦您致电context.drawImage(),该图像将无法再被操纵。正如它所暗示的,你已经把它画到了画布上。它与 DOM 中的 HTML 元素不同。它现在只是画布上的彩色像素。

查看演示:http://jsfiddle.net/8Ljvnt8j/1/

但是,您会注意到图像正在重复。这是因为您在画布上绘图。画布是 2d 的,所以你只是在已经存在的东西之上绘画

因此你需要清理画布。

img.onload = function () { 
   context.clearRect(0, 0, canvas.width, canvas.height);
   context.drawImage(img, imgX, imgY, 24, 20);
}

查看演示:http://jsfiddle.net/8Ljvnt8j/2/


总而言之:

function init() {

    var x = 1;
    var y = 1;

    var canvas = document.getElementById("Vehicle");

    drawImage();

  //move
  function drawImage() {       
      var context = document.getElementById("Vehicle").getContext("2d");
      var img = new Image();
      img.onload = function () { 
      context.clearRect(0, 0, canvas.width, canvas.height);
      context.drawImage(img, x, y, 24, 20);
  }
  img.src = "https://placeholdit.imgix.net/~text?txtsize=5&txt=20%C3%9720&w=20&h=20";

  }

  var FPS = 60;
   var timer = (1000/FPS);

setInterval(function () {
    x++;
    y++;
    if (x > 1000) { x = 1; }
    if (y > 1000) { y = 1; }
    drawImage();
  }, timer);
};

init();

【讨论】:

  • 这不会在一段时间后造成资源问题吗?
  • @user3630993 你是什么意思?会出现什么资源问题?
  • @user3630993 Canvas 与 HTML DOM 元素不同。你不能重新定位它,因为它不存在。它已被绘制到画布上。就像你不能在一张纸上画图然后移动它一样。
  • @user3630993:闭上你的脸,这是一个很好的答案。无论如何,您的公开面孔毫无意义,什么资源?
  • @user3630993:我对任何事情都不生气(也许是因为我们存在的衰败状态),我是 JK JK。享受你的新工作;)
猜你喜欢
  • 1970-01-01
  • 2013-08-06
  • 2021-10-11
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2018-03-14
相关资源
最近更新 更多