简体   繁体   English

循环不遍历数组的JavaScript

[英]Javascript for loop not looping through array

I am trying to read in a TMX file for a platformer level. 我正在尝试读取TMX文件以获得平台游戏级别。 I was trying to draw the tileset to see if my code was working. 我试图绘制图块,以查看我的代码是否正常工作。 This is how I load the map: 这就是我加载地图的方式:

function TileMapLayer(mapWidth, mapHeight, tileWidth, tileHeight, layerName, tileData) {
'use strict';
    var name = layerName,
    width = mapWidth, height = mapHeight,
    // An array of integers used to figure out whether there is a tile in the
    // player's position
    map = [width][height];
    // The tileset that makes up the tilemap
    this.tileSet = Game.res.getImage('tileSet');
    var data = tileData;

    function getWidth() {return width;}
    function getHeight() {return height;}
}

TileMapLayer.prototype.draw = function() {
        'use strict';
    ctx.beginPath();
    ctx.drawImage(this.tileSet, canvasWidth / 2, canvasHeight / 2);
    ctx.closePath();
};

function TileMap() {
    'use strict';
    this.mapLayers = [];
}

TileMap.prototype.loadFile = function(pathToFile) {
    'use strict';
    var xhr = new XMLHttpRequest();
    var that = this;
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4) {
            // read in xml file
            var domParser = new DOMParser();
            var mapData = domParser.parseFromString(xhr.responseText, 'text/xml');
            var mapAttributes = mapData.getElementsByTagName('map')[0].attributes;
            // get tileset location
            var tileSet = mapData.getElementsByTagName('tileset')[0].getElementsByTagName('image')[0].attributes;
            Game.res.addImage('tileSet', '/home/agoston/Documents/js/platformer/res/maps/' + tileSet.getNamedItem('source').nodeValue);
            // get map & tile dimensions
            that.width = parseInt(mapAttributes.getNamedItem('width').nodeValue);
            that.height = parseInt(mapAttributes.getNamedItem('height').nodeValue);
            that.tileWidth = parseInt(mapAttributes.getNamedItem('tilewidth').nodeValue);
            that.tileHeight = parseInt(mapAttributes.getNamedItem('tileheight').nodeValue);

            // get layer data
            var layers = mapData.getElementsByTagName('layer');

            // create layers
            for(var i = 0; i < layers.length; ++i) {
                that.mapLayers[i] = new TileMapLayer(that.width, that.height, 
                                                                    that.tileWidth, 
                                                                    that.tileHeight,
                                                                    layers[i].attributes.getNamedItem('name').nodeValue,
                                                                    layers[i].getElementsByTagName('data')[0]);
            }

        }
    };
    xhr.open('GET', pathToFile, true);
    xhr.send(null);
};

TileMap.prototype.draw = function() {
    // this block of code doesn't execute
    for(var i = 0; i < this.mapLayers; ++i) {
        console.log('drawing map layers');
        this.mapLayers[i].draw();
    }
};

However, the loop that is supposed to go through the array of map layers, doesn't loop at all. 但是,本应经过地图图层阵列的循环根本不会循环。 When I try to draw the first map layer in the array using this: 当我尝试使用此方法在数组中绘制第一个地图层时:

TileMap.prototype.draw = function() {
    this.mapLayers[0].draw();
};

it draws the tileset image, but it gives this error: 它会绘制图块图像,但会出现以下错误:

TypeError: this.mapLayers[0] is undefined

Does anyone know why this is happening? 有人知道为什么会这样吗? If you wish, you can find the TMX file here: http://pastebin.com/MYdJCHfQ 如果愿意,可以在以下位置找到TMX文件: http : //pastebin.com/MYdJCHfQ

It seems like the mapLayers is an array that you want to iterate over, but you are missing its length property to tell the loop when to stop looping. 似乎mapLayers是要迭代的数组,但是缺少其length属性来告诉循环何时停止循环。 Perhaps this would help: 也许这会有所帮助:

for(var i = 0, j = this.mapLayers.length; i < j; ++i) {
        console.log('drawing map layers');
        this.mapLayers[i].draw();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM