Java обнаружение столкновения для повернутых прямоугольников? - PullRequest
5 голосов
/ 07 мая 2011

Я пишу свою первую Java-игру и до сих пор:

Я сделал прямоугольник, который можно ходить с помощью WSAD, и он всегда смотрит туда, куда указывает мышь. Также, если вы нажмете, он стреляет пулями, куда указывает ваша мышь (и пули вращаются в этом направлении). Я также создал врагов, которые следуют за тобой, и они поворачиваются лицом к твоему персонажу. Проблема, которую я имею, состоит в том, что обнаруженное мной столкновение обнаруживает только обнаружение столкновения объектов (персонажа, врагов и пуль) перед их вращением (используя .intersects ()). Это означает, что некоторые части их тела перекрываются при рисовании.

Я оглядывался по сторонам и не нашел решений, которые я понимаю или могу применить к моей ситуации. До сих пор я вращал свою сетку Graphics2D для каждого из объектов, поэтому они фактически не вращаются, а просто вытянуты. Есть ли способ, которым я могу вращать их фигуры, а затем использовать что-то вроде .intersects ()?

Любая помощь или предложения приветствуются.

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

public boolean detectCollisionX(int id, double xMove, double rectXco, double rectYco, int width, int height)
{
    boolean valid=true;
    //create the shape of the object that is moving.
    Rectangle enemyRectangleX=new Rectangle((int)(rectXco+xMove)-enemySpacing,(int)rectYco-enemySpacing,width+enemySpacing*2,height+enemySpacing*2);
    if (rectXco+xMove<0 || rectXco+xMove>(areaWidth-width))
    {
        valid=false;
    }
    if(enemyNumber>0)
    {
        for (int x=0; x<=enemyNumber; x++)
        {
            if (x!=id)
            {
                //enemies and other collidable objects will be stored in collisionObjects[x] as rectangles.
                if (enemyRectangleX.intersects(collisionObjects[x])==true)
                {
                    valid=false;
                }
            }
        }
    }
    return valid;
}

1 Ответ

5 голосов
/ 08 мая 2011

Вероятно, вы можете использовать класс AffineTransform для поворота различных объектов при условии, что объекты имеют тип Area.

Предположим, что у вас есть два объекта a и b, вы можете вращать их так:

  AffineTransform af = new AffineTransform();
  af.rotate(Math.PI/4, ax, ay);//rotate 45 degrees around ax, ay

  AffineTransform bf = new AffineTransform();
  bf.rotate(Math.PI/4, bx, by);//rotate 45 degrees around bx, by

  ra = a.createTransformedArea(af);//ra is the rotated a, a is unchanged
  rb = b.createTransformedArea(bf);//rb is the rotated b, b is unchanged

  if(ra.intersects(rb)){
    //true if intersected after rotation
  }

и у вас есть оригинальные объекты на тот случай, если вы этого хотите. Использование AffineTransform позволяет легко комбинировать преобразования, инвертировать их и т. Д.

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