@Anonymous_toaster

Как найти элемент массива с отсутствием проверки?

Как найти элемент массива, фильтром, не зная его данные?
Точнее надо делать для всех, но это вызывает баги. Если точнее, я делаю NPC в игре, и с одним сработало, а когда одного делаю нет.
Собственно, код ходьбы и зрения
Ходьба
function gm(){
for(const guardian of villian){	
	gv()
	if(guardian.dead) return
if(!guard.alert) {
    var z = guard.x + 100
 	var r = guard
 	var rar = r.y + 200
bas.x = z
bas.y = rar
}
if(guardian.stand) return
	if(guardian.side == "left") { 
	guardian.x+=2
}
else if(guardian.side == "right") {
		guardian.x-=2 
	   }	
	else if(guardian.side == "down") guardian.y+=3
	else if(guardian.side == "up") guardian.y-=3
	coll.forEach((obj) => {
   if ((guardian.x + guardImg.width >= obj.x) && (guardian.x <= obj.x + obj.width) && (guardian.y + guardImg.height >= obj.y) && (guardian.y 
 <= obj.y + obj.height)) {
   	  if(guardian.side == "left"){
   	  guardian.side = "right"
   	  	guardian.x -= 20
   	  	if(guardian.alarm == true )  guardian.image.src = "guardside.png"
         else { guardImg.src = "guardCalmed.png"};
		return}
if(guardian.side == "right"){
		guardian.side = "left"
		if(guardian.alarm == true ) guardian.image.src = "guard.png"
       else {  guardian.image.src = "guardCalmed.png"};
	return
}}})}}


зрение:

<code lang="javascript">
async function gv(){
	for(let guardian of villian){
		console		
		//let guardian = guardi.filter(g => g.x > agent.x && agent.y <= g.y - 50)[0]
		var b = agent.y - guardian.y;
     var c = Math.sqrt(b*b );
 		var z = agent.x - guardian.x;
 	 var s = Math.sqrt(z*z);
let ss = (guardian.side == "right") && (guardian.x > agent.x && agent.y <= guardian.y - 50)	
let rr = (guardian.side == "right") && (guardian.x > agent.x && agent.y <= guardian.y - 50)	
	
	 

		if(guardian.dead ) return

if(c > 100) {

	guardian.alert = false
	guardian.stand = false
}
if(guardian.alarm && guardian.alert)
{
return GuardAttack()
	
}
	  	if ((guardian.side == "left") && (guardian.x < agent.x && c <= 80)) 
   		{


   			let obj = coll.filter(object =>  object.y + object.height >= guardian.y && object.x == guardian.x)[0]
   		
   	
   			
			if(typeof obj != "undefined"&&agent.x > obj.x){
	
  		 	return //console.log("спрятался")
   		 
			}
			else {
				   let as = document.getElementById("alertSound")
 as.play()
              
				guardian.stand = true
				guardian.alert = true
				guardian.alarm = true
   			
guardian.image.src = "guard.png"
}
   			}
else if ((guardian.side == "right") && (guardian.x > agent.x && c <= 80)) 
   		{
   			let obj = coll.filter(object => object.y  >= guardian.y )[0]
   			//console.log(obj)
			if(agent.x < obj.x){
  		 	return// console.log("спрятался")
			}
			else {
				let as = document.getElementById("alertSound")
				 as.play()
				guardian.image.src = "guardside.png"
				guardian.stand = true
					guardian.alarm = true
				guardian.alert = true   			   
}}}}//}
</code>

villians - тот самый массив с объектами врагов
agent - игрок.
А теперь про баги
1) зрение значительно подпортилось, не знаю почему так
2) Каждого NPC можно убить. И если я убью сначала второго, а потом первого, то всё нормально, но если я убью сначала первого, то у второго отключаются ноги. При этом параметры которые его могли остановить (guardian.dead, guardian.alert и guardian.stand) в значении false , а останавливает на true. Скорее всего это из-за проверки if(guardian.dead) return, потому что хоть этот охранник жив, тот умер, хотя если убивать по уменьшению индекса массива, сначала который второй, а потом первый, всё работает
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
Ну так тебе нужно не return - прекратить вообще всё, а continue - перейти к следующему элементу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы