2015-04-20 4 views
1

это может быть действительно очевидно, но я полный начинающий программист ... может кто-нибудь сказать мне, почему это только выполняет функцию с main (5)? И как я могу изменить его так, чтобы main (2) выполнялся после main (1) и т. Д.? Благодаря!функция внутри цикла javascript выполняется только один раз

for (var k = 1; k < 6; k++){ 
    main(k); 
} 

Редактировать: извините, это определение main! Я пытаюсь оживить кучу квадратов, используя холст

var main = function (speed) { 
    Enemy.prototype.update = function() { 
     var tx = 650 - this.x; 
     var ty = 250 - this.y; 
     var dist = Math.sqrt(tx * tx + ty * ty); 
     this.velx = (tx/dist) * speed; 
     this.vely = (ty/dist) * speed; 

     if (dist > 0) { 
      this.x += this.velx; 
      this.y += this.vely; 
     } 
    }; 

    Enemy.prototype.isOnEnemy = function (x, y) { 
     return (x >= this.x && x < this.x + 25 && // 25 = width 
     y >= this.y && y < this.y + 25); // 25 = height 
    }; 

    Enemy.prototype.render = function() { 
     context.fillStyle = 'rgba(255,255,255,' + this.transparency + ')'; 
     context.fillRect(this.x, this.y, 25, 25); 
    }; 

    var enemies = []; 
    for (var i = 0; i < 10; i++) { 
     // random numbers from 0 (inclusive) to 100 (exclusive) for example: 
     var randomX = Math.random() * 896; 
     var randomY = Math.random() * 1303; 
     console.log(randomX); 
     console.log(randomY); 
     if (randomX > 100 && randomX < 1200) { 
      if (randomX % 2 === 0) { 
       randomX = 140; 
      } else { 
       randomX = 1281; 
      } 
     } 
     if (randomY > 100 && randomY < 75) { 
      if (randomY % 2 === 0) { 
       randomY = 15; 
      } else { 
       randomY = 560; 
      } 
     } 
     var enemy = new Enemy(randomX, randomY, 0, 0, 1); 
     enemies.push(enemy); 
    } 
    for (var i = 0; i < 15; i++) { 
     // random numbers from 0 (inclusive) to 100 (exclusive) for example: 
     var randomX = Math.random() * 200; 
     var randomY = Math.random() * 403; 
     console.log(randomX); 
     console.log(randomY); 
     if (randomX > 100 && randomX < 1200) { 
      if (randomX % 2 === 0) { 
       randomX = 140; 
      } else { 
       randomX = 1281; 
      } 
     } 
     if (randomY > 100 && randomY < 75) { 
      if (randomY % 2 === 0) { 
       randomY = 15; 
      } else { 
       randomY = 560; 
      } 
     } 
     var enemy = new Enemy(randomX, randomY, 0, 0, 1); 
     enemies.push(enemy); 
    } 

    context.canvas.onmousemove = function (e) { 
     var rect = this.getBoundingClientRect(), 
      x = e.clientX - rect.left, 
      y = e.clientY - rect.top, 
      i = 0; 

     for (; i < enemies.length; i++) { 
      if (enemies[i].isOnEnemy(x, y)) { 
       enemies[i].transparency = 0; 
      } 
     } 
    }; 

    function render() { 
     context.clearRect(0, 0, canvas.width, canvas.height); 
     for (var i = 0; i < enemies.length; i++) { 
      var one = enemies[i]; 
      one.update(); 
      one.render(); 
     } 
     requestAnimationFrame(render); 
    } 
    render(); 
}; 
+1

Я думаю, что вы выполняете задание ** async ** в функции 'main', можете ли вы опубликовать определение' main'? – Mritunjay

+1

Это правильный цикл. Он будет циклически 5 раз и пройдет 1 - 5 в качестве аргументов main(). Нужно больше информации. Смотрите: http://jsfiddle.net/2bpd002o/ –

+0

Даже если все инструкции внутри основной функции отложены, с этим циклом main будет правильно вызываться с каждым значением k. – Gael

ответ

0

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

for (var k = 1; k < 6; k++){ 
    (function(i) { 
    main(i); 
    })(k); 
} 
+0

Извините, это по-прежнему та же проблема:/она работает только один раз с основным (5) – imhappi

+0

Да, я вижу это сейчас. посмотрите комментарий от @JonathanLonowski выше для лучшего решения ... – sfletche

1

вопрос относится к определениям для Enemy.prototype.update и т. д.

Каждый вызов main() определяет их, но prototype может сохранять только 1 из каждого. Итак, после первого вызова каждый вызов main() отбрасывает и отменяет предыдущие определения.

Enemy.prototype - объект, который каждый из new Enemy() наследует (ref: MDN: Inheritance and the prototype chain). Это делает его полезным для общих свойств и методов, которые не меняются от одного экземпляра к другому.

Поскольку изменение speed является единственным изменением, вы можете иметь экземпляры, имеющие собственное значение, что позволяет методам быть одинаковым для всех из них. Также позволяет определить их один раз за пределами main().

Enemy.prototype.update = function() { 
    // ... 
    this.velx = (tx/dist) * this.speed; // <--- 
    this.vely = (ty/dist) * this.speed; // <--- 
    // ... 
}; 

// ... 

var main = function (speed) { 
    // ... 
     var enemy = new Enemy(randomX, randomY, 0, 0, 1); 
     enemy.speed = speed; // <--- 
     enemies.push(enemy); 
    // ... 
}; 

Если вы можете изменить другой код немного («без изменения, как я реализовать остальную часть моего кода»), вы можете изменить конструктор, чтобы принять и назначить speed:

function Enemy(speed, x, y, ...) { 
    this.speed = speed; 
    this.x = x; 
    this.y = y; 
    // ... 
} 
var enemy = new Enemy(speed, randomX, randomY, 0, 0, 1); 
enemies.push(enemy); 
+0

спасибо! Это на самом деле имеет для меня большой смысл; когда я меняю его, хотя это все та же проблема ... я сделал ошибку в своем коде? http://jsfiddle.net/01hcbd9v/ – imhappi

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