2014-01-19 3 views
0

Edit: Вот Pastebin полного кода: http://pastebin.com/EVAyxh2NПомощь JavaScript Бесконечная петля? Почему это происходит?

Я вставил свой код ниже. Если кто-нибудь сможет понять, почему я получаю бесконечный цикл от этого, мне бы хотелось увидеть! По сути, у меня есть цикл for-loop внутри цикла foor, и это сработало нормально, но я хотел сохранить прямые данные в массиве, чтобы потом получить доступ к нему, поэтому я создал другой цикл for, который обрабатывает записи из array, а затем создает прямоугольники для каждого из них.

// Create custom "tile" object 
function tileObj(x, y, img) { 
    this.x = x; 
    this.y = y; 
    this.img = img; 
} 

// Create empty array to store tile data 
var tiles = []; 

// Create tile-grid, map.grid sized rectangles that will adopt tileset images 
function gridTiles() { 
    for (var x = 0; x <= map.width; x += map.grid) { 
     for (var y = 0; y <= map.height; y += map.grid) { 

      var newTile = new tileObj(x, y, "red"); 
      tiles.push(newTile); 

      for (var z = 0; z < tiles.length; z++) { 
       tile = tiles[z]; 
       ctx.rect(tile.x, tile.y, map.grid, map.grid); 
       ctx.fillStyle = tile.img; 
       ctx.fill(); 
      } 
     } 
    } 
} 
gridTiles(); 
+0

Как вы определили, что это бесконечный цикл? –

+0

Вы определяете 'map.width'? – Sergio

+0

Я определил map.width и map.height выше. Я думаю, что это бесконечный цикл, потому что мой браузер ведет себя так, как будто это так. – ndugger

ответ

2

Это может быть бесконечный цикл, если map.grid является <= 0.

Я думаю, что вы хотите z для цикла после того, как вы создали все объекты плитки:

// Create custom "tile" object 
function tileObj(x, y, img) { 
    this.x = x; 
    this.y = y; 
    this.img = img; 
} 

// Create empty array to store tile data 
var tiles = []; 

// Create tile-grid, map.grid sized rectangles that will adopt tileset images 
function gridTiles() { 
    for (var x = 0; x <= map.width; x += map.grid) { 
     for (var y = 0; y <= map.height; y += map.grid) { 

      var newTile = new tileObj(x, y, "red"); 
      tiles.push(newTile); 

     } 
    } 
    for (var z = 0; z < tiles.length; z++) { 
     tile = tiles[z]; 
     ctx.rect(tile.x, tile.y, map.grid, map.grid); 
     ctx.fillStyle = tile.img; 
     ctx.fill(); 
    } 
} 
gridTiles(); 

FYI, я не думаю, что это был бесконечный цикл, если map.grid не было <= 0. Кажется вероятным, что это был очень, очень медленно исполняемый цикл, потому что вы ездили на велосипеде по каждой плите много раз.

+0

Эй! Спасибо за это! Ты прав! Это даже не так быстро исправлено. Это определенно, наверное, просто действительно, очень медленно. – ndugger

1

Как gridTiles получает доступ к объекту карты? Это в области окна или документа?

В любом случае, убедитесь, что значение сетки положительное, или вы войдете в бесконечный цикл.

function gridTiles(){ 
    var grid = map.grid; //assume you have access to it 
    if (grid<=0){ 
    console.warn('Invalid grid width'); 
    return; 
    } 

    // continue your function 

} 
+0

Ниже приведен код FULL: http://pastebin.com/EVAyxh2N – ndugger

+0

Вы вставляете новые элементы в y-loop, и вы извлекаете длину массива плиток в z-loop. Вы хотите попасть в гоночное состояние здесь? Если нет, сохраните исходную длину плитки и используйте ее для условия выхода для z-цикла. – Schien

Смежные вопросы