Обнаружение столкновений в игре Javascript - PullRequest
0 голосов
/ 08 января 2019

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

В моей игре игрок стреляет из положения X Y в направлении положения мыши X Y, а враги падают линейно по оси Y.

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

игру можно посмотреть здесь: https://liammorgan.github.io/wave_defence/

И здесь есть фрагмент для обнаружения попадания, который работает примерно в 20% случаев или при первом выстреле пули.

Каждый выстрел имеет X, Y, bulletSpeed, xVelocity, yVelocity

У каждого врага есть X, Y, скорость

shot.js -
this.hit = function() {
        for(enemy in enemies) {
            let e = enemies[enemy];
            if(e != null) {             
                if(this.x+this.size > e.x && this.x-this.size < e.x && 
                this.y+this.size > e.y && this.y-this.size < e.y) {
                    enemies[enemy] = null;
                    return true;                    
                } else {
                    return false;
                }
            }
        }
    }

sketch.js -
let shots = [];
let enemies = [];
if(player.lives > 0) {
        player.update();
        player.draw();
        for(shot in shots) {
            let s = shots[shot];
            if(s != null) {                
                if(s.hit() && s != null) {
                    shots[shot] = null;
                    continue;
                }
                shots[shot].update();
                shots[shot].draw();
                if(s.remove() && s != null) {
                    shots[shot] = null;
                }
            }
        }
    }

1 Ответ

0 голосов
/ 08 января 2019

Мне кажется, что в вашей логике столкновений вы не учитываете размер самого врага. Таким образом, для того, чтобы столкновение считалось, выстрел должен ОТЛИЧНО поражать почти точный центр врага.

Лучшим способом сделать это было бы измерить расстояние от центра пули до центра противника и проверить его до их известных размеров, поскольку и враг, и пуля являются кругами. Это также означает, что вам нужно будет включить поле radius или size для объектов противника.

...