Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML5使用for循环在画布上绘制图片?_Javascript_Image_Html_Canvas_Draw - Fatal编程技术网

Javascript HTML5使用for循环在画布上绘制图片?

Javascript HTML5使用for循环在画布上绘制图片?,javascript,image,html,canvas,draw,Javascript,Image,Html,Canvas,Draw,所以,我想用HTML5创建一个minecraft网站主题。我对HTML5/Javascript有点不太了解(有一段时间没用了),我需要一些帮助。我正试图计算一个16x16px的瓷砖,可以适合在屏幕上的数量。然后,随机为屏幕背景“生成一张地图”。然后,我对生成贴图的循环使用相同的2,以用瓷砖填充屏幕(生成过程中分配的图片路径)。问题是,画布是完全白色的。有谁能找出问题,如果可能的话给我一些建议吗?提前谢谢!以下是我的HTML5代码: <!DOCTYPE html> <html&g

所以,我想用HTML5创建一个minecraft网站主题。我对HTML5/Javascript有点不太了解(有一段时间没用了),我需要一些帮助。我正试图计算一个16x16px的瓷砖,可以适合在屏幕上的数量。然后,随机为屏幕背景“生成一张地图”。然后,我对生成贴图的循环使用相同的2,以用瓷砖填充屏幕(生成过程中分配的图片路径)。问题是,画布是完全白色的。有谁能找出问题,如果可能的话给我一些建议吗?提前谢谢!以下是我的HTML5代码:

<!DOCTYPE html>
<html>
    <head>
        <title>Minecraft Background Check</title>
    </head>
    <body>
        <canvas id="bg" style="position:fixed; top:0; left:0; border:1px solid #c3c3c3; width: 100%; height: 100%;"></canvas>
        <script type="text/javascript">
            "use strict";
            var c = document.getElementById("bg");
            var ctx = c.getContext("2d");
            ctx.canvas.width  = window.innerWidth;
            ctx.canvas.height = window.innerHeight;

            var width = Math.ceil(window.innerWidth / 16);
            var height = Math.ceil(window.innerHeight / 16);

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

                    var img=new Image();
                    img.onload = function(){
                        return function() {
                            ctx.drawImage(img,x*16,y*16);
                        };
                    };
                    img.src=texLoc;
                }
            }

            function getImageNameFromRand(rand,yVal,maxY)
            {
                var dirt = 'dirt.png';
                var stone = 'stone.png';
                var cobble = 'cobble.png';
                var mosscobble = 'mosscobble.png';
                var bedrock = 'bedrock.png';

                if(yVal===0)
                {
                    return dirt;
                } else if(yVal<3)
                {
                    if(rand < 7) {
                        return dirt; }
                    else {
                        return stone; }
                } else if(yVal<5)
                {
                    if(rand < 4) {
                        return dirt; }
                    else {
                        return stone; }
                } else if(yVal<maxY-2)
                {
                    if(rand === 0) {
                        return dirt; }
                    else if(rand < 4) {
                        return cobble; }
                    else if(rand < 5) {
                        return mosscobble; }
                    else {
                        return stone; }
                } else if(yVal<maxY-1)
                {
                    if(rand < 4) {
                        return bedrock; }
                    else {
                        return stone; }
                } else if(yVal<maxY)
                {
                    if(rand < 7) {
                        return bedrock; }
                    else {
                        return stone; }
                } else {
                    return bedrock; }
                return bedrock;
            }
        </script>
    </body>
</html>

地雷艇背景检查
“严格使用”;
var c=document.getElementById(“bg”);
var ctx=c.getContext(“2d”);
ctx.canvas.width=window.innerWidth;
ctx.canvas.height=window.innerHeight;
var-width=Math.ceil(window.innerWidth/16);
var height=Math.ceil(window.innerHeight/16);

对于(var x=0;x当您执行以下操作时:

img.onload = function(){
    return function() {
        ctx.drawImage(img,x*16,y*16);
    };
};
您正试图在
img
上创建一个闭包,以便在
onload
处理程序中,它将引用您在循环迭代中创建的映像

但是您并没有完全做到这一点,相反,
onload
处理程序只是定义一个匿名函数,然后什么也不做

img.onload = function(img){
    return function() {
        ctx.drawImage(img,x*16,y*16);
    };
}(img);
如果您更改它,以便立即调用匿名函数并传入
img
,那么您将关闭
img
(从
for
循环上下文中),它将执行您想要的操作


如果不立即调用外部匿名函数,则它将成为图像的onload处理程序。并且不会发生任何事情。导致画布空白。

问题在于,在for循环中,您在彼此的上方反复绘制图像。如果您在第一次循环之后完全脱离forloopst运行(x=0,y=0),您将在位置0,0处看到随机图像的一个平铺。当它穿过整个双for循环时,您的最后一个图像将绘制在画布的下角,这将创建您看到的“空白白色画布”。您需要让它绘制一个随机平铺的“预填充”画布。这也意味着您的for循环需要插入因为背景只绘制一次,而不是数百次/数千次,所以没有使用onload()函数

寻找html5画布图案/瓷砖,然后从那里开始工作

此外,您的onload函数不需要内部函数,您可以将其设置为如下所示:

img.onload = function(){

    // - nested for loops
    //   -> generate a tile pattern to fit the entire canvas

    // - ctx.drawImage()

};

祝你好运!

这里有很多要解释的内容。我测试了下面的代码并使其正常工作,但我只是反复使用了一个图像。希望在与代码合并时可以正常工作。将下面的代码放在for循环的位置(即变量高度之后和函数getImageNameFromRand之前)

首先,您的代码定义全局命名空间中的所有变量,因此每次通过原始循环替换img变量,以及它的src和onload函数等。此外,增加for循环的x和y通过onload函数中的闭包被引用,但因为它们仅在out过程中增加侧循环(不在onload函数中)它们都在onload调用期间设置为其结束值(原始循环运行时的结束值)

此外,请尝试将所有脚本放入一个匿名函数中,如(function(){your CODE HERE}())()。这样,您就不会使用本地变量添加到全局名称空间中,并且由于闭包,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;
    }
}
//复制此代码以代替原始的“for”循环:
var-imgs=[];
var-imgIndex=0;
对于(变量x=0;x
谢谢,但我仍然得到一块空白画布。还有什么问题吗?再次感谢。你检查过画布以确保它占用了你期望的空间吗?例如,我会舍弃
宽度:100%
高度:100%
,而是使用
右:0;下:0
来拉伸整个window(这应该适用于
位置:fixed
)。否则,为了达到100%的宽度和高度,你还需要做大量其他工作。