Ho implementato alcune schermate usando libGDX che ovviamente utilizza la classe Screen
fornita dal framework libGDX. Tuttavia, l'implementazione per queste schermate funziona solo con dimensioni dello schermo predefinite. Ad esempio, se lo sprite era pensato per uno schermo di dimensioni 640 x 480 (rapporto di aspetto 4: 3), non funzionerà come previsto su altre dimensioni dello schermo perché gli sprite vanno al di fuori dei limiti dello schermo e non vengono ridimensionati in base alle dimensioni dello schermo affatto. Inoltre, se il libgDX fornisse un semplice ridimensionamento, il problema che sto affrontando sarebbe stato ancora presente perché ciò avrebbe comportato la modifica delle proporzioni della schermata di gioco.Come gestire le diverse proporzioni in libGDX?
Dopo aver effettuato ricerche su Internet, mi sono imbattuto in uno blog/forum che aveva discusso lo stesso problema. L'ho implementato e finora funziona bene. Ma voglio confermare se questa è l'opzione migliore per raggiungere questo obiettivo o se esistono alternative migliori. Di seguito è riportato il codice per mostrare come sto affrontando questo problema legittimo.
FORUM LINK: 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);
}
}
}
UPDATE: ho recentemente venuto a sapere che libGDX ha alcune delle propria funzionalità per mantenere rapporti di aspetto che vorrei discutere qui. Durante la ricerca del problema delle proporzioni su Internet, mi sono imbattuto in diversi forum/sviluppatori che avevano questo problema di "Come mantenere le proporzioni su schermi di dimensioni diverse?" Una delle soluzioni che ha funzionato davvero per me è stata pubblicata qui sopra.
Più tardi, quando ho proceduto con l'attuazione delle touchDown()
metodi per lo schermo, ho scoperto che a causa di ridimensionamento sul ridimensionamento, le coordinate su cui avevo attuate touchDown()
cambierebbero da una grande quantità. Dopo aver lavorato con un po 'di codice per tradurre le coordinate in base al ridimensionamento dello schermo, ho ridotto questa quantità in gran parte, ma non sono riuscito a mantenerle con precisione puntuale. Ad esempio, se avessi implementato touchDown()
su una trama, il ridimensionamento dello schermo avrebbe spostato il touchListener nella regione della texture di alcuni pixel a destra oa sinistra, a seconda del ridimensionamento e questo era ovviamente indesiderato.
In seguito sono venuto a sapere che la classe stage ha la propria funzionalità nativa per mantenere le proporzioni (boolean stretch = false
). Ora che ho implementato il mio schermo usando la stage class, le proporzioni sono mantenute bene da esso. Tuttavia su ridimensionamento o dimensioni dello schermo diverse, l'area nera che viene generata appare sempre sul lato destro dello schermo; quello è lo schermo non è centrato che lo rende piuttosto brutto se l'area nera è sostanzialmente grande.
Può qualche membro della comunità aiutarmi a risolvere questo problema?
Puoi collegarti al blog o al forum che ha lo stesso problema? –
@SteveBlackwell ecco il link: http://www.java-gaming.org/index.php?topic=25685.new – Rafay
@SteveBlackwell Si prega di consultare la domanda aggiornata e vedere se è possibile aiutare su questo. – Rafay