如何使用:JavaScript Canvas中的多个对象上的globalCompositeOperation

TK421

我正在尝试在JavaScript画布中创建一个圆形菜单,看起来类似于以下内容:

在此处输入图片说明

这是我正在使用的代码:

let canvas = document.querySelector("#canvas");
canvas.width = 500;
canvas.height = 500;
let ctx = canvas.getContext("2d");

ctx.fillStyle = "rgba(0,0,0,.45)"; // color
let circlePath = [];
let centerCircle = new Path2D();

for (let t = 0; t < 8; t++) {
  circlePath[t] = new Path2D();
  circlePath[t].moveTo(250, 250);
  circlePath[t].arc(
    250,
    250,
    190,
    Math.PI * 2 * 0.125 * t,
    Math.PI * 2 * 0.125 * t + Math.PI * 2 * 0.1175
  );
  circlePath[t].closePath();
  ctx.fill(circlePath[t]);
}

ctx.fillStyle = "#fff";
  centerCircle.moveTo(250, 250);
  centerCircle.arc(250,250,100,0,2*Math.PI);
  ctx.fill(centerCircle);
  

canvas.addEventListener("mousemove", function (event) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  for (let t = 0; t < 8; t++) {
    if (ctx.isPointInPath(circlePath[t], event.offsetX, event.offsetY)) {
      ctx.fillStyle = "blue";
    } else {
      ctx.fillStyle = "rgba(0,0,0,.45)";
    }
    ctx.fill(circlePath[t]);
  }

  
  ctx.fillStyle = "#fff";
  centerCircle.moveTo(250, 250);
  centerCircle.arc(250,250,100,0,2*Math.PI);
  //ctx.globalCompositeOperation = "destination-out";
  ctx.fill(centerCircle);
});
#canvas {
            border: 1px solid #000;
            background: green;
        };
<canvas id="canvas"></canvas>

我遇到的问题是,当我尝试使用ctx.globalCompositeOperation = "destination-out";白色圆圈在圆弧的中部“冲出”一个孔时,它会使所有对象消失。

预先感谢您提供的任何输入。

TK421

弄清楚了!必须放置ctx.globalCompositeOperation = "destination-out";在正确的位置,其次是:ctx.globalCompositeOperation = "source-over";

这是更新的代码:

let canvas = document.querySelector("#canvas");
canvas.width = 500;
canvas.height = 500;
let ctx = canvas.getContext("2d");

ctx.fillStyle = "rgba(0,0,0,.45)"; // color
let circlePath = [];
let centerCircle = new Path2D();

for (let t = 0; t < 8; t++) {
  circlePath[t] = new Path2D();
  circlePath[t].moveTo(250, 250);
  circlePath[t].arc(
    250,
    250,
    190,
    Math.PI * 2 * 0.125 * t,
    Math.PI * 2 * 0.125 * t + Math.PI * 2 * 0.1175
  );
  circlePath[t].closePath();
  ctx.fill(circlePath[t]);
}

ctx.fillStyle = "#fff";
centerCircle.moveTo(250, 250);
centerCircle.arc(250,250,100,0,2*Math.PI);
ctx.globalCompositeOperation = "destination-out";
ctx.fill(centerCircle);
ctx.globalCompositeOperation = "source-over";

canvas.addEventListener("mousemove", function (event) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  for (let t = 0; t < 8; t++) {
    if (ctx.isPointInPath(circlePath[t], event.offsetX, event.offsetY)) {
      ctx.fillStyle = "blue";
    } else {
      ctx.fillStyle = "rgba(0,0,0,.45)";
    }
    ctx.fill(circlePath[t]);
  }

  
  ctx.fillStyle = "#fff";
  centerCircle.moveTo(250, 250);
  centerCircle.arc(250,250,100,0,2*Math.PI);
  ctx.globalCompositeOperation = "destination-out";
  ctx.fill(centerCircle);
  ctx.globalCompositeOperation = "source-over";
});
#canvas {
            border: 1px solid #000;
            background: green;
        };
<canvas id="canvas"></canvas>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用类和函数为html5-canvas上的多个对象设置动画?

如何在JavaFX Canvas中同步多个图像上的旋转

如何使用 Javascript 在 Canvas 上绘制 SVG?

如何使用Javascript在JSON中创建多个对象?

JavaScript:如何使用fillRect使用Canvas绘制多个矩形?

Tkinter Canvas-如何在跨越多个对象的区域上创建事件(Python2)

在画布中使用globalCompositeOperation遮罩多个形状

如何从JavaScript中的多个对象过滤

如何使用JavaScript从数组中删除对象?

如何使用 JavaScript 中的函数构建对象

如何使用JavaScript在div中插入对象?

javascript中如何使用id调用对象

如何使用javascript访问对象?

如何使用JavaScript合并对象?

如何使用Javascript移动对象?

如何在 JavaScript 中使用单个对象创建多个对象?

如何使用JavaScript和Canvas在图像上添加文本

如何使用react和javascript基于多个条件从对象数组中检索特定属性?

如何使用 JavaScript 在 JSON API 中的对象内循环多个数组

在 JavaScript 中为 ArcGis 使用对象时如何为多个图层应用过滤器

如何使用属性名称中的多个单词来解析/解析JSON对象-JavaScript

如何过滤掉Javascript对象中的多个嵌套对象

如何同时索引javascript对象上的多个属性

如何使用JavaScript在HTML5 Canvas中绘制圆?

如何使用python或javascript在<canvas>元素中抓取数据?

如何使用canvas和javascript在图表中绘制实心圆弧?

如何在OpenGLES中为多个对象上的多个纹理设置片段着色器?

如何在画布上使用Canvas在移动对象上用自定义图像填充对象?

如何使用JavaScript中的嵌套对象展平对象