Как найти элемент массива, фильтром, не зная его данные?
Точнее надо делать для всех, но это вызывает баги. Если точнее, я делаю 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, потому что хоть этот охранник жив, тот умер, хотя если убивать по уменьшению индекса массива, сначала который второй, а потом первый, всё работает