2015-03-04 3 views
0

Итак, я создаю игру в формате HTML/JS (чаще всего JQuery).Несколько экземпляров объекта, мешающего

У меня есть массив объектов, инициализированных в начале игры (когда пользователь нажимает P для воспроизведения). Каждый объект является падающим объектом (я знаю, что он терпит неудачу с булевым именем «working»), с «move» метод, устанавливающий позицию, идущую от 1 до 22. Каждый раз, когда он перемещается, он показывает текущий div с номером в качестве идентификатора (представляющим позицию) и скрыть предыдущий div.

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

Вот конструктор объекта:

function flyers(){ 
this.pos = 0; 
this.working = false; 
this.jump = 0; 
this.interval; 
this.move = function(){ 
     if (this.working == true){ 

       if (this.pos == 22) 
      { 
       $("#perso21").hide(); 
       this.pos = 0; 
       this.startWork(); 
      } 
      checkSave(); 
     if (this.jump == 0) 
      { if ((this.pos == 5 && playerPos != 1) || (this.pos == 13 && playerPos != 2) || (this.pos == 19 && playerPos != 3)) 
      { 
       this.die(); 
      } 
       if ((this.pos == 4 && playerPos == 1) || (this.pos == 12 && playerPos == 2) || (this.pos == 18 && playerPos == 3)) 
        this.jump = 1; 
     } 
     else 
     { 
      if (this.pos == 5 || this.pos == 13 || this.pos == 19) 
      { 
      score++; 
      this.jump = 0; 
      } 
      $(".score").html("" + score + ""); 
     } 
      $("#perso" + (this.pos - 1) + "").hide(); 
      $("#perso" + this.pos + "").show(); this.pos++; 
     } 
     else 
      clearInterval(this.interval); 
    }; 
this.startWork = function() 
{ 
    clearInterval(this.interval); 
    this.working = true; 
    this.interval = setInterval(this.move, 1000 - (score/10 * 100)); 
} 
this.die = function(){ 

    this.working = false; 
    this.pos = 0; 
    this.jump = 0; 
    if (miss < 2) 
     { 
      miss++; 
     } 
    else 
     { 
      quitGame(); 
     } 
     clearInterval(this.interval); 
}; 
return this;} 

и инициализация массива:

flyerstab[0] = new flyers(); 
flyerstab[1] = new flyers(); 
flyerstab[2] = new flyers(); 
flyerstab[3] = new flyers(); 
flyerstab[0].startWork(); 

порождения (только возможно, чтобы иметь 4 предметов, падающих в то же время)

spawn = setInterval(function() 
{ 
    var i; 

    for (var i = flyerstab.length - 1; i >= 0; i--) { 
     if (flyerstab[i].working == false) 
     { 
      flyerstab[i].startWork(); 
      break; 
     } 
     else 
      console.log(i + " is working"); 
    }; 
}, 5000 - (score/10 * 100)); 

Я пытался найти, почему весь день, но мне это не удалось ... Я их плохо конструирую?

+2

Вы не называете startWork() другими флажками в flyerstab? – pmac89

+0

Ой хорошо, не поместил код создателя ... Редактирование. –

+1

Отсутствует какой-то контекст здесь, но если все ваши экземпляры флаеров скрывают одни и те же элементы (например, # perso21, # perso + pos), то в лучшем случае они просто нажимают друг на друга. – brianvaughn

ответ

0

Внутри this.interval = setInterval(this.move, 1000 - (score/10 * 100));, this.move вызывается с this как глобальный контекст. Вместо этого используйте

this.interval = setInterval(this.move.bind(this), 1000 - (score/10 * 100)); 
+0

Исправлено, спасибо вам большое. –

+0

@ThomasCruveilher - Добро пожаловать :) Функции обратного вызова внутри setInterval и setTimeout всегда привязаны к окну, как и функции, которые используются как выражения. Использование bind позволяет сохранить контекст, который вы искали. Вот еще информация о 'this': http://stackoverflow.com/a/28443915/1026459. Пища для размышления :) –

+0

Спасибо за эту информацию тоже :) –

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