Libgdx установить ортокамеру - PullRequest
0 голосов
/ 24 августа 2018

У меня проблемы с настройкой моей орфографической камеры в нижней левой части моего экрана (0,0)

public GameScreen(Main game) {
    this.game = game;
    Width = 200;
    Height = 300;

    view = new ExtendViewport(Width,Height);
    camera = new OrthographicCamera(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
    camera.setToOrtho(false,Width/2,Height/2);
    camera.position.set(Width,Height,0);
    camera.update();

    play.Player1();
    staple = new Stage();
    staple.addActor(play);
    staple.addActor(pile);
    Gdx.input.setInputProcessor(staple);
}

@Override
public void render(float delta) {
        Gdx.gl.glClearColor(0, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        Gdx.graphics.getDeltaTime();
        game.getBatch().begin();
        game.getBatch().setProjectionMatrix(camera.combined);
        game.getBatch().end();
        staple.act();
        staple.draw();
}

@Override
public void resize(int width, int height) {
    view.update(width,height);
    view.setScreenPosition(width,height);

}

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

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Используйте camera.position.set(Width, Height, 1); вместо 0

0 голосов
/ 28 августа 2018

Вот небольшой пример использования камеры и области просмотра:
Сначала мы должны определить, насколько велик наш мир, который показывает камера:

private static final int WORLD_WIDTH = 300;private static final int WORLD_HEIGHT = 250;

Наш мир теперь 300 х 250 единиц (не пиксель!) большой.
Важно думать в единицах, а не в пикселях !!

Теперь нам нужны OrthographicCamera, Viewport и SpriteBatch

OrthographicCamera camera;
Viewport viewport;
SpriteBatch batch;

@Override
public void create () {
    camera = new OrthographicCamera(); // we create a OrthographicCamera
    viewport = new ExtendViewport(WORLD_WIDTH, WORLD_HEIGHT, camera); // we create a new Viewport with our camera and we will display our world 300 x 250 units
    batch = new SpriteBatch(); // we create a new SpriteBatch for draw our textures
}

В нашем методе рендеринга мы говорим, что пакет только отрисовывает то, что мы видим в нашем Viewport с помощью метода setProjectionMatrix()

@Override
public void render (float delta) {
    camera.update(); //update our camera every frame
    batch.setProjectionMatrix(camera.combined); //say the batch to only draw what we see in our camera

    batch.begin();
    batch.draw(texture, 0,0); //draw our texture on point 0,0 bottom left corner
    batch.end();
}

И в методе изменения размера:

public void resize(int width, int height){
    viewport.update(width, height); //update the viewport to recalculate
}

Чтобы понять, почему возникает эта проблема:
В своем коде вы никогда не устанавливаете камеру в окно просмотра: view = new ExtendViewport(Width,Height);
Таким образом, ваш видовой экран никогда не применяется к партии.

Чтобы правильно отобразить путь без видового экрана, вы должны знать, что положение OrhographicCamera находится в центре.

Поэтому, когда вы устанавливаетеКамера в положении 0,0 и размером 50,50 вы видите мир от -25 до 25 в каждом направлении;

Для использования OrthographicCamera без видового экрана:

public void create () {
    camera = new OrthographicCamera(WORLD_WIDTH, WORLD_HEIGHT); // we create a OrthographicCamera and we will display our world 300 x 250 units
    camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0); //we set position of camera, our world point 0,0 is now the bottom left corner in the camera
    batch = new SpriteBatch(); // we create a new SpriteBatch for draw our textures
    texture = new Texture("badlogic.jpg");
}

public void render () {
    camera.update();
    batch.setProjectionMatrix(camera.combined);

    batch.begin();
    batch.draw(texture, 0,0);
    batch.end();
}

Важным моментом являетсяметод изменения размера:

public void resize(int width, int height){
    camera.viewportWidth = WORLD_WIDTH;
    camera.viewportHeight = WORLD_HEIGHT * height / width;
    camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
}

С этим расчетомвы всегда видите мир шириной 300 и соотношением ширины и высоты 250 *.

И именно этот расчет делает окно просмотра для вас.В зависимости от того, какой Vieport (FitViewport, ScreenViewport, ExtendViewport) вы используете, этот расчет будет отличаться, попробуйте его.

Надеюсь, это поможет вам понять, как камера, область просмотра и Spritebatch работают вместе.

Вот полезные ссылки на вики libgdx, которые описывают окно просмотра и камеру:
https://github.com/libgdx/libgdx/wiki/Viewports
https://github.com/libgdx/libgdx/wiki/Orthographic-camera

0 голосов
/ 25 августа 2018

Сначала вы устанавливаете ширину и высоту Camara равными количеству пикселей окна.

camera = new OrthographicCamera(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());

Затем вы центрируете его на 100, 150. И снова перемещаете его на 200, 300

camera.setToOrtho(false,Width/2,Height/2);
camera.position.set(Width,Height,0);

Вы также используете Viewport, но никогда не используете его.

Я бы порекомендовал просто использовать Viewport на выбор.Viewport может взять камеру, поэтому, если вы настаиваете на использовании своей собственной камеры, вы можете создать ее, а затем передать ее в окно просмотра при ее создании.

РЕДАКТИРОВАТЬ

Ниже приведен проверенный минимальный пример.

public class TestScreen extends ScreenAdapter {

    private Viewport viewport;
    private ShapeRenderer sr;

    public TestScreen() {
        // Note that extend viewport extends it's camera so you end up with smaller or larger view of your world depending on the aspect ratio of the physical screen.
        viewport = new ExtendViewport(200, 300);
        viewport.apply();

        System.out.println(viewport.getWorldWidth());

        // Just for testing in the resize method.
        viewport.getCamera().translate(0, 0, 0);
        viewport.getCamera().update();

        // ShapeRenderer for testing
        sr = new ShapeRenderer();
        sr.setAutoShapeType(true);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(.04f, .06f, .1f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // Draw circle at 0.0 in the world
        sr.setProjectionMatrix(viewport.getCamera().combined);
        sr.begin(ShapeRenderer.ShapeType.Line);
        sr.circle(0, 0, 100);
        sr.end();
    }

    @Override
    public void resize(int width, int height) {

        // Will center the camera in the world at half it's width and half it's height so left bottom is 0.0 as long as the camera did.
        // By using true here you cannot move the camera since you order it to center on the screen and thus the circle we are drawing
        // remains in the bottom left.
        //viewport.update(width, height, true);

        // This will just update the viewport, we moved the camera slightly to the left so the circle appears slight right from the middle.
        viewport.update(width, height, false);

        // So you want to start your camera centered on something but still want to move it you need to specify that center in the camera
        // by either changing it's position or translating it like I did in the constructor. Unfortunately you only get to know the size
        // of the world that is being displayed once this resize method did it's job so certain parts might get cut off or your world does
        // not fill the screen.
    }
}
...