Java Rect.intersects () иногда не работает

1

В настоящее время я просматриваю все мои спрайты, проверяя, пересекаются ли они друг с другом следующим образом:

for (Sprite s : sprites) {
        if (s.dead) {
            dead.add(s);
        }
        for (Sprite sprite : sprites) {
            if (!sprite.equals(s)) {
                s.collide(sprite, maxX, maxY);
            }
        }
        s.run();

}

и спрайт проверяет с помощью метода Rect.intersects() следующим образом:

if (getRect().intersects(s.getRect()))

Но иногда он просто полностью игнорирует столкновение, и объекты просто проходят друг через друга.

Есть идеи?

Теги:
collision
rectangles

2 ответа

0
Лучший ответ

Я исправил его, создав для прямоугольника прямоугольник, который он охватывает между кадрами:

private void checkForNextCollision() {
    double boundsWidth = width + dX ;
    if(dX < 0){
        boundsWidth= width - dX ;
    }

    double boundsHeight = height + dY ;
    if(dY < 0){
        boundsHeight = height - dY ;
    }
    double boundx = xWorld + dX ;
    double boundy = yWorld + dY ;
    betweenRect = new Rectangle((int)(boundx),(int)(boundy),(int)(boundsWidth), (int)(boundsHeight));


}

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

    public void collide(Sprite s, int maxX, int maxY) {
    maxWX = maxX;
    maxWY = maxY;


    //check for collision with borders
    if (xWorld <= 0) {
        dX = -dX;
        xWorld += 2;
        if(xWorld < -1000){
            dX = 0;
            xWorld += 10;
        }
    }
    if (yWorld <= 0) {
        dY = -dY;
        yWorld += 2;
        if(yWorld < -1000){
            dX = 0;
            yWorld += 10;
        }
    }
    if (xWorld + width >= maxX) {
        dX = -dX;
        xWorld -= 2;
        if(xWorld+width > maxX + 1000){
            dX = 0;
            xWorld -= 10;
        }
    }
    if (yWorld + height >= maxY) {
        dY = -dY;
        yWorld -= 2;
        if(yWorld+height > maxY + 1000){
            dY = 0;
            yWorld -= 10;
        }
    }



    //check for collision with borders
    if(betweenRect.intersects(s.betweenRect)){
        willIntersect = true;
    }else{
        willIntersect = false;
    }

    // Use all checks to see if they should collide
    if (getRect().intersects(s.getRect()) || s.getRect().intersects(getRect()) || willIntersect || (xWorld + width > s.xWorld && xWorld < s.xWorld + s.width && yWorld < s.yWorld+s.height && yWorld + height > s.yWorld) ) {

            double lastDy = dY;
            double lastsDy = s.dY;
            double lastDx = dX;
            double lastsDx = s.dX;

            dY = (((weight - s.weight) / (weight + s.weight)) * lastDy)
                    + (((2.0 * s.weight) / (weight + s.weight)) * lastsDy);
            s.dY = (((s.weight - weight) / (weight + s.weight)) * lastsDy)
                    + (((2.0 * weight) / (weight + s.weight)) * lastDy);

            dX = (((weight - s.weight) / (weight + s.weight)) * lastDx)
                    + (((2.0 * s.weight) / (weight + s.weight)) * lastsDx);
            s.dX = (((s.weight - weight) / (weight + s.weight)) * lastsDx)
                    + (((2.0 * weight) / (weight + s.weight)) * lastDx);



            if(willIntersect){
                willIntersect = false;
                //s.willIntersect = false;
            }


        }




}
0

Вы должны попробовать изменить код на

if(getRect().intersects(s.getRect()) || s.getRect().intersects(getRect()))
{
    // They have intersected
}

Причина этого существа, проверка метода пересечения уникальна для каждого прямоугольника. Выполнение проверки пересечения, чтобы увидеть, пересекает ли прямоугольник a прямоугольник b, отличается от выполнения проверки пересечения, чтобы увидеть, пересекает ли прямоугольник b прямоугольник a.

Кроме этого, можете ли вы дать мне больше информации о ваших прямоугольниках? Они вращаются? Как быстро они двигаются? Насколько они велики? Другая информация также будет полезной, я могу попытаться подумать о других причинах, почему они не сталкиваются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню