javascript - 画布 - 刷新不像我预期的那样工作
问题描述
我正在学习如何在 JS 中创建游戏,我添加了背景、角色和动作。当我没有 ctx.clear(..) 时,角色正在移动但不清除上一个图像,当我有 ctx.clear 时,我看不到我的角色...
我尝试使用 setInterval 作为更新功能,但我的角色在闪烁,仍然没有创建更新/刷新的好选择
document.addEventListener('DOMContentLoaded', () => {
window.requestAnimationFrame(update.bind(this));
update();
movingCharacter.moving(ctx);
});
function update() {
let now
let then = Date.now();
let delta;
now = Date.now();
delta = now - then;
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawFigure.draw(ctx, 0, 0, windowsWidth, windowsHeight,'#000000');
drawImages.draw(ctx, imagesCharacterList.panda, pandaPosition[0],
pandaPosition[1], 50, 50);
window.requestAnimationFrame(update.bind(this));
}
export default class DrawImages {
draw(ctx, image, x, y, width, height) {
const img = new Image();
img.src = image;
img.onload = () => {
ctx.drawImage(img, x, y, width, height);
}
}
}
export const pandaPosition = [100, 200];
export class MovingCharacter {
moving(ctx) {
document.addEventListener('keydown', (key) => {
switch (true) {
case key.keyCode === 87:
pandaPosition[1] -= 1;
break;
case key.keyCode === 83:
pandaPosition[1] += 1;
break;
case key.keyCode === 68:
pandaPosition[0] += 1;
break;
case key.keyCode === 65:
pandaPosition[0] -= 1;
break;
case key.keyCode === 32:
pandaPosition[1] -= 10;
// ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
break;
}
})
}
}
我想移动我的角色并看到它......
解决方案
基本上,正如 Wiktor Zychla 所说,您不应该在每次绘制时都加载图像。
创建DrawImages
类时加载图像,然后仅在更新循环中绘制图像。
class DrawImages {
constructor(imageurl, ctx, x, y, width, height)
{
this.img = new Image();
this.img.src = imageurl;
this.img.onload = () => {
ctx.drawImage(this.img, x, y, width, height);
}
}
draw(ctx, x, y, width, height) {
ctx.drawImage(this.img, x, y, width, height);
}
}
//I guess this goes in a different module
const drawImages = new DrawImages("https://example.com/image.jpg", ctx, pandaPosition[0], pandaPosition[1], 50, 50);
您可能想在 中做一些不同的事情onload
,但这基本上是有效的。
var canvas = document.getElementById('canv');
var ctx = canvas.getContext('2d');
document.addEventListener('DOMContentLoaded', () => {
window.requestAnimationFrame(update.bind(this));
update();
movingCharacter.moving();
});
function update() {
let now
let then = Date.now();
let delta;
now = Date.now();
delta = now - then;
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawImages.draw(ctx, pandaPosition[0], pandaPosition[1], 32, 32);
window.requestAnimationFrame(update.bind(this));
}
class DrawImages {
constructor(imageurl, ctx, x, y, width, height)
{
this.img = new Image();
this.img.src = imageurl;
this.img.onload = () => {
ctx.drawImage(this.img, x, y, width, height);
}
}
draw(ctx, x, y, width, height) {
ctx.drawImage(this.img, x, y, width, height);
}
}
const pandaPosition = [100, 200];
const drawImages = new DrawImages("https://www.gravatar.com/avatar/0552c7e9c1da444137e8b235576e516d?s=64&d=identicon&r=PG", ctx, pandaPosition[0], pandaPosition[1], 32, 32);
class MovingCharacter {
moving() {
document.addEventListener('keydown', (key) => {
switch (true) {
case key.keyCode === 87:
pandaPosition[1] -= 1;
break;
case key.keyCode === 83:
pandaPosition[1] += 1;
break;
case key.keyCode === 68:
pandaPosition[0] += 1;
break;
case key.keyCode === 65:
pandaPosition[0] -= 1;
break;
case key.keyCode === 32:
pandaPosition[1] -= 10;
break;
}
})
}
}
var movingCharacter = new MovingCharacter();
<canvas id="canv" width="300" height="300">
推荐阅读
- jupyter-notebook - 如何在 jupyter notebook 中渲染完整的乳胶文件
- c++ - Winsock 连接失败并显示 WSAEFAULT | 仅在 Windows 11 上出现错误
- javascript - 初始化前无法访问 - 跨多个文件定义 ENV 变量
- python - 如何检测字符串中的数字字符
- javascript - JavaScript queue promise resolution until async call is finished (way to improve)
- php - 从播放列表/分组视频中获取 YouTube 视频计数
- ios - 构建时 AppDelegate.m 错误:使用未声明的标识符“_trustKitConfig”
- sql - 如何进行条件连接
- bash - 为什么 bash 将我的问号更改为连字符?
- python - 用户输入不再调用交互式回调