Повторный рендеринг текстур с помощью camera.unproject устанавливает неправильные позиции при перемещении камеры - PullRequest
0 голосов
/ 09 сентября 2018

Проблема

Когда я перемещаю камеру, каждая текстура, которая визуализируется, мерцает вокруг экрана в 2 разных положениях.

Что я хочу

пример: когда я перемещаю камеру влево, я хочу, чтобы все текстуры переместились на 32 пикселя вправо. камера перемещается 32 пикселя за нажатие кнопки.

Текущий код

Я добавил несколько дополнительных пояснений в комментарии.

MainProgramEntryPoint

/**
 * DefaultCamera: Setting up OrthographicCamera
 * CameraMovement: Using camera.translate on keypresses to move the screen.
 * TestMoveable: Creating a texture for testing rendering.
 */
public class WorldSimGame extends ApplicationAdapter {
    private DefaultCamera defaultCamera;
    private CameraMovement cameraMovement;
    private TestMoveable testMoveable;

    // Setting up the camera and texture.
    public void create ()  {
        defaultCamera = new DefaultCamera();
        cameraMovement =  new CameraMovement(defaultCamera.getCamera());
        testMoveable = new TestMoveable();
        testMoveable.create(defaultCamera);
    }

    // The testMoveable.render(defaultCamera) should keep track of the  testMoveable position
    public void render ()  {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        defaultCamera.render();
        testMoveable.render(defaultCamera);
    }
}

TestMoveable

public class TestMoveable {
    private Texture tex;
    private SpriteBatch batch;
    private Vector3 position;

    public void create(DefaultCamera defaultCamera) {
        tex = new Texture(("wall.png"));    
        batch = new SpriteBatch();
        position = new Vector3(100, 100, 0);
        defaultCamera.getCamera().unproject(position);
    }

Не могу представить, что установка координат x и y для мировых координат не будет работать.

    public void render(DefaultCamera defaultCamera) {       
        batch.begin();
        batch.draw(tex, position.x, position.y);
        batch.end();
    }
}

Что я здесь не так делаю? И есть ли лучший способ реализовать проверку позиции для средств визуализации?

1 Ответ

0 голосов
/ 10 сентября 2018

Вам не нужно проверять положение рендера. Все, что вам нужно сделать, это установить размер и положение вашего camera. Затем с batch.setProjectionMatrix(camera.combined) вы говорите партию, чтобы нарисовать то, что видит камера.

Итак, когда вы создаете камеру с размером = 50x50 и позицией = 100,100
и теперь вы создаете Texture с размером = 50x50 и позицией = 75,75
Текстура отлично подойдет под экран отверстия.

Положение камеры в центре. Таким образом, позиция Texture составляет 75,75, а не 100,100

Когда вы теперь будете двигать камеру, вы можете использовать метод: translate() вашей камеры.
Позвоните: camera.translate(25,0), чтобы переместить камеру на 25 единиц вправо, и теперь вы видите только половину вашего Texture в левой части экрана.

Это простой пример Подвижной камеры. Вы можете использовать клавиши со стрелками для перемещения:

public class WorldSimGame extends ApplicationAdapter {

    private OrthographicCamera camera;
    private SpriteBatch batch;
    private Texture texture;

    public WorldSimGame() { }

    @Override
    public void create(){
        //Create texture, batch and camera
        texture = new Texture(Gdx.files.internal("badlogic.jpg"));
        batch = new SpriteBatch();
        camera = new OrthographicCamera(60,60);
    }

    @Override
    public void render(){
        //clear screen
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        moveCamera();
        //update camera that he recalculate his position and Matrix
        camera.update();

        batch.setProjectionMatrix(camera.combined); //set batch to draw what the camera sees
        batch.begin();
        batch.draw(texture,0,0); //draw texture
        batch.end();
    }

    private void moveCamera(){
        //move camera
        if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)){
            camera.translate(4,0);
        }
        if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
            camera.translate(-4,0);
        }
        if(Gdx.input.isKeyPressed(Input.Keys.UP)){
            camera.translate(0,4);
        }
        if(Gdx.input.isKeyPressed(Input.Keys.DOWN)){
            camera.translate(0,-4);
        }
    }
}
...