Ho cercato di cercare una risposta e non riesco a trovarne uno (è un approccio abbastanza non convenzionale alla programmazione di un gioco per Android, quindi è prevedibile, almeno penso).Ridimensionamento di SurfaceView fisso per il riempimento verticale e mantenimento delle proporzioni
Sto provando a creare un gioco RPG in stile GBA su Android (per la nostalgia). OpenGL non era abbastanza buono per me perché non era abbastanza personalizzabile nel ciclo di gioco (voglio solo disegnare per essere chiamato quando c'è qualcosa che deve essere disegnato, dal momento che voglio che questo gioco sia super efficiente nel modo in cui usa la batteria, il che significa renderlo più simile a un'app di polling che a un gioco). Ho creato una vista di superficie personalizzata con il proprio thread che viene chiamato ogni volta che si deve eseguire il disegno (l'ho modellato dopo il gioco Android di esempio LunarLander nell'SDK).
Il fatto è che voglio che il gioco stesso abbia una dimensione fissa (208x160) e quindi riduca le dimensioni dello schermo. Il problema che sto riscontrando è che non sembra esserci comunque lo stesso all'interno dei normali parametri del SurfaceView esteso in XML. Il gioco nel suo stato attuale è illustrato di seguito. Sto provando a farlo allungare all'altezza dello schermo e mantenere il rapporto sulla larghezza, pur non aggiungendo al gioco visibile (mantenendolo fisso, indipendentemente dalle dimensioni dello schermo).
http://i.stack.imgur.com/EWIdE.png (stavo per pubblicare l'immagine reale in linea. Prevenzione spam mi può mordere>. <)
Attualmente mi sto tela del SurfaceView e disegnando direttamente ad esso, e fornendo la mia taglia come una dimensione pixel hard-coded (208px, 160px).
Ecco come si presenta attualmente il thread per ottenere il disegno e il disegno su di esso. Quale sarebbe un modo migliore per disegnare su una tela senza cambiare le dimensioni che voglio che il gioco prenda praticamente?
@Override
public void run()
{
Canvas c = null;
try
{
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder)
{
draw(c);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (c != null)
surfaceHolder.unlockCanvasAndPost(c);
}
}
Il metodo draw è questo (StringBuilder è il mio proprio oggetto codificato nel motore):
public void draw(Canvas canvas)
{
canvas.drawColor(Color.GRAY);
StringBuilder stringBuilder = new StringBuilder(canvas, Color.BLACK, letters);
stringBuilder.drawString("Oh, hello there!");
stringBuilder.setLocation(10, 20);
stringBuilder.drawString("Why am I so small?");
}
Tutte le idee?
Hai considerato di ridimensionare la tua tela per adattarla a 'SurfaceView'? –
@ K-ballo La tela proviene dallo stesso SurfaceView .... chiamando run() (che è il metodo di esecuzione del thread) crea una tela e quindi imposta la tela su SurfaceHolder, che quindi blocca la tela, quindi disegno ad esso e poi sbloccare e postare alla vista quando fatto. A meno che non legga il codice originale dal campione LunarLander sbagliato ... – TheAssailant
Quindi ...? Non puoi semplicemente chiamare 'scale' su di esso? –