LibGDX — ортогональная камера не останавливается на краю карты

Я довольно новичок в libgdx и java, но изучаю все, что могу! Я работаю над ортогональной 2D-игрой. По сути, мой персонаж ходит вокруг, а камера следует за ним. Я пытаюсь настроить его так, чтобы камера останавливалась, когда персонаж находится у края карты, чтобы не было видно черного пространства. Камера должна остановиться на краю, а игрок должен продолжить движение.

Это мой код для перемещения камеры. Теперь это немного грязно, так как я пробовал все. Карта 30х30.

if (mainPlayer.getPosition().x >= 15 && mainPlayer.getPosition().x <= 30) {
    camera.position.x = mainPlayer.getPosition().x;     
}

camera.position.y = mainPlayer.getPosition().y;

camera.update();
camera.apply(gl);

Это внутри моего метода рендеринга. Я запутался только с частью x, так что пока игнорируйте y.

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


person Bassex    schedule 25.01.2014    source источник


Ответы (2)


РЕДАКТИРОВАТЬ Я думаю, мне нужно перефразировать это. Я знаю, как остановить его. Он работает с моим кодом, но я не могу понять, как определить, где его остановить. Я использую 15 в своем коде выше, что составляет половину карты... что, конечно, не работает.

Минимальный x должен быть:

map.position.x + camera.viewportWidth/2;

Максимальный x должен быть:

map.position.x+mapwidth-camera.viewportWidth/2;

Предполагая, что позиция карты находится в (0,0), вы можете просто игнорировать часть map.position.x.

person Lestat    schedule 25.01.2014

Вам нужно зафиксировать границы прямоугольника камеры внутри прямоугольника мира. Поможет такая функция, как показано ниже:

public void fixBounds() {
    float scaledViewportWidthHalfExtent = viewportWidth * zoom * 0.5f;
    float scaledViewportHeightHalfExtent = viewportHeight * zoom * 0.5f;

    // Horizontal
    if (position.x < scaledViewportWidthHalfExtent)
        position.x = scaledViewportWidthHalfExtent;
    else if (position.x > xmax - scaledViewportWidthHalfExtent)
        position.x = xmax - scaledViewportWidthHalfExtent;

    // Vertical
    if (position.y < scaledViewportHeightHalfExtent)
        position.y = scaledViewportHeightHalfExtent;
    else if (position.y > ymax - scaledViewportHeightHalfExtent)
        position.y = ymax - scaledViewportHeightHalfExtent;
}
person Otieno Rowland    schedule 29.12.2016