【问题标题】:js canvas drawImage not working with loop variablejs画布drawImage不适用于循环变量
【发布时间】:2016-05-16 11:58:13
【问题描述】:

我正在尝试将某些标准的图像加载到画布中,但只有当我将常量作为 drawImage()(带有常量注释的 drawImage)函数的参数时才加载图像。我可以添加尽可能多的副本只要我使用常量作为参数,我想要的图像就可以画布。我的代码有什么问题?请帮助..

代码如下:
JS:

 slotSize=50px;
    playArea=9;
    var grid=[];

    function renderGrid(grid)
    {
        for(var i=0,y=0;i<playArea;i++,y+=slotSize)
        {
            for(var j=0,x=0;j<playArea;j++,x+=slotSize)
            {
                ctx.fillStyle=grid[i][j];
                if(grid[i][j]=="white")
                {
                    grass=new Image();
                    grass.onload=function()
                    {
                        //console.log(x+","+y);
                        ctx.drawImage(grass,x,y,slotSize-2,slotSize-2);
                        //ctx.drawImage(grass,0,0,slotSize-2,slotSize-2); works!                 
                    }
                    grass.src="../assets/grass.jpg";
                }
                else
                {
                    ctx.fillRect(x,y,slotSize,slotSize);
                }
                ctx.strokeRect(x,y,slotSize,slotSize);
            }

        }
    }

    window.onload=function loadLocal()
    {
        canvas=document.getElementById("canvas");
        ctx = canvas.getContext("2d");
        for(var i=0;i<playArea;i++)
        {
            grid[i]=[];
        }
        for(var i=0;i<playArea;i++)
        {
            for(var i=j;i<playArea;i++)
            {
                grid[i][j]="white";
            }
        }
        renderGrid();
    }

HTML:

<canvas id="canvas" width="450" height="450">
                            Your browser does not support the canvas element.   

【问题讨论】:

  • 我查了一下,但没有真正得到答案:(
  • 没有?链接副本中的那些答案很好地解释了您的代码中发生了什么。如果你将来要写 JS 代码,你最好仔细研究给定的例子,并理解解决方案。闭包是 JS 的基本特性之一,你必须知道如何使用它们。只是复制粘贴一些完全适合您的问题的给定代码不会让您走得太远......
  • 好的,这次我更耐心地完成了答案,我想我明白了。谢谢 :)

标签: javascript html canvas drawimage


【解决方案1】:

http://plnkr.co/edit/h6H3UN45sS6mxtQHlLUz?p=preview

所以基本上你想先了解更多关于变量的上下文和范围。那么您想了解更多关于 Even Listeners 以及如何在异步环境中进行通信的信息。

欢迎提问和交流!

var slotSize=50;
var playArea=9;
var grid=[];
var canvas, ctx;
var grass=new Image();


function renderGrid()
{
    for(var i=0,y=0;i<playArea;i++,y+=slotSize)
    {
        for(var j=0,x=0;j<playArea;j++,x+=slotSize)
        {
            var value = grid[i][j];
            ctx.fillStyle = value;
            if(grid[i][j]=="white")
            {
              console.log(x,y);
              ctx.drawImage(grass,x,y,slotSize-2,slotSize-2);
            }
            else
            {
                ctx.fillRect(x,y,slotSize,slotSize);
            }
            ctx.strokeRect(x,y,slotSize,slotSize);
        }

    }
}

window.onload=function loadLocal()
{
    canvas=document.getElementById("canvas");
    ctx = canvas.getContext("2d");

    for(var i=0;i<playArea;i++)
    {
      grid[i]=[];
      for(var j=i;j<playArea;j++)
      {
          grid[i][j]="white";
      }
    }

    grass.onload = renderGrid;
    grass.src = "http://images.clipartpanda.com/grass-clipart-grass-md.png";
}

【讨论】:

  • 该死!我尝试了您的解决方案,但它在我的原始代码中不起作用,但随后我围绕您的代码重构了我的代码,并且 BAM 它正在工作。这真的很奇怪。如果您能解释一下您到底做了什么,我将不胜感激?
  • @Sidwa 你是什么意思它没有工作?你看到我帖子顶部的链接了吗?
  • 我说你的代码可以工作,但由于某种神秘的原因,你的代码的业务端(解决我的问题的部分)在实际程序中不起作用。所以我围绕你的重新制作了我的实际程序代码并且它有效。如果你能解释我的代码和你的代码之间的区别,我将不胜感激。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多