2

我有以下 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 中的第一张和最后一张图像被绘制到画布上。它们被绘制在随机位置 - 这是我想要的,每次我重新加载页面时,它们都会被绘制到画布上的新位置,但我无法弄清楚为什么数组中没有图像在第一个位置之间最后被绘制到画布上。我认为我的逻辑在某处有问题,但无法弄清楚在哪里。

有没有人能发现它?

4

1 回答 1

1

在循环的每次迭代中,下一个图像在 和 指定的坐标处绘制imageXimageY但对于第二次和后续迭代imageX,并且imageY始终保持相同的值,因此第二个和后续图像都在同一位置绘制在彼此的顶部。这就是为什么似乎只绘制了第一张和最后一张图像的原因。

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

            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);

仍然有可能不止一张图像纯粹偶然地最终出现在同一位置,但使用 10×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 之间,而所有其他图像都使用从两个数组中随机选择的坐标,所以我消除了这种差异。

于 2012-11-23T11:23:09.583 回答