Javascript JS图像未显示在画布上

Javascript JS图像未显示在画布上,javascript,drawimage,Javascript,Drawimage,我有一个bird={}对象,我在其中定义了一个draw函数,但是在render函数中调用时图像不会出现。有人能告诉我我做错了什么吗?提前谢谢 编辑:我注意到它不总是出现的原因是因为屏幕上有其他精灵,当我关闭它们时,鸟总是出现。有什么办法可以解决这个问题吗 bird={ 绘图:函数(){ var birdimg=新图像(); birdimg.onload=函数(){ ctx.drawImage(鸟瞰-20,高度-200); } birdimg.src=“//i.stack.imgur.com/n

我有一个bird={}对象,我在其中定义了一个draw函数,但是在render函数中调用时图像不会出现。有人能告诉我我做错了什么吗?提前谢谢

编辑:我注意到它不总是出现的原因是因为屏幕上有其他精灵,当我关闭它们时,鸟总是出现。有什么办法可以解决这个问题吗

bird={
绘图:函数(){
var birdimg=新图像();
birdimg.onload=函数(){
ctx.drawImage(鸟瞰-20,高度-200);
}
birdimg.src=“//i.stack.imgur.com/nsZLM.png”;//“assets/bird.png”;
}
};
函数main(){
canvas=document.createElement(“canvas”);
//将宽度和高度设置为浏览器的大小
宽度=window.innerWidth;
高度=窗内高度;
//如果宽度大于500,则设置游戏框架
如果(宽度>=500){
宽度=320;
高度=480;
canvas.style.border=“1px solid#000”;
evt=“mousedown”;
}
//将画布大小设置为宽度和高度变量
画布宽度=宽度;
canvas.height=高度;
ctx=canvas.getContext(“2d”);
//设置默认状态
currentstate=states.Splash;
document.body.appendChild(画布);
render();
}
函数render(){
//加鸟
鸟。画();
//加载sky.png
bgimg=新图像();
bgimg.onload=函数(){
ctx.drawImage(bgimg,-20,高度-200);
ctx.drawImage(bgimg,256,高度-200);
}
bgimg.src=“assets/sky.png”;
//装载地面img
landimg=新图像();
landimg.onload=函数(){
ctx.drawImage(兰迪姆,0,高度-100);
}
landimg.src=“assets/land.png”;
//创建为背景着色的矩形。这是底层。在上面编写代码
ctx.fillStyle=“#4ec0ca”;
ctx.fillRect(0,0,canvas.width,canvas.height);
ctx.stroke();

}
下面是@K3N的建议的一个工作示例。感谢@K3N的指导

通过这些更改,您的代码将如下所示:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <script>
    // declare vars so they are available outside of main()
    var canvas,
        ctx,
        width,
        height;

    var bird = {
        draw: function() {
            var birdimg = new Image();
            birdimg.src ="http://www.jqueryscript.net/images/Simplest-Responsive-jQuery-Image-Lightbox-Plugin-simple-lightbox.jpg";

            birdimg.onload = function() {
                ctx.drawImage(birdimg, -20, height - 200);
            };
        }
    };

     function main(){
       canvas = document.createElement("canvas");

       //Set the width and height to the sizes of the browser
       width = window.innerWidth;
       height = window.innerHeight;

       //Frames the game if the width is larger than 500
       if(width >=500){
         width = 320;
         height = 480;
         canvas.style.border = "1px solid #000";

         var evt = "mousedown";
       }



       //Sets the canvas sizes to the width and height variables
       canvas.width = width;
       canvas.height = height;
       ctx = canvas.getContext("2d");

       //Set the default state
       // "states" is not defined so I'm commenting this out
       // var currentstate = states.Splash;

       document.body.appendChild(canvas);

       render();
    }

    main();

    function render(){
      //Adding bird
      bird.draw();
    }
  </script>
</body>
</html>

JS-Bin
//声明变量,使其在main()之外可用
var canvas,
ctx,
宽度,
高度;
var bird={
绘图:函数(){
var birdimg=新图像();
birdimg.src=”http://www.jqueryscript.net/images/Simplest-Responsive-jQuery-Image-Lightbox-Plugin-simple-lightbox.jpg";
birdimg.onload=函数(){
ctx.drawImage(鸟瞰-20,高度-200);
};
}
};
函数main(){
canvas=document.createElement(“canvas”);
//将宽度和高度设置为浏览器的大小
宽度=window.innerWidth;
高度=窗内高度;
//如果宽度大于500,则设置游戏框架
如果(宽度>=500){
宽度=320;
高度=480;
canvas.style.border=“1px solid#000”;
var evt=“mousedown”;
}
//将画布大小设置为宽度和高度变量
画布宽度=宽度;
canvas.height=高度;
ctx=canvas.getContext(“2d”);
//设置默认状态
//“状态”并没有定义,所以我要对此进行评论
//var currentstate=states.Splash;
document.body.appendChild(画布);
render();
}
main();
函数render(){
//加鸟
鸟。画();
}

希望这有帮助,
Nick Leoutsakos

main()从未被调用<代码>状态不存在,并且资产仅存在于您的本地计算机上(您需要上载它)。也可以考虑使用变量来存储值。我没有在这里写它,但是它是在原始代码上。关于最初的问题,你有什么好的建议吗?你可以上传鸟的图片(使用编辑器中的图片上传按钮)并将你的img src链接到该图片,这样我们就可以检查鸟是否画在画布区域之外。另外,请删去问题中包含的示例,使其可以运行(无需使用
状态
,或至少使用已定义的状态,调用main()等)。此外,在本地运行代码时,请检查控制台(F12)是否有任何错误消息这就是图像的外观。我无法将其上传到主评论中,因为它给了我一个错误。“提示:值必须是正数,并且应该只包含数值”。使用负值绘制图像没有问题(即变换;画布将不考虑剪辑)。你可以尝试在你制作的链接jsbin中插入负值,你会发现没有问题。谢谢@K3N。你说得对。编辑以反映这一点。不幸的是,仍然不完全正确,因为您可以将表达式作为参数进行求值,即高度-200被求值为一个数字,因为已经设置了高度。OPs代码中有很多问题,但对drawImage()的调用并不是其中之一(除非计算是将鸟画在可见画布之外-他没有向我们展示,所以我们不知道assets/bird.png是什么样子)。再次感谢@K3N。完全正确。编辑以反映。