Здесь много чего можно объяснить. Я протестировал приведенный ниже код и заставил его работать, но я просто использовал одно изображение снова и снова. Надеюсь, это сработает при слиянии с вашим кодом. Поместите код ниже вместо ваших циклов for (т.е. после var var и перед функцией getImageNameFromRand).
Во-первых, ваш код определяет все переменные в глобальном пространстве имен, поэтому img var будет заменяться каждый раз в исходном цикле вместе с его функциями src и onload и т. Д. Кроме того, на x и y, которые увеличивают циклы for, ссылаются через замыкание в функции onload, но поскольку они увеличиваются только во внешнем цикле (не в функции onload), им обоим присваиваются свои конечные значения во время вызова onload ( конечные значения при запуске исходного цикла).
Также попробуйте поместить весь ваш скрипт в анонимную функцию, например (function () {ВАШ КОД ЗДЕСЬ}) (). Таким образом, вы не будете добавлять в глобальное пространство имен локальные переменные, и onload будет иметь то, что ему нужно из-за закрытия. Я тестировал помещение всего в анонимную функцию, и это работало на меня.
Надеюсь, я все это правильно скопировал и вставил. Пожалуйста, прокомментируйте, если он выключен. Удачи !!!
//Copy this code in place of your original "for" loop:
var imgs = [];
var imgIndex = 0;
for (var x = 0; x < width; x++){
for(var y = 0; y < height; y++){
var rand = Math.floor(Math.random() * 11);
var texLoc = getImageNameFromRand(rand, y, height);
imgs[imgIndex] = new Image();
imgs[imgIndex].onload = (function () {
var thisX = x * 16;
var thisY = y * 16;
return function () {
ctx.drawImage(this, thisX, thisY);
};
}());
imgs[imgIndex].src = texLoc;
imgIndex += 1;
}
}