Вот небольшой пример использования камеры и области просмотра:
Сначала мы должны определить, насколько велик наш мир, который показывает камера:
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