मैंने 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
) को बनाए रखने के लिए मंच की अपनी मूल कार्यक्षमता है । अब जब मैंने स्टेज स्क्रीन का उपयोग करके अपनी स्क्रीन को लागू किया है, तो पहलू अनुपात इसके द्वारा अच्छी तरह से बनाए रखा गया है। हालाँकि आकार या अलग-अलग स्क्रीन आकारों पर, उत्पन्न होने वाला काला क्षेत्र हमेशा स्क्रीन के दाईं ओर दिखाई देता है; यही कारण है कि स्क्रीन केंद्रित नहीं है, जो कि यदि काला क्षेत्र काफी बड़ा है तो यह काफी बदसूरत है।
क्या कोई भी समुदाय सदस्य इस समस्या को हल करने में मेरी मदद कर सकता है?