Programmieren auf verschiedenen Bildschirmauflösungen
Programmieren auf verschiedenen Bildschirmauflösungen
Ich möchte dem Benutzer ermöglichen ein Programm über verschiedene Bildschirmauflösungen auszuführen, z.b. ein Spiel. Wie können nun Buttons etc. relativ zueinander gleich plaziert werden?
Klar, man kann das alles relativ irgendwie plazieren, z.b. der erste Button ist bei ScreenWidth/15 der nächste bei ScreenWidth/13 oder so ^^ aber das ist doch irgendwie ziemlich umständlich. gibt es da eine bessere Möglichkeit für?
Klar, man kann das alles relativ irgendwie plazieren, z.b. der erste Button ist bei ScreenWidth/15 der nächste bei ScreenWidth/13 oder so ^^ aber das ist doch irgendwie ziemlich umständlich. gibt es da eine bessere Möglichkeit für?
PB-Version: 3.90
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Ich hab das ganz einfach gelöst bei meinem Schulprojekt.
Es gibt 2 Auflösungen:
1. Generell Bildschirmauflösung(z.B. 1024x768)
2. 2D Bildschirmauflösung(z.B. 800x600)
Nun wird die 2. Auflösung im endeffekt auf den ganzen Bildschirm nachher projeziert. So kann ich auch auf AntiAliasing hoffen und generell sieht es wenn die 1. Auflösung 320x200 ist immernoch annehmbar aus.
In PB weiß ich nicht wie man es mit dem Screen regeln würde. Man müsste einen 2. screen vorgaukeln.
Es gibt 2 Auflösungen:
1. Generell Bildschirmauflösung(z.B. 1024x768)
2. 2D Bildschirmauflösung(z.B. 800x600)
Nun wird die 2. Auflösung im endeffekt auf den ganzen Bildschirm nachher projeziert. So kann ich auch auf AntiAliasing hoffen und generell sieht es wenn die 1. Auflösung 320x200 ist immernoch annehmbar aus.
In PB weiß ich nicht wie man es mit dem Screen regeln würde. Man müsste einen 2. screen vorgaukeln.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
wenn du einzelne buttonleisten hast. z.b. eine links oben, eine an der unterkante ect., dann mußt du ja nicht unbedingt skalieren. es reicht dan ja auch, die ausgangskoordinaten für so einen bereich von den screen-/fenster-kanten abhängig zu machen.
macht aber nur sinn, wenn du nicht ein fenster voller knöppe benutzt, die über die ganze fläche verteilt sind.
macht aber nur sinn, wenn du nicht ein fenster voller knöppe benutzt, die über die ganze fläche verteilt sind.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
bei professionellen spielen sieht man das oft,
dass die bedienelemente eine feste größe in pixel haben,
dass nur der eigentliche game-screen größer oder kleiner wird.
die bedienelemente nehmen dann bei einer höheren auflösung eben weniger raum ein.
(das war ne ergänzung zu #NULL)
zu dem Vorschlag von Dede:
du hast die möglichkeit, einen windowedscreen über das
komplette fenster zu erstellen und mit autostretch zu versehen.
wenn du jetzt das fenster maximierst nimmt es die größe
des desktops an und damit tut dach auch der screen darin,
aber der wird gestretcht, rechnerisch hat er immer noch sein ursprüngliches format.
ABER
du scheinst eher in richtung Gadgets zu fragen.
bei den wenigsten spielen verwendet man wirklich Fensteroberflächen mit gadgets.
meistens verwendet man komplette spielfelder als screen,
bei dem die bedienelemente als sprites aufgebracht werden.
das liegt vor allem daran, dass die echten gadgets aufwendig manipuliert werden müssten,
um nicht in dem design zu erscheinen das der benutzer eingestellt hat.
da ist es einfacher, sie gleich innerhalb der screens zu implementieren.
man muss sowieso mausereignisse innerhalb der spieleoberfläche verarbeiten,
da ist man nicht drauf angewiesen, die ereignisse von gadgets zu verwenden.
dass die bedienelemente eine feste größe in pixel haben,
dass nur der eigentliche game-screen größer oder kleiner wird.
die bedienelemente nehmen dann bei einer höheren auflösung eben weniger raum ein.
(das war ne ergänzung zu #NULL)
zu dem Vorschlag von Dede:
du hast die möglichkeit, einen windowedscreen über das
komplette fenster zu erstellen und mit autostretch zu versehen.
wenn du jetzt das fenster maximierst nimmt es die größe
des desktops an und damit tut dach auch der screen darin,
aber der wird gestretcht, rechnerisch hat er immer noch sein ursprüngliches format.
ABER
du scheinst eher in richtung Gadgets zu fragen.
bei den wenigsten spielen verwendet man wirklich Fensteroberflächen mit gadgets.
meistens verwendet man komplette spielfelder als screen,
bei dem die bedienelemente als sprites aufgebracht werden.
das liegt vor allem daran, dass die echten gadgets aufwendig manipuliert werden müssten,
um nicht in dem design zu erscheinen das der benutzer eingestellt hat.
da ist es einfacher, sie gleich innerhalb der screens zu implementieren.
man muss sowieso mausereignisse innerhalb der spieleoberfläche verarbeiten,
da ist man nicht drauf angewiesen, die ereignisse von gadgets zu verwenden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Ich hab mir damals zwei Funktionen programmiert, eine getWidth() und getHeight(), denen übergebe ich dann z.B. einfach immer die Größe, die für meine Auflösung gelten würde, also z.B. wenn ich 1024x768 benutze und getWidth(80) aufrufe, wird mir auch 80 wieder direkt zurückgegeben. Wenn allerdings mit einer anderen Auflösung gearbeitet wird, rechnet mir die Funktion das einfach kurz auf den korrekten Wert um.
Nun kannst Du sämtliche Gadgets plazieren und anstatt fixer Werte einfach kurz die entsprechenden Funktionen aufrufen. Natürlich kannst Du statt Proceduren auch Macros verwenden, wenn es extrem um Geschwindigkeit gehen sollte (bei normalen GUIs aber eher nicht der Fall).
Eine andere Möglichkeit, die rein vom Prinzip her gleich arbeitet, wäre einfach als Parameter die Größe in % anzugeben. Also z.B. getWidth(25) würde Dir dann einfach 25% der aktuellen X-Auflösung zurückgeben.
EDIT: Das "umständliche" was Du beschreibst, also ScreenWidth/15 usw. ist im Prinzip ja nichts anderes, aber umständlich ist es nur, wenn Du dauernd wirklich ScreenWidth/15 angeben mußt. Sobald das in zwei hübsche Funktionen verpackt ist, ist es total sauber und logisch, und überhaupt nicht mehr umständlich
Nun kannst Du sämtliche Gadgets plazieren und anstatt fixer Werte einfach kurz die entsprechenden Funktionen aufrufen. Natürlich kannst Du statt Proceduren auch Macros verwenden, wenn es extrem um Geschwindigkeit gehen sollte (bei normalen GUIs aber eher nicht der Fall).
Eine andere Möglichkeit, die rein vom Prinzip her gleich arbeitet, wäre einfach als Parameter die Größe in % anzugeben. Also z.B. getWidth(25) würde Dir dann einfach 25% der aktuellen X-Auflösung zurückgeben.
EDIT: Das "umständliche" was Du beschreibst, also ScreenWidth/15 usw. ist im Prinzip ja nichts anderes, aber umständlich ist es nur, wenn Du dauernd wirklich ScreenWidth/15 angeben mußt. Sobald das in zwei hübsche Funktionen verpackt ist, ist es total sauber und logisch, und überhaupt nicht mehr umständlich



ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Für Gadgets wäre da Pure_Resize oder sowas. Der WiDe kann auch Fensterlayouts, aber leider kommt der nicht vorran.
Mit Java gehts viel einfacher, da gibts ganz viele Layouts (FlowLayout, ...).
Mit Java gehts viel einfacher, da gibts ganz viele Layouts (FlowLayout, ...).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Naja das Prinzip ist ja nicht anders. Ob Du da nun Gadgets benutzt oder Deine selbstgemachten Buttons in einem 2D-Screen plazieren willst, umrechnen mußt Du immer. Bei 3D wird quasi "automatisch" umgerechnet, also mal ganz salopp formuliert.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Nö, ich muss nichts umrechnen.ZeHa hat geschrieben:Naja das Prinzip ist ja nicht anders. Ob Du da nun Gadgets benutzt oder Deine selbstgemachten Buttons in einem 2D-Screen plazieren willst, umrechnen mußt Du immer.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Wenn Du keine fremde Lib benutzt sondern es selbst in die Hand nehmen willst, wird Dir aber nix anderes übrig bleiben.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.