Я верю, что вы что-то напутали здесь
Прежде всего вы неправильно используете массив:
[this.enemies][this.enemy].top
Что это делает:
Создает новый массив с одним элементом (который является массивом this.enemies), теперь он преобразует this.enemy в string = 'object Object' и пытается найти ключ в этом новом массиве, который, вероятно, возвращает неопределенное значение, и теперь он пытается получить вершина неопределенного.
Что вы, вероятно, хотели сделать, это:
this.enemies[this.enemies.indexOf(this.enemy)].top
Но даже если это не имеет никакого смысла.
Что бы я сделал:
function checkCollision() {
for (let i = 0; i < this.enemies.length; i++) {
if (areColliding(this.shooter, this.enemies[i])) {
console.log('hit')
}
}
}
function areColliding(o1, o2) {
if (o1.top <= o2.top + o2.height &&
o1.top >= o2.top &&
o1.left <= o2.left + o2.width &&
o1.left >= o2.left) {
return true
}
return false
}
Существуют лучшие алгоритмы столкновений, чем aabb, и даже если вы захотите сделать это таким образом, ваша игра может стать очень медленной, если у вас тысячи врагов. Есть алгоритм, позволяющий разбить игровой мир на более мелкие прямоугольники и проверить, нет ли в них столкновений.