简体   繁体   English

使鼠标位置(0,0)成为画布的中心

[英]Making mouse position (0, 0) the center of the canvas

So I've recently been messing around with html5 canvas and trying to figure out how to make a particle system. 所以我最近一直在搞乱html5画布并试图弄清楚如何制作一个粒子系统。 While it does work I want to make vx = mouse coordinates(specifically x) but they start from the center. 虽然它确实有效但我想制作vx =鼠标坐标(特别是x),但它们从中心开始。

What I mean by this is basically if the cursor is in the center of the canvas then vx would be equal to 0 and if the cursor is to the right from the center of the canvas it have positive mouse coordinates (and if the cursor is to the left from the center of canvas it have negative mouse coordinates). 我的意思是,基本上如果光标位于画布的中心,那么vx将等于0,如果光标位于画布中心的右侧,则它具有正的鼠标坐标(如果光标是从画布中心左侧它有负鼠标坐标)。

Once that is accomplished I would just do p.speed += p.vx 一旦完成,我只会做p.speed += p.vx

Here is my javascript: 这是我的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); }

Here is my codepen . 这是我的codepen

  • You need to translate context to move origin to center. 您需要翻译上下文以将原点移动到中心。
  • You also need to reverse the translation on the mouse coordinates as they will still be relative to the upper-left corner (assuming the coordinates are corrected to be relative to canvas). 您还需要反转鼠标坐标上的平移,因为它们仍然相对于左上角(假设坐标被修正为相对于画布)。

Example : 示例

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

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

For each mouse coordinate compensate with the translated position: 对于每个鼠标坐标补偿翻译位置:

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

To adjust mouse position: 要调整鼠标位置:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM