【发布时间】:2023-04-05 11:15:01
【问题描述】:
我正在尝试制作一个小游戏来玩画布。我决定选择Flappy Bird,因为网上有很多例子。我的目标是让游戏对所有设备都“响应”。如果您在手机或任何屏幕中打开它,您应该可以正常播放它。
为此,我在画布中绘制了一个背景图像,它将使高度适应屏幕的高度,并在 x 轴上重复。
我遇到的问题是,当我为这只鸟设置动画时,它会在它身后留下一条痕迹。
就像这样:
如本文所述,一个简单的解决方法是清除画布:
Canvas image leaves weird trail when moving left
但这是不可能的,因为我绘制背景的方式(我绘制一次,如果调整大小则重新绘制)。
问题
如何避免这种带有静态背景的图像轨迹?是否有可能拥有不需要重新绘制的虚假静态背景?
我显然想在画布中做,而不需要在 html 中有图像。
这是主要功能的代码,你可以看看:
const cvs = document.getElementById("canvas");
const ctx = cvs.getContext("2d");
cvs.style.height = "100vh";
cvs.style.width = "100vw";
var bird = new Image();
var bg = new Image();
bird.src = "https://lh3.googleusercontent.com/prntPuix7QxlhKXx6IBtTxv7PrdEJtmzFJ4mopScNS1_klze86BVNy3PqHbQn2UQ4JyJdix3XQ=w128-h128-e365";
bg.src = "https://opengameart.org/sites/default/files/bg_5.png";
let gravity = 1;
birdPositionY = 10;
birdPositionX = 50;
const draw = () => {
ctx.drawImage(bird, birdPositionX, birdPositionY);
birdPositionY += gravity;
birdPositionX += 3;
requestAnimationFrame(draw);
};
const resizeCanvas = () => {
const {
width,
height
} = cvs.getBoundingClientRect();
cvs.height = height;
cvs.width = width;
let x = 0,
y = 0;
while (x < cvs.width && y < cvs.height) {
ctx.drawImage(bg, x, y, 360, cvs.height);
x += bg.width;
}
};
bg.onload = () => {
resizeCanvas();
};
window.addEventListener("resize", resizeCanvas, false);
draw();
<!DOCTYPE html>
<html>
<head>
<title>Flappy Bird</title>
<meta name="viewport" content="width=device-width, user-scalable=no" />
<style>
html {
overflow: hidden;
}
body {
margin: 0;
}
canvas {
width: 100vw;
height: 100vh;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script src="index.js"></script>
</body>
</html>
希望它确实有意义!
提前致谢!
【问题讨论】:
标签: javascript html css canvas html5-canvas