javascript - 使鼠标位置 (0, 0) 成为 Canvas 的中心

标签 javascript canvas html5-canvas coordinate-systems

所以我最近一直在摆弄 html5 canvas 并试图弄清楚如何制作粒子系统。虽然它确实有效,但我想制作 vx = 鼠标坐标(特别是 x),但它们从中心开始。

我的意思是,如果光标位于 Canvas 中心,则 vx 将等于 0,如果光标位于 Canvas 中心的右侧,则鼠标坐标为正(如果光标位于 Canvas 中心的左侧,它具有负鼠标坐标)。

一旦完成,我将执行 p.speed += p.vx

这是我的 javascript:

window.onload = function(){
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var W = window.innerWidth, H = window.innerHeight;
canvas.width = W;

canvas.height = H;
var particles = []; 
var particle_count = 100;
for(var i = 0; i < particle_count; i++)
{
    particles.push(new particle());
}
function particle()
{
this.vx = -1 + Math.random() * 2;
    this.speed = {x: 0, y: -15+Math.random()*10};
    this.location = {x: W/2, y: H/2};
    this.radius = 5+Math.random()*10;
    this.life = 20+Math.random()*10;
    this.remaining_life = this.life;

    this.r = Math.round(Math.random()*255);
    this.g = Math.round(Math.random()*55);
    this.b = Math.round(Math.random()*5);

}
function draw()
{
    ctx.globalCompositeOperation = "source-over";
    ctx.fillStyle = "black";
    ctx.fillRect(0, 0, W, H);
    ctx.globalCompositeOperation = "lighter";
    for(var i = 0; i < particles.length; i++)
    {
        var p = particles[i];
        ctx.beginPath();
        p.opacity = Math.round(p.remaining_life/p.life*100)/100
        var gradient = ctx.createRadialGradient(
              p.location.x, p.location.y, 0, p.location.x, p.location.y, p.radius);
        gradient.addColorStop(0, "rgba("+p.r+", "+p.g+", "+p.b+", "+p.opacity+")");
        gradient.addColorStop(0.5, "rgba("+p.r+", "+p.g+", "+p.b+", "+p.opacity+")");
        gradient.addColorStop(1, "rgba("+p.r+", "+p.g+", "+p.b+", 0)");
        ctx.fillStyle = gradient;

ctx.arc(p.location.x, p.location.y, p.radius, Math.PI*2, false);
        ctx.fill(); 
        p.remaining_life--;
        p.radius--;
        p.location.x += p.speed.x += p.vx;
        p.location.y += p.speed.y;
        if(p.remaining_life < 0 || p.radius < 0) {
            particles[i] = new particle();
        }
    }
}

setInterval(draw, 33); }

这是我的 codepen .

最佳答案

  • 您需要翻译上下文以将原点移至中心。
  • 您还需要反转鼠标坐标的转换,因为它们仍然相对于左上角(假设坐标已更正为相对于 Canvas )。

示例:

var cx = canvas.width * 0.5;
var cy = canvas.height * 0.5;

ctx.translate(cx, cy);            // translate globally once

对于每个鼠标坐标补偿平移位置:

var pos = getMousePosition(evt);  // see below
var x = pos.x - cx;
var y = pos.y - cy;

调整鼠标位置:

function getMousePosition(evt) {
    var rect = canvas.getBoundingClientRect();
    return {
      x: evt.clientX - rect.left,
      y: evt.clientY - rect.top
    }
}

关于javascript - 使鼠标位置 (0, 0) 成为 Canvas 的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36416055/

相关文章:

javascript - While 循环与 requestAnimationFrame

javascript - 只显示特定的json信息

javascript - 关于带参数传递函数的函数式编程问题

javascript - 绘制路径 - Canvas

algorithm - 消除生成的渐变纹理上的伪影

javascript - HTML5 Canvas 中的文本框值

html5-canvas - 三.js不渲染

javascript - 基于按钮状态显示/隐藏

javascript - 在第二个 HTML 页面上显示 JavaScript 函数的结果

javascript - 如何使用 HTML5 canvas 调整图片大小,然后将其上传到 Google 云端硬盘?