Risoluzione Indipendenza in libGDX


22

Come posso rendere indipendente la risoluzione / densità del mio gioco libGDX? Esiste un modo per specificare le dimensioni dell'immagine come "assolute" indipendentemente dalla densità sottostante?

Sto realizzando un gioco per bambini molto semplice; solo un gruppo di sprite visualizzati sullo schermo e un po 'di testo per i menu (principalmente il menu delle opzioni). Quello che voglio sapere è: come posso rendere indipendente la mia risoluzione di sprites / fonts? (Li ho avvolti nelle mie lezioni per rendere le cose più facili.)

Dato che è un semplice gioco per bambini, non ho bisogno di preoccuparmi dell '"area giocabile" del gioco; Voglio usare quanto più spazio possibile sullo schermo.

Quello che sto facendo in questo momento, che sembra super scorretto, è semplicemente creare immagini adatte a grandi risoluzioni e quindi ridimensionarle (o raramente, verso l'alto) per adattarle alle dimensioni dello schermo. Questo sembra funzionare bene (nella versione desktop), anche con una mappatura lineare sulle mie trame, ma le risoluzioni più piccole sembrano brutte.

Inoltre, questo sembra volare di fronte ai "pixel indipendenti dal dispositivo" (DP) di Android. O forse mi manca qualcosa e libGDX si occupa già di questo in qualche modo?

Qual è il modo migliore per affrontare questo? Ho trovato questo link; è un buon modo per risolvere il problema ?: http://www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

Indica come controllare le immagini, ma non menziona come specificare le dimensioni dei caratteri / delle immagini indipendentemente dalla densità.



@thedaian non proprio. Si tratta di risoluzione; Sono più preoccupato per l'interazione tra densità e risoluzione.
ashes999,

Risposte:


12

Dato che puoi leggere la densità del dispositivo e renderizzare i caratteri durante il runtime in libgdx, uso questa soluzione per ottenere una dimensione del carattere indipendente dalla densità:

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );

La mia discussione riguarda sia le immagini che i caratteri. +1 per il rendering dinamico dei caratteri (lo faccio già).
ashes999,

10

Per raggiungere questo obiettivo in libgdx, puoi usare la "videocamera ortografica" in cui assegni le dimensioni che usi per usare, e in ogni risoluzione potresti vedere tutte le tue immagini ridimensionate a quelle dimensioni (io uso 800X480 perché è lo schermo più grande in Android ) e funziona bene :)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}

Posso ottenere un esempio di codice, per favore?
ashes999,

Questo è il codice e crei una classe che implementa l'interfaccia Screen, nel costruttore costruisci il tuo stage e nel metodo render, metti stage.draw (). Se non si desidera utilizzare le fasi, è possibile dichiarare una variabile nella classe di tipo Camera implementata a schermo e fare la stessa cosa di Stage, ma nel metodo di rendering si applica un aggiornamento alla telecamera.
Rudy_TM,

In realtà funziona abbastanza bene.
you786,

4

Credo che i "pixel indipendenti dal dispositivo" di Android siano solo uno strumento di misurazione per la classificazione dei dispositivi e non sono effettivamente disponibili come pixel renderizzabili. Quindi non ti perderai nessuna magica infrastruttura di risoluzione DPI. Per quanto ho capito lo stato dell'arte qui, hai scoperto tutte le opzioni. Esistono due approcci di base per gestire dispositivi diversi:

  1. Ridimensiona le immagini preesistenti in modo che corrispondano al DPI effettivo del dispositivo.
  2. Scegli tra una varietà di immagini pre-ridimensionate in fase di esecuzione in base al DPI.

Ovviamente, puoi fare un mix dei due (scegliere un'immagine approssimativamente accurata e quindi ridimensionarla), oppure utilizzare approcci diversi per diversi elementi dell'interfaccia utente (ad esempio, immagini preesistenti per caratteri / testo e ridimensionamento dinamico per il gameplay sprite).

Ciò che il tuo gioco specifico sta cercando di fare può davvero fare la differenza in quale approccio ha più senso. Ad esempio, se hai un menu sullo schermo, ti consigliamo di assicurarti che i pulsanti siano un multiplo ragionevole della dimensione di un dito (quindi il pulsante è sempre facile da colpire, ma non è più grande del necessario su grandi dispositivi come i tablet). In alternativa, se stai cercando di creare un puzzle game in cui desideri assicurarti che l'intero puzzle sia visibile contemporaneamente, dovrai ridimensionare gli elementi per adattarli allo schermo (ad esempio, con un tic-tac-toe forse vorresti che ogni elemento utilizzi all'incirca 1/3 dello schermo).

Penso a cose come i caratteri che hanno molti dettagli precisi che vorrai avere una varietà di immagini pre-renderizzate con testo, quindi scegliere la migliore corrispondenza. Quindi i pulsanti potrebbero cambiare la loro forma / dimensione relativa da un dispositivo all'altro, ma in genere sembreranno sempre belli.

Dai un'occhiata ai giochi Android di Mario Zerchner per alcune discussioni sui problemi e alcune soluzioni. Nota che Mario è l'autore di libGDX, quindi l'approccio del libro rispecchia quello di libGDX (nota che non sono uno a uno, il libro copre la scrittura di una libreria simile a libGDX, ma non lo stesso libGDX).


Anche se seleziono da raccolte di immagini predefinite basate su DPI, non vedo come posso garantire che "questo sprite DEVE essere visualizzato come 64x64".
ashes999,

1
Pensavo che avessi impostato la tua videocamera OpenGL in modo che corrispondesse alla visualizzazione fisica, quindi 1 pixel OpenGL esegue la mappatura su 1 pixel di visualizzazione. A quel punto un'immagine 64x64 apparirà sullo schermo come 64x64. Come sottolinea Rudy_TM, puoi fare confusione con la mappatura della videocamera per ottenere il ridimensionamento dell'intero schermo.
PT

Ok, sembra la "salsa segreta" che stavo cercando. Controllerò e ti farò sapere, grazie.
ashes999,

0

Un modo per farlo è definire le proporzioni minime e le proporzioni massime per il tuo gioco. Questi saranno i rapporti che vuoi supportare. Quindi è necessario utilizzare un Viewport ora fornito in libGdx. Il viewport ridimensionerà il tuo mondo in base alle impostazioni fornite.

Esistono diversi tipi di viewport ed è necessario selezionare quello più appropriato per il proprio gioco.

È possibile utilizzare ExtendViewport per esempio e correggere l'altezza o la larghezza e calcolare l'altro. Quindi è necessario assicurarsi che tutta la grafica possa essere visualizzata nelle proporzioni minime. L'estensione viewport ridimensionerà la grafica secondo le proporzioni corrette senza distorcere la grafica. Tuttavia, ExtendViewport funziona aggiungendo spazio aggiuntivo al tuo mondo, quindi dovresti anche fornire grafica per sfondi, ad esempio che coprono l'intera estensione delle proporzioni coperte, quando il mondo è più piccolo delle proporzioni massime, la parte aggiuntiva della grafica non lo farà essere mostrato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.