Michael Haar
Hallo,
ich habe ein 2D-Spiel portiert. Leider sind die Grafiken für 640x480 damals gemacht worden und müssen auch in derselben Form verwendet werden da keine Quelldaten mehr vorhanden sind.
Selbst mit Skalierung bleibt aber z.B. beim Milestone ein unschöner Rand weil die Aspect Ratio nicht "normal" ist. Außerdem wird das Spiel so auf schwacher Hardware (die scheinbar mit einem scale von 640x480 auf 480x320 oder gar 320x240 überfordert ist) extrem langsam.
Jemand schon Erfahrungen gemacht? Was getan? Vorschläge?
Du kannst entweder die Lösung mit Rand wählen, die Grafik verzerren (aspect ratio ändern), oder eine Lösung wählen die einen Teil der Grafik anzeigt und scrollt. Alles nicht optimal. Am optisch schönsten ist wahrscheinlich die Lösung die Grafik so anzupassen dass sie entweder die volle Höhe oder volle Breite des Screens füllt, und den verbleibenden schwarzen Rand nicht schwarz zu lassen sondern mit einem netten Muster oder Hintergrund zu füllen.
Michael Haar
Hier (http://forum.unity3d.com/threads/62257-Force-Screen-Resolution-480x320) schreibt jemand wenn ich das richtig verstehe die Hardware könne schneller skalieren als wenn ich das mit drawBitmap mit scale in meinem Code mache. Ich habe im Manifest auch die dort genannten Einträge aber das Spiel scheint trotzdem je nach Gerät einen unterschiedlich großen SurfaceView/Canvas zu bekommen.
<supports-screens android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="false"
android:anyDensity="false"/>
Die Lösung funktioniert so dass Deiner App eine mittlere Auflösung (320x480) vorgegaukelt wird, und das OS die von Deiner App in mittlerer Auflösung erstellten Grafiken dann auf das größere Telefondisplay skaliert. Das funktioniert eigentlich schon. Kann jetzt nicht sagen warum das bei Dir nicht klappt.
Bei Geräten die stark vom 320/480 Aspect Ratio abweichen wird dann um diese skalierte Darstellung aber auch ein schwarzer Rahmen gemacht. Dann hat Dein Spiel innerhalb der 320x480 Auflösung einen Rand, und die 320x480 Auflösung innerhalb des Geräts nochmal einen Rand.
Michael Haar
Bisher habe ich noch kein OpenGL benutzt - ist die Skalierung des fertigen 640x480 Screens dann schnell genug auch auf schwacher Hardware?
Ich würde in der Situation das folgende machen:
- Ermittle bei Programmstart (bzw. wenn Du die SurfaceView bekommst) die Canvas Größe
- Rechne Deine Quell-Grafiken zu diesem Zeitpunkt per Bitmap.CreateScaledBitmap() so um dass sie für die ermittelte Auflösung die perfekte Größe haben
- Verwende im Spiel dann diese vorskalierten Grafiken
- Fülle entstehende schwarze Ränder mit einem bunten Muster
Ich habe das z.B. bei einem
Vier Gewinnt Spiel genau so gemacht. Kannst Dir's wenn Du magst ja mal anschauen ob das für Dich ähnlich funktionieren würde.
Die Lösung hat den Vorteil dass während des Spiels dann gar nichts mehr skaliert werden muss, wodurch das Spiel wesentlich flotter läuft.
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.