javascript - Canvas 游戏中的图像闪烁

标签 javascript html canvas

在一个大学项目中,我的任务是创建一个 Flappy Bird 克隆版本。这是使用 HTML5 Canvas 完成的。

这个问题并不经常发生,但似乎每隔 6 秒左右,草就会闪烁一次。我不确定是什么原因造成的,可能是性能问题。

这是一个链接,您可以看到该问题:http://canvas.pixcelstudios.uk

这是我用来绘制草的函数:

var drawGrass = function(cWidth, ctx, minusX)
{
	var x = bg_grass.x;
	var y = bg_grass.y;
	var w = bg_grass.w;
	var h = bg_grass.h;
	var img = bg_grass.img;

	if (minusX[0] >= cWidth)
	{
		bg_grass.x = 0;
		minusX[0] = 0;
	}

	ctx.drawImage(img, x, y, w, h);

	if (minusX[0] > 0)
	{
		ctx.drawImage(img, w-minusX[0], y, w, h);
	}
};

基本上,我正在绘制两个草 Sprite ,每个 Sprite 占据 Canvas 宽度。一个从 X 0 开始,另一个从 Canvas 末尾开始。两者每帧都会递减,然后其中一个完全离开屏幕,完全重置以保持循环。

我认为这与我的更新循环没有任何关系,如下所示:

this.update = function()
	{
		clearScreen();
		updateBackground();
		updatePositions();
		checkCollisions();
		render();
		requestAnimFrame(gameSpace.update);
	};

我已经阅读了一些内容,并且读到了有关使用第二个 Canvas 充当缓冲区的内容。显然这可以停止闪烁并提高性能?但我见过的所有示例都显示零件被循环绘制到 Canvas 中,并且我无法真正看到在游戏循环中执行此操作(移动零件和所有零件)会如何提高性能而不是降低性能。当然正在执行相同的操作,只不过现在您还必须将第二个 Canvas 绘制到第一个 Canvas 上?

如果您需要更多信息,请告诉我(尽管您应该能够从网络链接中看到完整的源代码)。

谢谢!

最佳答案

好的,我发现问题了!只是我的drawGrass函数中的一个简单错误。

由于顺序的原因,只有一个帧,我将速记 X 变量设置为 bg_grass.x,然后将 bg_grass.x 设置为其他值,因此绘制了错误的值。

我现在已经在第一个 if 语句之后设置了速记变量。

但是,如果有人能够对有关缓冲区 Canvas 的问题的第二部分提供任何见解,我仍然非常感激。

关于javascript - Canvas 游戏中的图像闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33830912/

相关文章:

javascript - jQuery 插件覆盖默认设置中的 url

html - 将图像左对齐放在固定的导航栏上

html - 使用 CSS content 属性设置图像并使其不拉伸(stretch)

javascript - 使用 HTML5 Canvas 为绘画应用创建逼真的铅笔工具

javascript - 将 Node/Express 应用程序部署到 Heroku/Production -- Babel/ES6 错误

javascript - 查找嵌套数组中的多个元素

javascript - 如何在使用 jquery/css 删除隐藏 div 后按顺序移动 div "up"

javascript - 将图像绘制到 Canvas 并通过 base64 对其进行编码

javascript - 从 Canvas 获取像素颜色

javascript - 使用 Angular 6 我们如何捕获特定的 div 或页面组件?