Screen
libGDX 프레임 워크에서 제공 하는 클래스를 분명히 사용하는 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()
텍스처를 구현 한 경우 화면 크기를 조정하면 크기 조정에 따라 텍스처 영역의 touchListener가 약간의 픽셀을 오른쪽 또는 왼쪽으로 이동하며 이것은 분명히 바람직하지 않습니다.
나중에 스테이지 클래스에 종횡비 ( boolean stretch = false
) 를 유지하기위한 고유 한 기능이 있다는 것을 알게되었습니다 . 이제 스테이지 클래스를 사용하여 화면을 구현 했으므로 화면 비율이 잘 유지됩니다. 그러나 크기가 조정되거나 다른 화면 크기에서 생성되는 검은 색 영역은 항상 화면 오른쪽에 나타납니다. 즉, 화면이 중앙에 있지 않기 때문에 검정색 영역이 상당히 크면보기가 매우보기 흉합니다.
커뮤니티 회원이이 문제를 해결하도록 도와 줄 수 있습니까?