使用JavaScript while循环将图像数组绘制到HTML5画布

时间:2012-11-23 10:45:44

标签: javascript arrays html5-canvas

我有以下JavaScript代码,我用它来尝试循环遍历图像数组,并将每个代码绘制到不同位置的HTML5画布:

/*First, create variables for the x & y coordinates of the image that will be drawn.
                the x & y coordinates should hold random numbers, so that the images will be 
                drawn in random locations on the canvas.*/
                var imageX = Math.floor(Math.random()*100);
                var imageY = Math.floor(Math.random()*100);

                /*Create a 'table' of positions that the images will be drawn to */
                var imagePositionsX = [20, 80, 140, 200, 260, 320, 380, 440, 500, 560];
                var imagePositionsY = [20, 60, 100, 140, 180, 220, 260, 300, 340, 380];
                var randomPositionX = Math.floor(Math.random()*10);
                var randomPositionY = Math.floor(Math.random()*10);

            /*Draw all images from assetsImageArray */
            /*Use a while loop to loop through the array, get each item and draw it. */
            var arrayIteration = 0;
            console.log('Assets Image Array length: ' + assetsImageArray.length); /*Display the length of the array in the console, to check it's holding the correct number of images. */
            while(arrayIteration < assetsImageArray.length){
                context.drawImage(assetsImageArray[arrayIteration], imageX, imageY, 50, 50);
                console.log(arrayIteration); /*Display the current array position that's being drawn */
                arrayIteration = arrayIteration+1;
                /*Now try changing the values of imageX & imageY so that the next image is drawn to a 
                    different location*/
                imageX = imagePositionsX[randomPositionX];  /* imageX+(Math.floor(Math.random()*100)); */
                imageY = imagePositionsY[randomPositionY];  /* imageY+(Math.floor(Math.random()*100));  */

            }

此代码背后的预期逻辑是:首先将arrayIteration变量设置为0,然后在控制台中显示assetsImageArray中的图像数量。 然后while循环开始 - 当arrayIteration变量小于assetsImageArray中的项目数时,assetsImageArray的位置arrayIteration(即此时的位置0)处的图像应该被绘制到坐标imageX和imageY处的画布上。

imageX和imageY变量都包含由代码Math.floor(Math.random()*100);分配给它们的随机数 在将第一个图像绘制到指定位置的画布后,控制台应该记录刚刚绘制的数组元素。

然后下一行应该增加arrayIteration变量,最后,应该通过分别从数组imagePositionsX和imagePositionsY获取随机元素的值来更新imageX和imageY的值。

while循环将遍历此代码,将assetsImageArray中的每个图像绘制到画布上的新位置,直到绘制了阵列中的所有图像。

但是,出于某种原因,我的assetsImageArray中的第一个和最后一个图像被绘制到画布上。它们是在随机位置绘制的 - 这就是我想要的,每次我重新加载页面时,它们都会被绘制到画布上的新位置,但是我无法弄清楚为什么阵列中的任何一个图像都没有位于第一个位置之间最后被吸引到画布上。我认为我的逻辑在某处出现了问题,但无法弄清楚在哪里。

是否有人能够发现它?

1 个答案:

答案 0 :(得分:1)

在循环的每次迭代中,下一个图像是在imageXimageY指定的坐标处绘制的,但对于第二次和后续迭代imageXimageY总是如此保持相同的值,以便第二个和后续的图像都在同一个地方相互叠加。这就是为什么看起来只有第一张和最后一张图像被绘制出来。

在第一次迭代中,根据在循环开始之前分配给imageXimageY的值,在0到99之间的随机坐标处绘制第一个图像:

            var imageX = Math.floor(Math.random()*100);
            var imageY = Math.floor(Math.random()*100);

然后在循环中更改imageXimageY

         imageX = imagePositionsX[randomPositionX];  
         imageY = imagePositionsY[randomPositionY];

randomPositionXrandomPositionY有哪些价值?它们保持0到9之间的随机数,在循环开始之前将分配一次。因此,这两行始终从imagePositionXimagePositionsY数组中选择相同的位置。

最简单的解决方法是在循环中移动以下两行:

            var randomPositionX = Math.floor(Math.random()*10);
            var randomPositionY = Math.floor(Math.random()*10);

多个图像仍然可能纯粹是偶然地在同一位置结束,但是十个十格的网格不太可能(取决于你有多少图像)。

我可能会简化代码,例如:

 var imagePositionsX = [20, 80, 140, 200, 260, 320, 380, 440, 500, 560];
 var imagePositionsY = [20, 60, 100, 140, 180, 220, 260, 300, 340, 380];
 var i, x, y;

 for (i = 0; i < assetsImageArray.length; i++) {
     x = imagePositionsX[ Math.floor(Math.random()*10) ];
     y = imagePositionsY[ Math.floor(Math.random()*10) ];

     context.drawImage(assetsImageArray[i], x, y, 50, 50);
 }

我不明白为什么你的当前代码以第一个图像的坐标在0到99之间的随机位置开始,而所有其他图像使用从两个数组中随机选择的坐标,所以我删除了这个差。