Tôi đã triển khai một số màn hình sử dụng libGDX rõ ràng sẽ sử dụng Screen
lớp được cung cấp bởi khung libGDX. Tuy nhiên, việc triển khai cho các màn hình này chỉ hoạt động với các kích thước màn hình được xác định trước. Ví dụ: nếu sprite được dành cho màn hình có kích thước 640 x 480 (Tỷ lệ co 4: 3), thì nó sẽ không hoạt động như dự định trên các kích thước màn hình khác vì sprite đi ngang với ranh giới màn hình và không được chia tỷ lệ với kích thước màn hình ở tất cả. Hơn nữa, nếu libGDX cung cấp tỷ lệ đơn giản, thì vấn đề mà tôi đang gặp phải vẫn còn đó vì điều đó sẽ khiến tỷ lệ khung hình của màn hình trò chơi thay đổi.
Sau khi nghiên cứu trên internet, tôi tình cờ thấy một blog / diễn đàn đã thảo luận về vấn đề tương tự. Tôi đã thực hiện nó và cho đến nay nó đang hoạt động tốt. Nhưng tôi muốn xác nhận liệu đây có phải là lựa chọn tốt nhất để đạt được điều này hay liệu có những lựa chọn thay thế tốt hơn hay không. Dưới đây là mã để hiển thị cách tôi giải quyết vấn đề hợp pháp này.
LIÊN KẾT DIỄN ĐÀN: 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);
}
}
}
CẬP NHẬT: Gần đây tôi đã biết rằng libGDX có một số chức năng riêng để duy trì tỷ lệ khung hình mà tôi muốn thảo luận ở đây. Trong khi tìm kiếm vấn đề về tỷ lệ khung hình trên internet, tôi đã gặp một số diễn đàn / nhà phát triển có vấn đề này là "Làm thế nào để duy trì tỷ lệ khung hình trên các kích thước màn hình khác nhau?" Một trong những giải pháp thực sự hiệu quả với tôi đã được đăng ở trên.
Sau đó, khi tôi tiếp tục triển khai các touchDown()
phương thức cho màn hình, tôi thấy rằng do thay đổi tỷ lệ khi thay đổi kích thước, các tọa độ mà tôi đã thực hiện touchDown()
sẽ thay đổi rất nhiều. Sau khi làm việc với một số mã để dịch các tọa độ phù hợp với thay đổi kích thước màn hình, tôi đã giảm số lượng này xuống rất nhiều nhưng tôi đã không thành công trong việc duy trì chúng với độ chính xác của điểm pin. Ví dụ: nếu tôi đã triển khai touchDown()
trên một kết cấu, việc thay đổi kích thước màn hình sẽ dịch chuyển TouchListener trên vùng kết cấu một số pixel sang phải hoặc trái, tùy thuộc vào việc thay đổi kích thước và điều này rõ ràng là không mong muốn.
Sau đó, tôi biết rằng lớp sân khấu có chức năng riêng để duy trì tỷ lệ khung hình ( boolean stretch = false
). Bây giờ tôi đã triển khai màn hình của mình bằng cách sử dụng lớp sân khấu, tỷ lệ khung hình được duy trì tốt bởi nó. Tuy nhiên khi thay đổi kích thước hoặc các kích thước màn hình khác nhau, vùng màu đen được tạo ra luôn xuất hiện ở phía bên phải của màn hình; đó là màn hình không được căn giữa, điều này làm cho nó khá xấu nếu vùng đen về cơ bản là lớn.
Bất kỳ thành viên nào trong cộng đồng có thể giúp tôi giải quyết vấn đề này không?