Açıkçası Screen
libGDX çerçevesi tarafından sağlanan sınıfı kullanan libGDX kullanarak bazı ekranlar uyguladım . Bununla birlikte, bu ekranlar için uygulama yalnızca önceden tanımlanmış ekran boyutlarıyla çalışır. Örneğin, hareketli grafik 640 x 480 boyutlu bir ekrana (4: 3 En-boy oranı) yönelikse, diğer ekran boyutlarında tasarlandığı gibi çalışmayacaktır çünkü hareketli görüntüler ekran sınırlarını aşar ve ekran boyutuna ölçeklenmez. hiç. Dahası, basit ölçeklendirme libGDX tarafından sağlanmış olsaydı, karşılaştığım sorun hala orada olurdu çünkü bu, oyun ekranının en boy oranının değişmesine neden olur.
İnternette araştırma yaptıktan sonra aynı konuyu tartışan bir blog / forumla karşılaştım. Ben uyguladım ve şu ana kadar iyi çalışıyor. Ancak bunun bunu başarmak için en iyi seçenek olup olmadığını veya daha iyi alternatifler olup olmadığını teyit etmek istiyorum. Bu meşru problemle nasıl başa çıktığımı gösteren kod aşağıdadır.
FORUM BAĞLANTISI: 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);
}
}
}
GÜNCELLEME: Yakın zamanda, libGDX'in burada tartışmak istediğim en boy oranlarını korumak için kendi işlevlerinden bazılarına sahip olduğunu öğrendim. İnternette en boy oranı sorununu araştırırken, "Farklı ekran boyutlarında en boy oranı nasıl korunur?" Sorununu yaşayan birkaç forum / geliştirici ile karşılaştım. Benim için gerçekten işe yarayan çözümlerden biri yukarıda yayınlandı.
Daha sonra touchDown()
ekran için yöntemleri uygulamaya başladığımda , yeniden boyutlandırmadaki ölçeklendirme nedeniyle, uyguladığım koordinatların touchDown()
büyük miktarda değişeceğini gördüm . Koordinatları ekran boyutuna göre çevirmek için bazı kodlarla çalıştıktan sonra, bu miktarı büyük ölçüde azalttım, ancak pin noktası doğruluğu ile tutmayı başaramadım. Örneğin, touchDown()
bir doku üzerine uyguladıysam , ekranın yeniden boyutlandırılması, doku bölgesindeki touchListener'ı yeniden boyutlandırmaya bağlı olarak birkaç piksel sağa veya sola kaydırırdı ve bu açıkça istenmeyen bir durumdu.
Daha sonra sahne sınıfının en boy oranını ( boolean stretch = false
) korumak için kendi yerel işlevselliğine sahip olduğunu öğrendim . Artık sahne sınıfını kullanarak ekranımı uyguladığıma göre, en boy oranı iyi korunuyor. Ancak yeniden boyutlandırma veya farklı ekran boyutlarında, oluşturulan siyah alan her zaman ekranın sağ tarafında görünür; yani ekran ortalanmamış, bu da siyah alan çok büyükse oldukça çirkin oluyor.
Herhangi bir topluluk üyesi bu sorunu çözmeme yardım edebilir mi?