Как сделать так, чтобы массив for-loop давал единственный, не непрерывный вывод в JavaScript? - PullRequest
0 голосов
/ 02 июня 2018

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

Еслинеобходимо, чтобы переменная «objects» инициировалась как пустой массив, но объекты добавляются к нему с помощью кнопки.Переменные "objects" и "player" создаются с помощью конструктора Hitbox:

function Hitbox(x, y, w, h) {
	this.x = x;
	this.y = y;
	this.width = w;
	this.height = h;
	this.speedX = 0;
	this.speedY = 0;
	this.gravity = 0.05;
	this.gravitySpeed = 0;
	this.update = function() {
		ctx = area.context;
		ctx.strokeRect(this.x, this.y, this.width, this.height);
	}
	this.newPos = function() {
		this.gravitySpeed += this.gravity;
		this.x += this.speedX;
		this.y += this.speedY + this.gravitySpeed;
		this.hitBottom();
		this.hitSide();
	}
	this.hitBottom = function() {
		if(this.y > (ground - this.height)) {
			this.y = (ground - this.height);
		}
	}
	this.hitSide = function() {
		if(this.x < 0) {
			this.x = 0;
		}else if(this.x > window.innerWidth - this.width) {
			this.x = window.innerWidth - this.width;
		}
	}
    	this.crashWith = function(otherobj) {
        	var myleft = this.x;
        	var myright = this.x + (this.width);
        	var mytop = this.y;
        	var mybottom = this.y + (this.height);
        	var otherleft = otherobj.x;
        	var otherright = otherobj.x + (otherobj.width);
        	var othertop = otherobj.y;
        	var otherbottom = otherobj.y + (otherobj.height);
        	var crash = true;
        	if ((mybottom < othertop) || (mytop > otherbottom) || (myright < otherleft) || (myleft > otherright)) {
           		crash = false;
        	}
        	return crash;
    	}
}

В функции updateArea (), которая выполняется для каждого интервала, я создал цикл for, который проходит через все текущие объекты в переменной "objects" и проверяет ихстолкновение с игроком.

	for(var i = 0; i < objects.length; i++) {
		if(player.crashWith(objects[i])) {
			health--;
		}
	}

Если это правда, здоровье игрока, отображаемое над хитбоксом игрока, ДОЛЖНО уменьшаться на 1. ВМЕСТО, оно мгновенно истощает все здоровье, даже если этооператор if, а не оператор while.

Можно ли использовать этот метод для уменьшения переменной "health" на 1 или мне следует использовать другой способ полностью?

1 Ответ

0 голосов
/ 02 июня 2018

Вы можете решить эту проблему, отслеживая, было ли уже обработано столкновение игрока:

let collision = false;
for(var i = 0; i < objects.length; i++) {
  if(player.crashWith(objects[i])) {
    collision = true;
    break;
  }
}

if(collision) {
  if(!player.isAlreadyColliding) {
    health--;
    player.isAlreadyColliding = true;
  }
} else {
  player.isAlreadyColliding = false;
}

Таким образом, только первое столкновение приводит к потере здоровья.Столкновения, которые происходят в последующих кадрах, игнорируются, если они не следуют за кадром, в котором не произошло столкновения.

Другой альтернативой является прекращение столкновения в кадре, обнаруженном им, путем перемещения игрока, чтобы они не сталкивались во время следующего кадра..

...