Как я могу рассчитать размер почтового ящика с этим классом? - PullRequest
2 голосов
/ 23 апреля 2011

У меня есть следующий класс Java, который я написал для проекта LibGdx OpenGL. Камера сохраняет соотношение сторон экрана независимо от того, как вы изменяете его размер, помечая сверху или снизу или по бокам. Пока все хорошо.

Проблема возникает, когда я пытаюсь получить координаты x, y мыши для щелчка, и для этой оси используется почтовый ящик. Сначала вот класс:

public class Camera {

private static float viewportWidth;
private static float viewportHeight;
private static float aspectRatio;
private static float barSize;

/**
  * Creates an orthographic camera where the "play area" has the given viewport size. The viewport will be scaled to maintain the aspect ratio.
  * 
  * @param virtualWidth the width of the game screen in virtual pixels.
  * @param virtualHeight the height of the game screen in virtual pixels.
  * @return the new camera.
  * 
  */

public static OrthographicCamera createCamera(float virtualWidth, float virtualHeight) {

    aspectRatio = virtualWidth / virtualHeight;


    float physicalWidth = Gdx.graphics.getWidth();
    float physicalHeight = Gdx.graphics.getHeight();

    if (physicalWidth / physicalHeight >= aspectRatio) {
//      Letterbox left and right.
         viewportHeight = virtualHeight;
         viewportWidth = viewportHeight * physicalWidth / physicalHeight;
         barSize = ????;
    }
    else {
//      Letterbox above and below.
       viewportWidth = virtualWidth;
       viewportHeight = viewportWidth * physicalHeight / physicalWidth;
       barSize = ????;
    }

    OrthographicCamera cam = new OrthographicCamera(viewportWidth , viewportHeight);
    cam.position.set(virtualWidth / 2, virtualHeight / 2, 0);
    cam.rotate(180, 1, 0, 0);
    cam.update();
    Gdx.app.log("BTLog", "barSize:"+barSize);
    return cam;
}

public static float getViewportWidth() {
    return viewportWidth;
}

public static float getViewportHeight() {
    return viewportHeight;
}
}

LibGdx предоставляет мне координаты x и y, когда происходит четное, и мне нужно перевести эти необработанные координаты в масштаб моей камеры (виртуальная высота и ширина).

Когда экран растянут (вообще без почтовых ящиков), довольно просто получить координаты x и y, используя:

xRelative = (int) (x / (float)Gdx.graphics.getWidth() * Camera.getViewportWidth());
yRelative = (int) (y / (float)Gdx.graphics.getHeight() * Camera.getViewportHeight());

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

Выше, где у меня есть "barSize = ????;" мой первый инстинкт был сделать это: barSize = PhysicalHeight - viewportHeight; // использовать высоту например

Как только я получу barSize, я вполне уверен, что смогу использовать это, чтобы получить правильные числа (например, по оси y):

yRelative = (int) (y / (float)Gdx.graphics.getHeight() * Camera.getViewportHeight() - Camera.getBarSize());

Но цифры не совпадают. Любые предложения будут очень признательны!

1 Ответ

3 голосов
/ 24 апреля 2011
Ray ray = camera.getPickRay(x, y);
System.out.println(ray.origin.x);
System.out.println(ray.origin.y);
...