Я реализовал некоторые экраны с использованием libGDX, которые, очевидно, будут использовать класс Screen
, предоставляемый каркасом libGDX. Однако реализация для этих экранов работает только с предопределенными размерами экрана. Например, если спрайт предназначался для экрана размером 640 x 480 (соотношение сторон 4: 3), он не будет работать должным образом на экранах других размеров, потому что спрайты соответствуют границам экрана и не масштабируются до размера экрана. совсем. Более того, если бы libGDX обеспечил бы простое масштабирование, проблема, с которой я столкнулся бы, все еще существовала, потому что это могло бы привести к изменению соотношения сторон экрана игры.
После исследования Интернета я наткнулся на блог / форум , в котором обсуждалась та же проблема. Я реализовал это, и пока он работает нормально. Но я хочу подтвердить, является ли это лучшим вариантом для достижения этой цели, или есть ли лучшие альтернативы. Ниже приведен код, показывающий, как я справляюсь с этой законной проблемой.
ФОРУМНАЯ ССЫЛКА: http://www.java -gaming.org / index.php? Topic = 25685.new
public class SplashScreen implements Screen {
// Aspect Ratio maintenance
private static final int VIRTUAL_WIDTH = 640;
private static final int VIRTUAL_HEIGHT = 480;
private static final float ASPECT_RATIO = (float) VIRTUAL_WIDTH / (float) VIRTUAL_HEIGHT;
private Camera camera;
private Rectangle viewport;
// ------end------
MainGame TempMainGame;
public Texture splashScreen;
public TextureRegion splashScreenRegion;
public SpriteBatch splashScreenSprite;
public SplashScreen(MainGame maingame) {
TempMainGame = maingame;
}
@Override
public void dispose() {
splashScreenSprite.dispose();
splashScreen.dispose();
}
@Override
public void render(float arg0) {
//----Aspect Ratio maintenance
// update camera
camera.update();
camera.apply(Gdx.gl10);
// set viewport
Gdx.gl.glViewport((int) viewport.x, (int) viewport.y,
(int) viewport.width, (int) viewport.height);
// clear previous frame
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// DRAW EVERYTHING
//--maintenance end--
splashScreenSprite.begin();
splashScreenSprite.disableBlending();
splashScreenSprite.draw(splashScreenRegion, 0, 0);
splashScreenSprite.end();
}
@Override
public void resize(int width, int height) {
//--Aspect Ratio Maintenance--
// calculate new viewport
float aspectRatio = (float)width/(float)height;
float scale = 1f;
Vector2 crop = new Vector2(0f, 0f);
if(aspectRatio > ASPECT_RATIO) {
scale = (float) height / (float) VIRTUAL_HEIGHT;
crop.x = (width - VIRTUAL_WIDTH * scale) / 2f;
} else if(aspectRatio < ASPECT_RATIO) {
scale = (float) width / (float) VIRTUAL_WIDTH;
crop.y = (height - VIRTUAL_HEIGHT * scale) / 2f;
} else {
scale = (float) width / (float) VIRTUAL_WIDTH;
}
float w = (float) VIRTUAL_WIDTH * scale;
float h = (float) VIRTUAL_HEIGHT * scale;
viewport = new Rectangle(crop.x, crop.y, w, h);
//Maintenance ends here--
}
@Override
public void show() {
camera = new OrthographicCamera(VIRTUAL_WIDTH, VIRTUAL_HEIGHT); //Aspect Ratio Maintenance
splashScreen = new Texture(Gdx.files.internal("images/splashScreen.png"));
splashScreenRegion = new TextureRegion(splashScreen, 0, 0, 640, 480);
splashScreenSprite = new SpriteBatch();
if(Assets.load()) {
this.dispose();
TempMainGame.setScreen(TempMainGame.mainmenu);
}
}
}
ОБНОВЛЕНИЕ: Недавно я узнал, что libGDX обладает некоторыми собственными функциями для поддержки соотношений сторон, которые я хотел бы обсудить здесь. При поиске проблемы соотношения сторон в Интернете я наткнулся на несколько форумов / разработчиков, у которых возникла проблема «Как сохранить соотношение сторон на экранах разных размеров?» Одно из решений, которое действительно помогло мне, было опубликовано выше.
Позже, когда я приступил к реализации методов touchDown()
для экрана, я обнаружил, что из-за масштабирования при изменении размера координаты, в которых я реализовал touchDown()
, сильно изменились бы. После работы с некоторым кодом для перевода координат в соответствии с изменением размера экрана, я значительно уменьшил эту сумму, но мне не удалось сохранить их с высокой точностью. Например, если бы я внедрил touchDown()
для текстуры, изменение размера экрана сместит сенсорный список на области текстуры на несколько пикселей вправо или влево, в зависимости от изменения размера, и это, очевидно, нежелательно.
Позже я узнал, что у сценического класса есть собственная встроенная функция для поддержания соотношения сторон (boolean stretch = false
). Теперь, когда я реализовал свой экран с помощью сценического класса, соотношение сторон хорошо поддерживается им. Однако при изменении размера или при разных размерах экрана генерируемая черная область всегда появляется в правой части экрана; то есть экран не отцентрирован, что делает его довольно уродливым, если черная область существенно велика.
Может ли какой-нибудь участник сообщества помочь мне решить эту проблему?