2015-01-29 1 views
1

Я написал часть кода в игре, касающуюся движений персонажа, и этот код очень повторяющийся (почти все равно для 4-х направлений).Сделайте код менее повторяющимся

Я не вижу, как я могу сделать это проще, из-за тестов во всех условиях «если», потому что в другом случае я бы создал систему с положительной/отрицательной переменной, которую я мог бы умножить на изменения позиции.

Благодарим за помощь!

for (var i = 0; i < boxArray.length; i++) { 
    var box = boxArray[i]; 

    if (controller.left && currentLevel[this.id - this.moveHorizontal] != 1) { 
     // Enregistrement de la position dans le tableau d'undo/redo 
     this.index++; 
     var array = [this.x, this.y, this.id]; 
     this.undoArray.push(array); 
     // Si box à côté et pas de collision possible 
     if (box.id == this.id - this.moveHorizontal && currentLevel[this.id - this.moveHorizontal * 2] != 1 && currentLevel[this.id - this.moveHorizontal * 2] != 2) { 
      // Décalage de la position du player 
      this.x -= this.boxWidth; 
      this.id -= this.moveHorizontal; 
      currentLevel[this.id] = 8; 
      currentLevel[this.id + this.moveHorizontal] = 0; 
      // Décalage de la position de la box 
      box.x -= this.boxWidth; 
      box.id -= this.moveHorizontal; 
      currentLevel[this.id - this.moveHorizontal] = 2; 
      controller.left = false; 
     } 
     // Sinon si aucun objet à côté 
     else if (currentLevel[this.id - this.moveHorizontal] == 0 || currentLevel[this.id - this.moveHorizontal] == 3) { 
      // Décalage de la position du player 
      this.x -= this.boxWidth; 
      this.id -= this.moveHorizontal; 
      currentLevel[this.id] = 8; 
      // Décalage de la position du sol 
      currentLevel[this.id + this.moveHorizontal] = 0; 
      controller.left = false; 
     } 
    } 
    else if (controller.right && currentLevel[this.id + this.moveHorizontal] != 1) { 
     this.index++; 
     var array = [this.x, this.y, this.id]; 
     this.undoArray.push(array); 
     if (box.id == this.id + this.moveHorizontal && currentLevel[this.id + this.moveHorizontal * 2] != 1 && currentLevel[this.id + this.moveHorizontal * 2] != 2) { 
      this.x += this.boxWidth; 
      this.id += this.moveHorizontal; 
      currentLevel[this.id] = 8; 
      currentLevel[this.id - this.moveHorizontal] = 0; 
      box.x += this.boxWidth; 
      box.id += this.moveHorizontal; 
      currentLevel[this.id + this.moveHorizontal] = 2; 
      controller.right = false; 
     } 
     else if (currentLevel[this.id + this.moveHorizontal] == 0 || currentLevel[this.id + this.moveHorizontal] == 3) { 
      this.x += this.boxWidth; 
      this.id += this.moveHorizontal; 
      currentLevel[this.id] = 8; 
      currentLevel[this.id - this.moveHorizontal] = 0; 
      controller.right = false; 
     } 
    } 
+0

Вы можете обернуть его части в функции? –

+0

Возможно, но проблема в том, что я всегда буду иметь такой же вес кода, если я думаю хорошо. – Karz

+0

Целью отдельных функций является минимизация повторяющегося кода; Я просто не уверен в передаче семантики в javascript. Является ли это pass-by-reference или sematics pass-by-value в javascript. Если есть семантика pass-by-reference, вы можете уменьшить повторяющийся код. –

ответ

0

Что-то вдоль этих линий

for (var i = 0; i < boxArray.length; i++) { 
    var box = boxArray[i]; 

    var direction = { 
     'left': -1, 
     'right': 1 
    }; 

    for (var d in direction) { 
     var mh = this.moveHorizontal * direction[d]; 

     if (controller[d] && currentLevel[this.id + mh])] { 
      this.index++; 
      var array = [this.x, this.y, this.id]; 
      this.undoArray.push(array); 

      if (box.id == this.id + mh && currentLevel[this.id + mh * 2] != 1 && currentLevel[this.id + mh * 2] != 2) { 
       this.x += this.boxWidth * direction[d]; 
       this.id += mh; 
       currentLevel[this.id] = 8; 
       currentLevel[this.id + this.moveHorizontal] = 0; 
       // Décalage de la position de la box 
       box.x += this.boxWidth * direction[d]; 
       box.id += mh; 
       currentLevel[mh] = 2; 
       controller[d] = false; 
      } else if (currentLevel[this.id + mh] == 0 || currentLevel[this.id + mh] == 3) { 
       // Décalage de la position du player 
       this.x += this.boxWidth * direction[d]; 
       this.id += mh; 
       currentLevel[this.id] = 8; 
       // Décalage de la position du sol 
       currentLevel[this.id + (mh * -1)] = 0; 
       controller[d] = false; 
      } 
     } 
    } 
} 
0

Я думаю, вы определенно можете упростить этот код. Например, сделать объект как:

var moves = { 
    moveLeft: function() { ... }, 
    moveRight: function() { ... } 
}; 

Тогда вы могли бы сказать, как

moves[side](...); 

где сторона представляет собой строку, указывающую moveLeft или moveRight.

Кроме того, вы можете сгруппировать неоднократное функциональность, как этот, который повторяется в обоих левых и правых:

function initMovement() { 
    var array = [this.x, this.y, this.id]; 
    this.index++; 
    this.undoArray.push(array); 
} 
+0

То, что вам не хватает, это много его условностей, как 'if (a + b == someValue) {\\ добавить кучу вещей} else if (a - b == someValue) {\\ вычесть кучу материала }, которые легко обобщаются. – vrmc

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

  • Нет связанных вопросов^_^