Сделать код менее повторяющимся
Я написал часть кода в игре, которая касается движений персонажа, и этот код очень повторяется (почти все одинаково для четырех направлений).
Я не могу понять, как я могу сделать это проще из-за тестов во всех условиях "если", потому что в другом случае я бы создал систему с положительной / отрицательной переменной, которую я мог бы умножить на изменение положения.
Спасибо за вашу помощь!
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;
}
}
2 ответа
Решение
Нечто подобное
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;
}
}
}
}
Я думаю, что вы определенно можете упростить этот код. Например, сделать объект как:
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);
}