如何让 Canvas 中的两张图片不相互擦除?
How can I get my two images in Canvas not erasing each other?
我正在尝试使用 Html 和 JS 在 Canvas 中设置小游戏。我遇到一个问题,但我不明白我错过了什么。
我在 canvas 中绘制了两个 sprites 表,但是当它们彼此靠近时,我的 drawloop 底部的一个擦除另一个。
我导入我的 srpites,对其进行绘制和动画处理,然后使用 setTimeout 在 drawloop 中调用所有内容以降低动画速度
function drawArthur() {
updateFrame();
animations();
resetAnimations();
context.drawImage(arthurImage, arthur.srcX, arthur.srcY, arthur.width, arthur.height, arthur.x, arthur.y, arthur.width, arthur.height);
arthurImage.style.zIndex = '1';
}
function updateFrame() {
arthur.currentFrame = ++arthur.currentFrame % arthur.colums;
arthur.srcX = arthur.currentFrame * arthur.width;
arthur.srcY = 0;
context.clearRect(arthur.x, arthur.y, arthur.width, arthur.height);
// if (myModule.newZombie.isCrashed) {
// arthur.die = true;
// console.log(arthur.die);
// }
}
function animations() {
arthur.srcX = arthur.currentFrame * arthur.width;
if (arthur.goRight) {
arthur.srcY = arthur.goRowRight * arthur.height;
} else if (arthur.goLeft) {
arthur.srcY = arthur.goRowLeft * arthur.height;
} else if (arthur.duckRight) {
arthur.srcY = arthur.duckRowRight * arthur.height;
} else if (arthur.atkRight) {
arthur.srcY = arthur.atkRowRight * arthur.height;
if (zombie.x < 274 && zombie.x > 262) {
console.log('killllll');
zombie.dieRight = true;
} else if (zombie.x < 262) {
zombie.dieRight = false;
zombie.x = -50;
} else if (arthur.jumpRight) {
arthur.srcY = arthur.jumpRowRight * arthur.height;
}
}
}
// function that reset all states every time in the draw loop to set the states at the origin state
function resetAnimations() {
arthur.stand = arthur.right;
arthur.goLeft = false;
arthur.goRight = false;
arthur.duckRight = false;
arthur.atkRight = false;
arthur.jumpRight = false;
}
function drawLoop() {
setTimeout(function () {
context.clearRect(0, 0, theCanvas.width, theCanvas.height);
drawArthur();
drawZombie();
requestAnimationFrame(function () {
drawLoop();
});
}, 150);
createNewZombie();
console.log(allZombies);
}
我无法管理两个让我的两个角色相互重叠。
drawloop 中的最后一个,这里是 Zombie,当亚瑟从他身边经过时会抹掉他。
谢谢!
假设您的 drawZombie
方法也调用类似的 updateFrame()
方法,
而且它还有一行 context.clearRect(arthur.x, arthur.y, arthur.width, arthur.height);
发生的事情是你
1) 清理亚瑟身后的区域
2) 画亚瑟
3) 清除僵尸后面的区域即使亚瑟在僵尸后面
4) 绘制僵尸
因为您要用 context.clearRect(0, 0, theCanvas.width, theCanvas.height);
清除 drawLoop
中的整个 canvas,所以您不需要再执行 (1) 和 (3)。
从 updateFrame
方法中删除 context.clearRect(...)
。
或
如果你确实想要那些额外的东西 clearRect(...)
只需确保它们都发生在你画亚瑟和僵尸之前
希望对您有所帮助
我正在尝试使用 Html 和 JS 在 Canvas 中设置小游戏。我遇到一个问题,但我不明白我错过了什么。
我在 canvas 中绘制了两个 sprites 表,但是当它们彼此靠近时,我的 drawloop 底部的一个擦除另一个。
我导入我的 srpites,对其进行绘制和动画处理,然后使用 setTimeout 在 drawloop 中调用所有内容以降低动画速度
function drawArthur() {
updateFrame();
animations();
resetAnimations();
context.drawImage(arthurImage, arthur.srcX, arthur.srcY, arthur.width, arthur.height, arthur.x, arthur.y, arthur.width, arthur.height);
arthurImage.style.zIndex = '1';
}
function updateFrame() {
arthur.currentFrame = ++arthur.currentFrame % arthur.colums;
arthur.srcX = arthur.currentFrame * arthur.width;
arthur.srcY = 0;
context.clearRect(arthur.x, arthur.y, arthur.width, arthur.height);
// if (myModule.newZombie.isCrashed) {
// arthur.die = true;
// console.log(arthur.die);
// }
}
function animations() {
arthur.srcX = arthur.currentFrame * arthur.width;
if (arthur.goRight) {
arthur.srcY = arthur.goRowRight * arthur.height;
} else if (arthur.goLeft) {
arthur.srcY = arthur.goRowLeft * arthur.height;
} else if (arthur.duckRight) {
arthur.srcY = arthur.duckRowRight * arthur.height;
} else if (arthur.atkRight) {
arthur.srcY = arthur.atkRowRight * arthur.height;
if (zombie.x < 274 && zombie.x > 262) {
console.log('killllll');
zombie.dieRight = true;
} else if (zombie.x < 262) {
zombie.dieRight = false;
zombie.x = -50;
} else if (arthur.jumpRight) {
arthur.srcY = arthur.jumpRowRight * arthur.height;
}
}
}
// function that reset all states every time in the draw loop to set the states at the origin state
function resetAnimations() {
arthur.stand = arthur.right;
arthur.goLeft = false;
arthur.goRight = false;
arthur.duckRight = false;
arthur.atkRight = false;
arthur.jumpRight = false;
}
function drawLoop() {
setTimeout(function () {
context.clearRect(0, 0, theCanvas.width, theCanvas.height);
drawArthur();
drawZombie();
requestAnimationFrame(function () {
drawLoop();
});
}, 150);
createNewZombie();
console.log(allZombies);
}
我无法管理两个让我的两个角色相互重叠。 drawloop 中的最后一个,这里是 Zombie,当亚瑟从他身边经过时会抹掉他。
谢谢!
假设您的 drawZombie
方法也调用类似的 updateFrame()
方法,
而且它还有一行 context.clearRect(arthur.x, arthur.y, arthur.width, arthur.height);
发生的事情是你
1) 清理亚瑟身后的区域
2) 画亚瑟
3) 清除僵尸后面的区域即使亚瑟在僵尸后面
4) 绘制僵尸
因为您要用 context.clearRect(0, 0, theCanvas.width, theCanvas.height);
清除 drawLoop
中的整个 canvas,所以您不需要再执行 (1) 和 (3)。
从 updateFrame
方法中删除 context.clearRect(...)
。
或
如果你确实想要那些额外的东西 clearRect(...)
只需确保它们都发生在你画亚瑟和僵尸之前
希望对您有所帮助