javascript - HTML Canvas 使用鼠标悬停事件制作线条

标签 javascript canvas

我正在尝试使用 HTML Canvas 编写代码,该代码将创建一行,从发生 mousemove 事件的位置开始。该线具有明确的方向,并且应继续延伸,直到离开屏幕。我遇到的问题是,每次移动鼠标时,都会开始新的一行(这很好),但前一行会停止延伸。我认为问题是因为每个新行都采用一组与前一行同名的参数,但是我不确定这就是问题,也不知道如何解决它。

这是我当前代码的jsfiddle:https://jsfiddle.net/tdammon/bf8xdyzL/

我开始创建一个名为 mouse 的对象,它带有 x 和 y 参数。 xbegybeg 将是我的线条的起始坐标。

let canvas = document.querySelector('canvas');
canvas.width = window.innerWidth;
canvas.height= window.innerHeight;

let c = canvas.getContext('2d');
let mouse ={
    x:undefined,
    y:undefined,
}

window.addEventListener("mousemove",function(event){
    mouse.x = event.x;
    mouse.y = event.y;
    xbeg = mouse.x;
    ybeg = mouse.y;
})

接下来,我创建一个连续调用自身的动画函数。我创建一个新的线对象,它将采用 xbegybeg 参数作为起点,以及 xbeg+10ybeg+10 作为终点。然后该函数递增 xbegybeg。我希望这个函数能够创建新的线条,只要移动鼠标,这些线条就不会停止延伸。

function animate() {

    requestAnimationFrame(animate);

    new Line(xbeg,ybeg,xbeg+10,ybeg+10)

    c.beginPath();
    c.moveTo(xbeg,ybeg);

    c.lineTo(xbeg+10,ybeg+10);
    c.stroke();

    xbeg += 1;
    ybeg += 1;
}

最佳答案

我已经在您的代码中添加了所有行的数组:letlinesRy = [];并且我通过添加this.endx++对您的draw()函数做了一些更改; this.endy++;

我还使用了您注释掉的c.clearRect(0, 0, insideWidth, insideHeight);,因为您在每一帧中都会重新绘制所有线条。 我希望这就是您所需要的。

let linesRy = [];
let canvas = document.querySelector("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

let c = canvas.getContext("2d");
let mouse = {
  x: undefined,
  y: undefined
};
let xbeg, ybeg;

window.addEventListener("mousemove", function(event) {
    mouse.x = event.x;
    mouse.y = event.y;
    xbeg = mouse.x;
    ybeg = mouse.y;
});

class Line {
  constructor(begx, begy, endx, endy, dx, dy, slope) {
    this.begx = begx;
    this.begy = begy;
    this.endx = endx;
    this.endy = endy;
    this.dx = endx - begx;
    this.dy = endy - begy;
    this.slope = dy / dx;
  }

  draw() {
    this.endx++;
    this.endy++;
    c.beginPath();
    c.moveTo(this.begx, this.begy);
    c.lineTo(this.endx, this.endy);
    c.stroke();
  }
}

//let xend = 420;
//let yend = 220;

function animate() {
  requestAnimationFrame(animate);
  c.clearRect(0, 0, innerWidth, innerHeight);

  linesRy.push(new Line(xbeg, ybeg, xbeg + 10, ybeg + 10, 10, 10, 1));

  linesRy.forEach(l => {
    l.draw();
  });
}

animate();
canvas{border:1px solid;}
<canvas></canvas>

关于javascript - HTML Canvas 使用鼠标悬停事件制作线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52694204/

相关文章:

javascript - 修复了 css 中的元素溢出

javascript - 如何将 NSF OpenTopography 点云颜色数据转换为 RGB 值?

javascript - 为什么使用 JavaScript 在 Canvas 上再次重绘后颜色会发生变化?

javascript - 三个js浏览器兼容性

c# - 如何在 WPF Canvas 上绘制矩形

javascript - HTML5 Canvas 转换矩阵

javascript - 使用 ui-router 从 View 内部显示 View

javascript - 服务中的 Angular 范围变化不影响模板

javascript - Arbor js - 将鼠标移到节点上时将节点 ID 显示为文本

javascript - 如何在动态加载的脚本中使用 jQuery on()