Как вы реализуете горизонтальную прокрутку с помощью LibGDX?

#java #android #libgdx #horizontal-scrolling

#java #Android #libgdx #горизонтальная прокрутка

Вопрос:

Я хочу запрограммировать игру, похожую на старые браузерные игры «Warfare 1917». Я застрял на части прокрутки.

Я попытаюсь объяснить, чего я хочу, с помощью gif:

введите описание изображения здесь

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

Ответ №1:

Поскольку перемещение камеры — плохая практика, лучше переместить слой (контейнер ваших спрайтов) или вы можете попробовать ScrollPane, реализацию WidgetGroup

Смотрите https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/ui/ScrollPane.html

p.s. протестировано на версии 1.9.11

Комментарии:

1. почему перемещение камеры — плохая практика???

Ответ №2:

Я думаю, это должно сработать

 public class MovingCamera extends InputAdapter {

    OrthographicCamera camera;    // The camera to be moved
    float pivotX;                 // The pivot for the movement

    public MovingCamera() {
        camera = new OrthographicCamera(); // Initialize camera
    }

    // Create a pivot
    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        Vector3 unprojected = camera.unproject(new Vector3(screenX, screenY, 0)); // Convert from pixel to world coordinates
        pivotX = unprojected.x;                                                   // Save first finger touch on screen (Will serve as a pivot)
        return true;                                                              // Input has been processed
    }

    // Move the camera
    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        Vector3 unprojected = camera.unproject(new Vector3(screenX, screenY, 0)); // Convert from pixel to world coordinates
        camera.position.x  = unprojected.x - pivotX;                              // Change camera position
        camera.update();                                                          // Apply changes
        return true;                                                              // Input has been processed
    }
}
  

И в вашем методе рендеринга:

 public void render(SpriteBatch spriteBatch) {
    spriteBatch.setProjectionMatrix(camera.combined); // Let the Sprite Batch use the camera
    spriteBatch.begin();
    // [Draw your Textures, TextureRegions, Sprites, etc...]
    spriteBatch.end();
}