मैंने libGDX का उपयोग करके कुछ स्क्रीन लागू की हैं जो स्पष्ट रूप से libGDX ढांचे द्वारा प्रदान की गई Screen
कक्षा का उपयोग करेंगी। हालांकि, इन स्क्रीन के लिए कार्यान्वयन केवल पूर्व परिभाषित स्क्रीन आकार के साथ काम करता है। उदाहरण के लिए, यदि स्प्राइट 640 x 480 आकार स्क्रीन (4: 3 पहलू अनुपात) के लिए था, तो यह अन्य स्क्रीन आकारों के अनुसार काम नहीं करेगा क्योंकि स्प्राइट स्क्रीन सीमाओं के बराबर जाते हैं और स्क्रीन आकार में स्केल नहीं किए जाते हैं बिलकुल। इसके अलावा, यदि libgDX द्वारा सरल स्केलिंग प्रदान की गई थी, तो जिस मुद्दे का सामना कर रहा हूं वह अभी भी वहां रहेगा क्योंकि इससे गेम स्क्रीन के पहलू अनुपात में बदलाव आएगा।libGDX में विभिन्न पहलू अनुपात से निपटने के लिए कैसे?
इंटरनेट पर शोध करने के बाद, मैं blog/forum पर आया जिसने एक ही मुद्दे पर चर्चा की थी। मैंने इसे लागू किया है और अब तक यह ठीक काम कर रहा है। लेकिन मैं यह पुष्टि करना चाहता हूं कि यह हासिल करने का सर्वोत्तम विकल्प है या नहीं, बेहतर विकल्प हैं या नहीं। यह दिखाने के लिए कोड है कि मैं इस वैध समस्या से कैसे निपट रहा हूं।
फोरम लिंक: 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
) को बनाए रखने के लिए अपनी मूल कार्यक्षमता है। अब जब मैंने स्टेज क्लास का उपयोग कर अपनी स्क्रीन लागू की है, तो पहलू अनुपात इसके द्वारा अच्छी तरह से बनाए रखा जाता है। हालांकि आकार बदलने या विभिन्न स्क्रीन आकारों पर, उत्पन्न होने वाला काला क्षेत्र हमेशा स्क्रीन के दाईं ओर दिखाई देता है; यह स्क्रीन केंद्रित नहीं है जो काला क्षेत्र काफी बड़ा है अगर यह काफी बदसूरत बनाता है।
क्या कोई समुदाय सदस्य इस समस्या को हल करने में मेरी सहायता कर सकता है?
क्या आप ब्लॉग या फ़ोरम से लिंक कर सकते हैं जिसमें एक ही समस्या थी? –
@ स्टेवब्लैकवेल यहां लिंक है: http://www.java-gaming.org/index.php?topic=25685.new – Rafay
@ स्टेवब्लैकवेल कृपया अपडेट किया गया प्रश्न देखें और देखें कि क्या आप इस पर सहायता कर सकते हैं। – Rafay