Allgemeine Fragen zur grafischen Darstellung

ui_3k1

ui_3k1

Gesperrt
197
Hallo,
mich interessiert wie man Grafiken (einfache einfarbige Rechtecke) am besten auf einem Hintergrund (Canvas) darstellt.
Ziel ist es unabhängig von Displaygrößen und pixeldichte immer ein extrem homogenes Ergebnis zu bekommen. Mit homogen meine ich wirklich auf den pixel genau.
Mit getDensity() und "hochrechnen" komme ich nicht zu gewünschter Genauigkeit - so wie sich die Sache für mich aktuell darstellt ist es lediglich eine Annäherung, aber wie gesagt, eine Annäherung reicht mir nicht aus.
Ist es sinnvoll von vorne herein die Displayproportionen als fix zu setzen und ggf bei Differenzen beim größeren Display "abzuschneiden"? Was empfiehlt sich hier, was gibt es zu beachten?
Für jeden Hinweis bin ich dankbar.
 
Geht es dir darum, dass zwei Rechtecke, die nebeneinander sein sollen, einen Spalt zwischen sich haben können?

Dagegen könntest du das Folgende tun: Mach dir eine Bitmap mit fixer Grösse machen, male dort hinein und klatsche diese dann als Ganzes in den Canvas.
 
Ich versteh dein Problem nicht ganz.
Was meinst du mit homogen bzw pixel genau?

Du hast eigentlich nur 2 möglichkeiten entweder du nimmst Pixelmaße, dann ist das Bild auf verschiedenen großen Bildschirmen auch verschiedenen groß.
Oder du nimmst ein relatives maß dann Haben die Bilder verschiedene pixelgrößen erscheinen aber gleich groß.

Daher weiß ich nicht was du mit pixelgenau meinst.
 
Hallo, schon mal danke für die Hinweise.
Konkret geht es um Folgendes:
Ich habe ein Multiplayer Spiel mittlerweile soweit, dass auf zwei Geräten eine gemeinsame Spielfläche dargestellt wird (beide Geräte zeigen den gleichen Inhalt), wobei von jedem Gerät je eine Spielfigur (ein Rechteck) gesteuert wird.
Sprich, Spieler zwei sieht auf seinem Bildschirm, wenn sich Spieler eins bewegt und umgekehrt (Die eigene Bewegung sehen beide natürlich auch).
Derzeit funktioniert es "experimentell", also leider nicht so genau und flüssig, da ich bis dato zur einheitlichen Skalierung wenig implementiert habe. Das Multiplizieren (bzw Abgleichen) der Spielerpositionen und Bitmaps mittels Density bringt bei meinen Testgeräten nur Annäherungen.
Was den Datenaustausch zwischen den beiden Geräten angeht gibt es sicherlich ebenfalls Optimierungsmöglichkeiten (ggf entstehen hier auch schon Ungenauigkeiten), aber die einheitliche Skalierung wollte ich zu vorher einbauen.

Zu der Annäherung:
Gerät 1: Note 3 (1920x1080) Density: 3
Gerät 2: S2 (800x480) Density: 1.5
... Mit diesen Werten komme ich auf keinen grünen Zweig
 
ich würde jetzt mal vermuten, dass du dir ein eigenes koordinaten system für deine Spielfläche basteln musst.

Du wirst immer Geräte finden, die evtl sogar die gleiche Auflösung haben (beispielsweise 1920x1080) aber bei denen der Bildschirm minimal oder nur in eine richtung anders ist.
Also z.b. beide sind gleich hoch aber unterschiedlich breit.

Das wird dann dazu führen, dass der mit der höheren Auflösung evtl mehr vom Spielfeld sieht (aber das ist meine ich bei PC Spielen auch nicht anders, vorallem bei Strategiespielen.).

Wenn du nämlich mal hier liest:
Supporting Multiple Screens | Android Developers
steht da:
For simplicity, Android groups all actual screen sizes into four generalized sizes: small, normal, large, and extra large
Und:
For simplicity, Android groups all actual screen densities into four generalized densities: low, medium, high, and extra high.

Dazu kommt noch:
DisplayMetrics | Android Developers
This value does not exactly follow the real screen size (as given by xdpi and ydpi, but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi. For example, a 240x320 screen will have a density of 1 even if its width is 1.8", 1.3", etc. However, if the screen resolution is increased to 320x480 but the screen size remained 1.5"x2" then the density would be increased (probably to 1.5).
du könntest aber mit

public float xdpi
The exact physical pixels per inch of the screen in the X dimension.

public float ydpi
The exact physical pixels per inch of the screen in the Y dimension.

statt der density die echten dpi Werte nutzen und es damit versuchen.

Wenn also auf dem Display irgendas genau ein inch breit sein soll nimmst in pixel genau den Wert den dir xdpi zurück gibt (oder y.. ich weiß gerade nicht was die Breite und was die Höhe ist und ob sich die Werte ändern wenn man das Gerät dreht.)
 
  • Danke
Reaktionen: ui_3k1
Vielen Dank für die ausführliche Antwort, amfa. :)
Einen Vorteil sehe ich bei der "fixen / festen" Lösung noch...
Wenn alle Grafiken ins "reale" Maß (also in cm, mm, whatever) umgerechnet sind, sind alle weiteren variablen Abhängigkeiten ja nicht mehr wirklich variabel und auch evtl. entstehende Geschwindigsdifferenzen (bei Bewegungen, Schüssen, etc) im gleichen Zug verschwunden. Allerdings bleibt die Sache mit dem Bildschirmausschnitt.. Da es sich bei meinem Spiel um etwas eher "Arcarde-lastiges" handelt, wäre das schon ein krasser Vorteil für den mit der hohen Auflösung, wenn er mehr Spielfeld sieht bzw. ggf könnte er sich sogar in einem für den anderen unsichtbaren Bildabschnitt verstecken.

Egal wie ich es drehe und wende - auch wenn man den Bildschirmausschnitt croppt, ist es dann wiederum für den mit der hohen Auflösung ein Nachteil bzw. äußerst doof - irgendwo wäre ja mitten in seinem Screen das Feld zu Ende...

Hmm, der Unterschied zwischen meinen beiden Geräten ist halt GEWALTIG.


S2
s2_small.png


Note3
note3_small2.png




Ich denke ich werde meine aktuelle Lösung erst mal versuchen ordentlich zu verarbeiten was die Datenübermittlung ans andere Gerät angeht und dann vielleicht noch was an der Screens ändern.
Aktuell setze ich reinweg auf die Density und übergebe die Position relativ (also in Prozent) zur maximalen Bildschirmbreite / -höhe...
 
Zuletzt bearbeitet:

Ähnliche Themen

M
Antworten
2
Aufrufe
631
Mozart40
M
R
  • Gesperrt
  • roland-senior
Antworten
2
Aufrufe
799
Fulano
Fulano
A
Antworten
1
Aufrufe
585
swa00
swa00
Zurück
Oben Unten