der Einfachheit halber nehmen wir an, dass ich ein einfaches Pong-Klon-Spiel für Android mache. Nehmen wir an, dass es nur im Landscape-Modus spielbar wäre. (Ignoriere gerade quadratische Telefone.)
Ich möchte, dass das Spiel auf jedem Telefon im selben Maßstab aussieht, in dem Maße, dass wenn du einen Screenshot des Spiels auf dem QVGA-Handy machst und den Screenshot auf WVGA-Größe skaliert, würde er fast genauso aussehen würde das Spiel auf WVGA-Telefon aussehen. Mit anderen Worten, die Paddelbreite sollte immer 1/32 der Bildschirmbreite betragen, der Balldurchmesser sollte immer 1/16 der Bildschirmbreite betragen.
Was wäre der richtige Weg, um die Anwendung zu malen? Es würde in Standard-SurfaceView laufen, das auf ein Canvas
gezeichnet würde.
Nehmen wir an, dass ich hochauflösende PNGs für Paddel, Ball und für die Spielschrift (Anzeigetafel, Hauptmenü) habe.
Ermitteln Sie die physikalische Auflösung, skalieren Sie dann Canvas
via scale(float sx, float sy)
, damit alle meine Canvases (auf QVGA und WVGA) die gleiche virtuelle Auflösung haben, und zeichnen Sie dann genau die gleiche Primitive auf jeder Position auf jeder Bildschirmgröße?
Oder kann ich dichteunabhängige Pixel (Dip) irgendwie im Canvas verwenden?
Ich habe nur einmal mit den Draw-Canvas-Funktionen gespielt und dann alle auf opengl geschaltet, aber die Logik bleibt (denke ich) gleich.
erste Frage, die Sie wollen ein Verhältnis konstant von einem Telefon zum anderen halten. In meiner App füge ich einen "schwarzen Band" -Effekt auf jeder Seite hinzu. In onSurfaceChanged möchten Sie ein Verhältnis berechnen. Mit diesem Verhältnis können Sie bestimmen, wie viel Speicherplatz auf jeder Seite entfernt werden muss, um einen konsistenten Aspekt in Ihrer Zeichnung zu erhalten. Dadurch erhalten Sie ein Delta X oder Y für alle Ihre Draws Der folgende Code ist etwas, das ich aus der ogl-Version übernommen habe, so dass es eventuell etwas getweetet werden muss.
%Vor%Dann möchten Sie auch in der Lage sein, Ihre Bilder auf der Leinwand zu zeichnen, indem Sie dort auch Größe auf der Leinwand als dort reale Größe kennen und das, wo der Unterschied zwischen image.getWidth () (tatsächliche Größe des Bildes ) und eine image.getScaledWidth (Leinwand), die Ihnen die Größe des Elements in dp gibt, was bedeutet, wie groß es auf dem Bildschirm erscheinen wird) ist wichtig. schau dir das Beispiel unten an.
%Vor%Dies sollte alle Cross Platformen Ihres Verhältnisproblems lösen Ich würde opengl vorschlagen, weil es Ihr Bedürfnis nach einem konstanten Aspekt vereinfachen wird, aber ich denke, es ist keine Option ^^
Hoffe das hilft dir genug
Ich denke, dass es nur 3 Standardauflösungen gibt (ldip, mdip, hdip) und Sie sollten einen Ressourcenordner für jeden von ihnen haben.
Wenn Sie Ihre PNGs manuell an jede der drei verfügbaren Auflösungen anpassen, sollte das Telefon den spezifischen Ressourcenordner auf transparente Weise laden
Tags und Links android android-canvas resolution