无法在画布上为我的js游戏加载图片

时间:2014-04-09 15:30:45

标签: javascript html5 image canvas

我在js制作麻将游戏,我在画布上加载图片时遇到问题

  1. 画布

    // Create the canvas
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    canvas.width = 512;
    canvas.height = 512;
    //draw canvas
    document.body.appendChild(canvas);
    
  2. 阵列

    //Array with Tiles & set length to 144 which are the requested tiles
    var tiles = new Array(2);//will be 144
    //2D map array for showing the images coordinates
    var map = [[69,50],[100,150]];//will be 144 coordinates
    
  3. 我的功能更新()

    function update(){
        for(var i=0;i<tiles.length;i++){
                //make the tile object
        tiles[i] = new Object();    
        tiles[i].id = i ;
        tiles[i].selected = false;
        //set the coordinates from map Array
        tiles[i].x=map[i][0];
        tiles[i].y=map[i][1];
        //tiles[i].ready=false;
                    //These are for the image location works fine
        //convert i to String
        var sourceNumber = i.toString();
        //add .png to String
        var source = sourceNumber.concat(png);
        //add /image
        var source = dest.concat(source);   
        tiles[i].img = new Image();
        tiles[i].img.onload = function(){
            //tiles[i].ready=true;
            ctx.drawImage(tiles[i].img,tiles[i].x,tiles[i].y,xdimension,ydimension);
        };
        tiles[i].img.src = source ;
    
        }
    }
    
  4. 我在我的每个浏览器上运行它,它不会加载图像,我在chrome上调试,它在 ctx.drawImage(...); - &gt;上显示未捕获的TypeError:无法读取属性&#39; img&#39;未定义(重复多次),所以我尝试了 tiles [I] .ready 并在加载图片后仍然有错误。有关如何实现加载的任何建议平铺图像

1 个答案:

答案 0 :(得分:1)

第一次调用ctx.drawImage时,i的值为2.问题是for循环(for(var i=0;i<tiles.length;i++))在任何图像加载之前已经完成执行。因此,调用onload函数时i的值是循环停止运行的值。最简单的方法是将索引(i)保存到img元素本身,以便您可以在onload处理程序中检索它。

这是一个简单的代码调整,似乎工作得很好。 重要的变化是:

  1. tiles[i].img.iVal = i;
  2. 和onload handler的主体。
  3. 我也是:

    为了方便起见,

    (a)添加了一个数组来保存硬编码的图像名称,而不是动态创建它们(我不得不将某些图像命名为代码计算的格式)

    (b)xdimension电话中删除了ydimensiondrawImage个变种,因为我不知道它们是什么。

    (c).concat(png)更改为.concat(".png"),因为它更容易声明一个名为png的变量,其中包含字符串.png

    无论如何,这是我使用的示例代码:

    <!DOCTYPE html>
    <html>
    <head>
    <script>
    window.addEventListener('load', onDocLoaded, false);
    
    var canvas, ctx, tiles, map;
    
    function onDocLoaded()
    {
        canvas = newEl('canvas');
        ctx = canvas.getContext('2d');
        canvas.width = canvas.height = 512;
        document.body.appendChild(canvas);
    
        tiles = new Array(2);
        map = [[69,50],[100,150]];
    
        update();
    }
    
    var imgFileNames = ["img/girl.png", "img/redbaron.png"];
    
    function update()
    {
        for(var i=0;i<tiles.length;i++)
        {
            //make the tile object
            tiles[i] = new Object();    
            tiles[i].id = i ;
            tiles[i].selected = false;
            //set the coordinates from map Array
            tiles[i].x=map[i][0];
            tiles[i].y=map[i][1];
            //tiles[i].ready=false;
    
            //These are for the image location works fine
            //convert i to String
    //      var sourceNumber = i.toString();
            //add .png to String
    //      var source = sourceNumber.concat(".png");
            //add /image
    //      var source = dest.concat(source);   
            tiles[i].img = new Image();
            tiles[i].img.iVal = i;
            tiles[i].img.onload = 
            function()
            {
                var curI = this.iVal;
                ctx.drawImage(tiles[curI].img,tiles[curI].x,tiles[curI].y); 
                // ctx.drawImage(this,tiles[curI].x,tiles[curI].y); //equiv to above line
            };
            tiles[i].img.src = imgFileNames[i];
        }
    }
    </script>
    <style>
    canvas
    {
        border: solid 1px red;
    }
    </style>
    </head>
    <body>
    </body>
    </html>