Как обнаружить столкновение между двумя объектами только с одной стороны? - PullRequest
0 голосов
/ 21 марта 2019

Это как ловить предмет с корзиной.(Нижняя часть первого объекта и Верхняя часть второго объекта).Это пример моего кода, но он обнаруживает все стороны.

        this.hitPocket = 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;
      }

ОБНОВЛЕНО: Привет, Кеннет Митчелл Де Леон, я попробовал ваше решение и изменил радиус на высоту и ширину.и это сработало.Моя проблема сейчас в том, что корзина подвижная или перетаскиваемая, чтобы поймать мяч.(Извините, что я упомянул об этом поздно) Поэтому, когда я перетаскиваю корзину в шар, она все равно ловит мяч, даже если он не прошел через верх корзины.

function hasContact(basket, ball){
    const hoop = {


        topLeft: {x:basket.x+10, y: basket.y},
            topRight: {x: basket.x+basket.width-10,
                    y: basket.y}
//not necessary if your only concern is the top panel
            // botLeft: {x: basket.position.x,
            //         y: basket.position.y+basket.height},
            // botRight: {x:basket.position.x+basket.width,
        //         y:basket.position.y+basket.height}
    }

    //determine if ball is in between top left or top right of the basket in x axis
    if(ball.x  > hoop.topLeft.x && ball.x+ball.width < hoop.topRight.x 
        //determine if the ball is in contact with top panel of basket in y axis
        && ball.y-basket.y < ball.height/2 && basket.y - ball.y < ball.height/2){
            return true;
    }

    return false;
}

1 Ответ

0 голосов
/ 21 марта 2019
//point = {x: value, y: value} - assuming this is point object
function hasContact(point1, point2, ball){

    //determine if ball is in between point1 and point2 in x axis
    if(ball.position.x-ball.radius > point1.x && ball.position.x+ball.radius < point2.x 
        //determine if the ball is in contact in y axis
        && ball.position.y-point1.y < ball.radius && point1.y - ball.position.y < ball.radius){
            return true;
    }
    return false;
}

//position 1 is top left
//position 2 is top right
if(hasContact(position1, position2, circle) 
    //use same x coords in position 1 and 2
    //then add y coordinates with the ball/image height-n
    //position 3 is bottom left - just low enough but not more than image/ball height
    //position 5 is bottom right
    && hasContact(position3, position4, circle)){
        //shot is made - do something here....
    }

Я предполагаю что-то вроде баскетбола ...

это вернет true, если ВЕСЬ шар находится между левым и правым краем горизонтальной линии, вы можете настроить его так, чтобы он возвращал true, если какая-либо часть шара находится в контакте с линией. Однако он не обнаружит, прошел ли мяч из одной точки в другую, т.е.

немного информации было бы более полезным ... к какому типу обнаружения столкновений вы стремитесь?

  • линия и коробка?
  • строка и строка?
  • линия и круг? // Я предположил это, я отредактирую свой ответ в зависимости от дополнительной информации.

Я отредактировал функцию. Просто используйте его дважды, если зазор не превышает высоту изображения / шара.

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