Ich habe versucht, nach einer Antwort zu suchen und finde sie nicht (es ist ein ziemlich unkonventioneller Ansatz, ein Android-Spiel zu programmieren, also ist zu erwarten, zumindest denke ich).Skalierung eines fixierten SurfaceView, um vertikal zu füllen und das Seitenverhältnis beizubehalten
Ich versuche, ein GBA-Stil RPG-Spiel in Android (für die Nostalgie) zu erstellen. OpenGL war nicht gut genug für mich, weil es in der Spielschleife nicht anpassbar genug war (ich möchte nur, dass etwas aufgerufen wird, wenn etwas gezeichnet werden muss, da ich möchte, dass dieses Spiel in der Art und Weise wie es verwendet wird sehr effizient ist) die Batterie, was bedeutet, dass es eher wie eine Poll-App als ein Spiel zu handeln). Ich habe eine eigene Oberflächenansicht mit einem eigenen Thread erstellt, der immer aufgerufen wird, wenn eine Zeichnung erstellt werden muss (ich habe sie nach dem Beispiel-LunarLander android-Spiel im SDK modelliert).
Die Sache ist, ich möchte das Spiel selbst eine feste Größe (208x160) und dann auf die Größe des Bildschirms skalieren. Das Problem, das ich habe, scheint es nicht zu sein, dies aus den normalen Parametern des erweiterten SurfaceView in XML heraus zu tun. Das Spiel in seinem aktuellen Zustand ist unten dargestellt. Ich versuche, es auf die Höhe des Bildschirms zu strecken und das Verhältnis auf der Breite beizubehalten, während es auch nicht zum sichtbaren Spiel hinzugefügt wird (es wird unabhängig von der Bildschirmgröße beibehalten).
http://i.stack.imgur.com/EWIdE.png (ich würde das eigentliche Bild in-line posten. Spam Prävention kann mich beißen>. <)
derzeit der Surface der Leinwand Ich bin immer und direkt mit ihm zeichnen, und meine Größe liefert als eine hartcodierte Pixeldimension (208px, 160px).
So sieht der Thread derzeit aus, wenn Sie die Zeichenfläche und die Zeichnung dorthin ziehen. Was wäre eine bessere Möglichkeit, auf eine Leinwand zu zeichnen, ohne die Größe zu verändern, die das Spiel virtuell aufnehmen soll?
@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);
}
}
Das Draw-Verfahren ist dies (String mein eigenes codiertes Objekt im Motor ist):
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?");
}
Irgendwelche Ideen?
Haben Sie darüber nachgedacht, Ihre Arbeitsfläche so zu skalieren, dass sie der "SurfaceView" entspricht? –
@ K-ballo Der Canvas kommt von der SurfaceView selbst .... Aufruf von run() (was die Laufmethode des Threads ist) erstellt einen Canvas und setzt dann den Canvas auf den SurfaceHolder, der dann den Canvas sperrt, den ich dann zeichne dazu und dann entsperren und post auf die Ansicht, wenn Sie fertig sind. Es sei denn, ich lese den Originalcode aus dem LunarLander Probe falsch ... – TheAssailant
Also ...? Kann man nicht einfach 'scale' drauf ansprechen? –