Я написал часть кода в игре, касающуюся движений персонажа, и этот код очень повторяющийся (почти все равно для 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;
}
}
Вы можете обернуть его части в функции? –
Возможно, но проблема в том, что я всегда буду иметь такой же вес кода, если я думаю хорошо. – Karz
Целью отдельных функций является минимизация повторяющегося кода; Я просто не уверен в передаче семантики в javascript. Является ли это pass-by-reference или sematics pass-by-value в javascript. Если есть семантика pass-by-reference, вы можете уменьшить повторяющийся код. –