He estado tratando de buscar una respuesta y parece que no puedo encontrarla (es un enfoque bastante poco convencional para programar un juego de Android, por lo que es de esperar, al menos creo).Escalando un SurfaceView fijo para llenarlo verticalmente y mantener la relación de aspecto
Estoy tratando de crear un juego de rol estilo GBA en Android (para la nostalgia). OpenGL no era lo suficientemente bueno para mí porque no era lo suficientemente personalizable en el ciclo del juego (solo quiero que se llame cuando haya que dibujar algo, ya que quiero que este juego sea súper eficiente en cuanto a su uso). la batería, lo que significa que actúa más como una aplicación de votación que como un juego). Creé una vista de superficie personalizada con su propio hilo que se llama cada vez que se necesita hacer un dibujo (lo modelé después del juego de Android LunarLander de muestra en el SDK).
La cuestión es que quiero que el juego tenga un tamaño fijo (208x160) y luego se amplíe hasta el tamaño de la pantalla. El problema que estoy teniendo no parece ser de todos modos hacerlo desde dentro de los parámetros normales del SurfaceView extendido en XML. El juego en su estado actual se ilustra a continuación. Estoy tratando de hacer que se extienda a la altura de la pantalla y mantener la proporción en el ancho, mientras que también no se agrega al juego visible (manteniéndolo fijo, independientemente del tamaño de la pantalla).
http://i.stack.imgur.com/EWIdE.png (que iba a publicar la imagen real en línea. Prevenir el uso abusivo puede morderme>. <)
Actualmente me estoy haciendo la lona del SurfaceView y dibujar directamente a él, y el suministro de mi tamaño que una dimensión de píxel codificada (208px, 160px).
Así es como se ve actualmente el hilo al obtener el lienzo y dibujarlo. ¿Cuál sería una mejor manera de dibujar en un lienzo sin cambiar el tamaño que quiero que el juego tome prácticamente?
@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);
}
}
El método draw es esto (StringBuilder es mi propio objeto codificado en el motor):
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?");
}
¿Alguna idea?
¿Ha considerado escalar su lienzo para adaptarse al 'SurfaceView'? –
@ K-ballo El lienzo proviene del SurfaceView en sí ... .... al ejecutar run() (que es el método de ejecución del subproceso) crea un lienzo y luego establece el lienzo en el SurfaceHolder, que luego bloquea el lienzo, luego dibujar a ella y luego desbloquear y publicar en la vista cuando haya terminado. A menos que haya leído el código original de la muestra de LunarLander incorrecto ... – TheAssailant
Entonces ...? ¿No puedes simplemente llamar 'scale' en él? –