使用JavaScript类属性的canvas drawImage错误

问题描述 投票:1回答:1

我试图在drawImage函数上使用类。

但似乎drawImage函数无法获得变量monster的属性img。

我不知道会导致这个错误的原因。

不太明白为什么浏览器会给我以下错误代码...请帮帮我。

未捕获的TypeError:无法读取未定义的属性“img”。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Tower Defense</title>
    <style>
        canvas {
            padding: 0;
            margin: auto;
            display: block;
        }
    </style>
</head>

<body>
    <script>
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext("2d");
        canvas.width = 500;
        canvas.height = 500;
        document.body.appendChild(canvas);

        function Monster(img, x = 0, y = 0, w,h) {
            this.img = img;
            this.x = x;
            this.y = y;
            this.w = w;
            this.h = h;
        }

        var monster;

        var DrawMonster = function(mons) {
            ctx.drawImage(mons.img, mons.x, mons.y, mons.w, mons.h);
        }

        var PreLoadImages = function() {
            var img = new Image();
            img.addEventListener("load", function() {     // or img.onload = function() { ...
                monster = new Monster(this, 0, 0, 100, 100);            
            });
            img.src = "res/Mons_Pirate.jpg";
        }

        PreLoadImages();
        DrawMonster(monster);

    </script>
</body>

</html>

请在测试时更改图像的链接(res / Mons_Pirate.jpg)。

javascript canvas
1个回答
0
投票

DrawImage应该在图像加载函数内部.Monster的实例只在Image加载函数内部创建。图像将被加载到异步中。

   <!DOCTYPE html>
    <html lang="en">

     <head>
      <meta charset="UTF-8">
      <title>Tower Defense</title>
      <style>
        canvas {
            padding: 0;
            margin: auto;
            display: block;
        }
       </style>
     </head>

   <body>
       <script>
           var canvas = document.createElement("canvas");
           var ctx = canvas.getContext("2d");
           canvas.width = 500;
           canvas.height = 500;
           document.body.appendChild(canvas);

        function Monster(img, x = 0, y = 0, w,h) {
            this.img = img;
            this.x = x;
            this.y = y;
            this.w = w;
            this.h = h;
        }

        var monster;

        var DrawMonster = function(mons) {
            ctx.drawImage(mons.img, mons.x, mons.y, mons.w, mons.h);
        }

        var PreLoadImages = function() {
            var img = new Image();
            img.addEventListener("load", function() {     // or img.onload = 
            function() { 
                monster = new Monster(this, 0, 0, 100, 100);            
                DrawMonster(monster);
            });
            img.src = "res/Mons_Pirate.jpg";
        }

        PreLoadImages();

    </script>
</body>

</html>
© www.soinside.com 2019 - 2024. All rights reserved.