javascript - 图像不会在画布上随机渲染
问题描述
错误的图像只出现在一个地方,即 x = 0,y = 0。
var canvas = document.querySelector('canvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var c = canvas.getContext('2d');
var bugSmashed = 0;
//rendering background image
function renderImage()
{
var backImage = new Image();
backImage.src = "jungle.jpg"
backImage.onload = function(){
c.drawImage(backImage,0,0,canvas.width,canvas.height)}
}
renderImage();
//Making a bug
class Bug {
constructor(x,y){
this.x = x;
this.y = y;
}
renderBug(){
var bugImage = new Image();
bugImage.src = "bug.png";
bugImage.onload = function(){
c.drawImage(bugImage,this.x,this.y,65,65)}}
}
试图让 bug 随机出现在画布上
var interval = setInterval(function(){
var x = 32+Math.random()*(canvas.width-64);
var y = 32+Math.random()*(canvas.height-64);
var aBug = new Bug(x,y);
aBug.renderBug();}, 2000);
我确定我错过了一些东西。任何帮助表示赞赏。谢谢
解决方案
我发现了你的问题:this
在function
. 所以当你使用:
function(){c.drawImage(bugImage,this.x,this.y,65,65)}
this
不再指aBug
!(它将改为引用全局Window
对象。)您可以改用胖箭头语法(保留this
):
() => c.drawImage(bugImage,this.x,this.y,65,65)
我不鼓励您使用的另一种非常丑陋的方法是创建一个对 的新引用this
,然后在您的函数中使用该引用:
let that = this;
function(){ c.drawImage(bugImage, that.x, that.y, 65, 65); };
或者你可以简化你的代码,让它掩盖onload
逻辑,让你首先避免包装c.drawImage
在一个函数中(注意出现的正方形是一个可公开寻址的图像):
var canvas = document.querySelector('canvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var c = canvas.getContext('2d');
//Making a bug
let bugImg = new Image();
bugImg.src = "https://th.bing.com/th/id/OIP.pXD0MAw4LeAcVrt3qRiEfwAAAA?pid=ImgDet&rs=1";
class Bug {
constructor(x,y){
this.x = x;
this.y = y;
}
renderBug(){
c.drawImage(bugImg, this.x, this.y, 65, 65);
}
}
var interval = setInterval(function(){
var x = 32 + Math.random()* (canvas.width - 64);
var y = 32 + Math.random()* (canvas.height - 64);
var aBug = new Bug(x, y);
aBug.renderBug();
}, 500);
<canvas id="canvas" width="100" height="100"></canvas>
推荐阅读
- c++ - 从队列 C++ 中删除第一个元素
- tableau-api - 具有 6 个以上维度列的 Tableau 表
- wpf - 使用 Prism 绑定样式
- linkedin - Linkedin API - 实用地向 MDP 添加广告帐户
- mysql - MySQL中的变量未分配给NULL
- python-3.x - Discord.py 重写机器人不响应正常命令
- html - 如何使这个嵌入的视频 100% 宽?
- python - 如何解决在 Python 中合并 OpenCv 中的频道的问题?
- vb.net - 有没有更好的方法来检查文件是否比 X 旧?
- c# - 在 Microsoft Teams 中的用户之间自动切换