Javascript 从HTML5画布图形中删除辉光?

Javascript 从HTML5画布图形中删除辉光?,javascript,html,canvas,html5-canvas,Javascript,Html,Canvas,Html5 Canvas,如果我在黑色背景上画一个绿色圆圈,然后用黑色画同一个圆圈,后面会留下一个绿色阴影/光晕。圆圈实际上并没有被擦除 如何使其再次变为纯黑色并消除辉光 我尝试了context.shadowColor=“transparent” 以下是一个片段: context.beginPath(); context.arc(x-1, y-2, 2, 0, 2*Math.PI); context.fillStyle = "#FF0000"; //context.strokeStyle = "#FF0000"; //c

如果我在黑色背景上画一个绿色圆圈,然后用黑色画同一个圆圈,后面会留下一个绿色阴影/光晕。圆圈实际上并没有被擦除

如何使其再次变为纯黑色并消除辉光

我尝试了
context.shadowColor=“transparent”

以下是一个片段:

context.beginPath();
context.arc(x-1, y-2, 2, 0, 2*Math.PI);
context.fillStyle = "#FF0000";
//context.strokeStyle = "#FF0000";
//context.stroke();
context.fill();
context.beginPath();
context.arc(x-1, y-2, 2, 0, 2*Math.PI);
context.fillStyle = "#000000";
//context.strokeStyle = "#000000";
//context.stroke();
context.fill();
以下是完整的对象:


如何清除画布。

从你给你的图像来看,你想写一个游戏或某种动画

完成游戏和动画的一般方法是每帧重新绘制整个游戏屏幕。这大大简化了渲染引擎的设计。通过简单地更改绘制顺序,可以轻松地绘制一个对象。要让某些东西消失,就不要渲染它

我假设您知道如何加载图像

清除屏幕

有几种方法可以清除屏幕

// assuming ctx is the 2d Context and width and height are the canvas width and height.
ctx.clearRect(0, 0, width, height); 
或者用矩形填充屏幕

var backgroundColour = "#000";
ctx.fillStyle = backgroundColour;
ctx.fillRect(0, 0, width, height);
或者使用背景图像

var backgroundImage = new Image();
backgroundImage.src = "backgroundImage URL";
// then wait for image to load.
// then 
ctx.drawImage(backgroundImage, 0, 0, width, height);
绘制精灵

现在您可以绘制图形了。同样,有很多方法可以做到这一点。一种方法是保留所有对象的列表,并在屏幕清除后一次性绘制所有对象

// create or load a game sprite (image)
var gameSprite = new Image();
gameSprite.src = "gameSprite URL";
// create a list of sprites.
var mySprites = [
    {x : 10, y : 10, image : gameSprite}, // sprite 1
    {x : 30, y : 60, image : gameSprite}, // sprite 2
    {x : 70, y : 40, image : gameSprite}  // sprite 3
];

// itterate the list and draw each sprite one at a time.
function renderSprites (spriteList) {
    var i,len,s;
    len = spriteList.length;
    for (i = 0; i < len; i++) {
        s = spriteList[i];
        ctx.drawImage(s.image, s.x, s.y);
    }
}

这将以每秒60帧的速度运行,可以轻松处理100多个精灵(除了最基本的设备外)

如何清除画布。

从你给你的图像来看,你想写一个游戏或某种动画

完成游戏和动画的一般方法是每帧重新绘制整个游戏屏幕。这大大简化了渲染引擎的设计。通过简单地更改绘制顺序,可以轻松地绘制一个对象。要让某些东西消失,就不要渲染它

我假设您知道如何加载图像

清除屏幕

有几种方法可以清除屏幕

// assuming ctx is the 2d Context and width and height are the canvas width and height.
ctx.clearRect(0, 0, width, height); 
或者用矩形填充屏幕

var backgroundColour = "#000";
ctx.fillStyle = backgroundColour;
ctx.fillRect(0, 0, width, height);
或者使用背景图像

var backgroundImage = new Image();
backgroundImage.src = "backgroundImage URL";
// then wait for image to load.
// then 
ctx.drawImage(backgroundImage, 0, 0, width, height);
绘制精灵

现在您可以绘制图形了。同样,有很多方法可以做到这一点。一种方法是保留所有对象的列表,并在屏幕清除后一次性绘制所有对象

// create or load a game sprite (image)
var gameSprite = new Image();
gameSprite.src = "gameSprite URL";
// create a list of sprites.
var mySprites = [
    {x : 10, y : 10, image : gameSprite}, // sprite 1
    {x : 30, y : 60, image : gameSprite}, // sprite 2
    {x : 70, y : 40, image : gameSprite}  // sprite 3
];

// itterate the list and draw each sprite one at a time.
function renderSprites (spriteList) {
    var i,len,s;
    len = spriteList.length;
    for (i = 0; i < len; i++) {
        s = spriteList[i];
        ctx.drawImage(s.image, s.x, s.y);
    }
}

这将以每秒60帧的速度运行,可以轻松处理100多个精灵(除了最基本的设备)

@adeneo我已经这样做了,但我不希望其他对象也被删除!!这是由抗锯齿造成的,您必须尝试另一种方法,例如清除整个画布并重新绘制图像,或者使用多个画布。可以做的事情不多。它是抗锯齿的结果,以及如何将其转换为画布的位深度。您可以复制画布的部分,然后在需要删除已绘制的内容时绘制保存的副本。或者你可以在每次更改显示内容时绘制所有内容。你能提供一个JSFIDLE链接吗?@adeneo我已经这样做了,但我不希望其他对象也被删除!!这是由抗锯齿造成的,您必须尝试另一种方法,例如清除整个画布并重新绘制图像,或者使用多个画布。可以做的事情不多。它是抗锯齿的结果,以及如何将其转换为画布的位深度。您可以复制画布的部分,然后在需要删除已绘制的内容时绘制保存的副本。或者,您可以在每次更改显示内容时绘制所有内容。是否可以提供JSFIDLE链接?