Programm automatisch mit der richtigen Auflösung starten

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

 

Pitje Puck

Betreff: Programm automatisch mit der richtigen Auflösung starten

BeitragDi, März 04, 2008 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Da es immer wichtiger wird 16zu9 und 16zu10 Auflösungen zu unterstützen, und dennoch der "alten" 4zu3 Auflösung gerecht zu werden, habe ich mir mal Gedanken gemacht wie man das Seitenverhältnis ohne DLLs herausfinden kann. Im Forum hatte ich keine passende Lösung gefunden. Hier meine Lösung zur Unterscheidung, welche der im Programm berücksichtigten Versionen gestartet werden soll:
Code: [AUSKLAPPEN]

Graphics3D 0,0, 0, 1 ; Blitzbasic übernimmt automatisch die Desktop einstellungen fürs Vollbild
x#=  GraphicsWidth() ; Weite des Blitzfensters
y#=  GraphicsHeight() ; Höhe des Blitzfensters

If x/y >1.4 Then  ; Ergebnis von 4:3 Verhältnis ergibt 1,333 und von z.B 16:10 ergibt 1,6
   EndGraphics
   screenx = 1280: screeny = 800
   x_offset= 40  ; Variable die für die später notwendige positionierung der Grafiken Notwendig ist
Else
   EndGraphics
   screenx = 1024: screeny = 768
   x_offset = 0
 EndIf
Graphics3D screenx, screeny ,32,1 ; passenden Graphikmodus setzen
SetBuffer BackBuffer()


Jetzt könnte man natürlich noch mehr Auflöungen unterstützen, indem man die 4:3 und die 16:10 Versionen des Programms zoomt:
Code: [AUSKLAPPEN]

Graphics 1024,768 ,0,1               ;feste Auflöung setzen
Graphics screenx,screeny,0,3   ; Blitzfenster auf z.B. 1152:864 zoomen

Hoffe ich konnte helfen!

Markus2

BeitragDi, März 04, 2008 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Beispiel ist falsch weil du nicht prüfst ob die Auflösung existiert ! Rolling Eyes

Eigentlich sollte es schei* egal sein was man für ne Auflösung benutzt.
Das Programm muß sich daran anpassen .

Es gibt eine Auflistung der Modi .
Der Anwender sollte die Auflösung wählen können .

Den Offset den du z.B. benutzt kann man auch ausrechnen !?
 

ChristianK

BeitragDi, März 04, 2008 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Und außerdem bekommst du die Bildschirmgröße auch über die WinAPI -> GetSystemMetrics.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Pitje Puck

BeitragMi, März 05, 2008 3:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@ChristianK
Es ging ja darum es ohne WinApi zu machen, wie ich es in der Einleitung gesagt habe.

@Markus2
Ich versteh nicht ganz was du mit "falsch" meinst. Bei mir klappt es auf vier verschiedenen PCs mit jeder Auflösung größer als 1024:768 bisher sehr gut.
Zitat:

Eigentlich sollte es schei* egal sein was man für ne Auflösung benutzt.
Das Programm muß sich daran anpassen.

Darum geht es ja!? Jedoch macht es das in vielen Fällen nicht von alleine. Damit es sich nicht verzerrt wenn man eine Auflösung mit einem anderen Seitenverhältnis hat, kann ich endweder vor dem Programm eine Auswahl erstellen, mit der Winapi die Auflösung erkennen, oder so wie vorgeschlagen das Selbe tun. An eine andere Auflösung (nicht Seitenverhältnis) kann man es ja dann mit dem Graphikmodus "3" anpassen.
Oder denk ich total falsch?
Zitat:

Den Offset den du z.B. benutzt kann man auch ausrechnen !?

Das stimmt. Aber da ich nur drei (gibt es mehr?) Seitenverhälnisse (nicht Auflösungen) unterstützen will ist das in dem Fall egal. Warum soll ich es ausrechnen wenn ich nur 3 brauche? Der rest wird ja gezoomt.
Zitat:

Der Anwender sollte die Auflösung wählen können .

Kannst du ja gerne machen. Es geht wie du erkennen kannst darum, genau das zu umgehen bzw. erst im Spiel einstellen zu können.

Vielleicht liegt es ja an mir, aber ich verstehe deinen Einwand nicht. Würde mich freuen wenn du es etwas genauer erläutern würdest, wie du das Seitenverhältnisproblem löst. Man lernt ja immer dazu. Wink
 

ChristianK

BeitragMi, März 05, 2008 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Du sagtest, dass du es ohne DLL machen willst. Ich dache, du meinst damit eine speziell dafür geschriebene. Allerdings verstehe ich trotzdem nicht, warum du keine WinAPI-Funktion verwenden willst. Dein Beispiel ist nicht gerade performant, weil zuerst ein Fenster erstellt wird, dann wird noch DirectX gestartet, nur um die Bildschirmgröße festzustellen. Ziemlich Verschwendung, wenn du mich fragst. Wink
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
  • Zuletzt bearbeitet von ChristianK am Mi, März 05, 2008 20:21, insgesamt einmal bearbeitet

Markus2

BeitragMi, März 05, 2008 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@Pitje Puck

wenn mein (alter PC) nur 640x480 kann stellst du irgendwas ein
und dazu noch in 32 Bit ohne zu wissen ob 32 Bit unterstützt wird .

1280 x 800 ist unüblich , eher 1280x1024

Egal welche Auflösung ich einstelle , die Pixel bleiben Viereckig (1:1) und
wenn das nicht so ist , ist der Monitor verstellt .

Wenn man z.B. ein Hintergrundbild aufspannt auf die Fenster größe die man
eingestellt hat wird das natürlich verzerrt dargestellt aber das ist eigene Dummheit .

Bei den LCDs bietet es sich an die Desktop Auflösung zu nehmen
weil auf manchen LCDs das Bild sonnst doof angezeigt wird .

Wenn der Anfang falsch ist mache ich mir keine Gedanken darüber was
danach passieren kann Wink


Mal angucken :
Code: [AUSKLAPPEN]
 CountGFXModes()/GfxModeWidth/GfxModeHeight/GfxModeDepth example

intModes=CountGfxModes()

Print "There are " + intModes + "graphic modes available:"

; Display all modes including width, height, and color depth
For t = 1 To intModes
Print "Mode " + t + ":
Print "Width=" + GfxModeWidth(t)
Print "Height=" + GfxModeHeight(t)
Print "Height=" + GfxModeDepth(t)
Next
 

Marek

BeitragMi, März 05, 2008 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe den Sinn des ganzen nicht Confused Durch Graphics3D 0,0, 0, 1 bekommt man schon automatisch die Auflösung des Desktops, die der Benutzer sowieso selbst bestimmt und damit auch dem entsprechen sollte, was er auch im Spiel einstellen wird...
und wenn er eine niedrigere Auflösung haben will, muss er das sowieso über eine Liste auswählen, da führt auf lang oder kurz kein Weg dran vorbei...

von daher...

MfG Marek
Wer lesen kann ist klar im Vorteil...
 

Pitje Puck

BeitragDo, März 06, 2008 1:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@ChristianK
Auch ich benutzte gerne deine Messageviewer.dll. Ich finde DLLs gar nicht so schlimm. Es war nur ein Versuch das Ganze ohne zu lösen, also auch ohne WinAPI. An die Performance habe ich noch gar nicht gedacht. Dann ist die WinAPI wohl doch eleganter,

@Marek
Das stimmt. Dennoch will ich mein Spiel nicht an 46 Grafikmodi (Ergebnis nach Markus2s Code) anpassen. Deshalb möchte ich nur das aktuelle Seitenverhälnis herauskriegen (bsp. im 1. Quelltext) und dann soz. Zoomen (2. Quelltext). Dadurch brauche ich dann nur noch zwei Verionen was Offset und/oder Skalierung betrifft.

@Markus2
So ganz verstehe ich deine Einwände immer noch nicht Laughing .
Deine 680:480 Pixel könnte man ja trotzdem unterstützen. Die oben gewählten Auflösung sind ja nur beispielhaft für eine 16:10 und eine 4:3 Auflösung.Die Bitzahl, da hast du recht, sollte natürlich auch variabel sein.
Zitat:
1280 x 800 ist unüblich , eher 1280x1024

Meines Wissens eher umgekehrt. Die fast viereckigen Monitore neigen sich dem Ende ihrer Laufbahn endgegen. Was Fernseher betrifft werden die Panel schon gar nicht mehr hergestellt.

Zitat:
Egal welche Auflösung ich einstelle , die Pixel bleiben Viereckig (1:1) und
wenn das nicht so ist , ist der Monitor verstellt .

Trotzdem muss ich sowohl einen Offset berücksichtigen (bei anderen Seitenverhälnissen), als auch meine Grafiken oder das ganze Fenster skalieren(bei anderen Auflösungen)

Zitat:
Wenn man z.B. ein Hintergrundbild aufspannt auf die Fenster größe die man
eingestellt hat wird das natürlich verzerrt dargestellt aber das ist eigene Dummheit .

Statt nur von "Dummheit" könntest du einmal von deiner Lösung sprechen.Wenn ich ein nicht-tilebares Hintergrundsbild habe, z.B. in 800:600er Größe, und möchte dieses ohne Ränder ohne Verzerrung und ohne etwas Abzuschneiden bei 16:9 benutzen, muss ich vorher die Seitenverhältnisse kennen, um eine andere Version des Bildes zu laden. Dabei hilft mir deine Lösung leider nicht, die von ChistianK natürlich schon, aber dazu später.

Zitat:
Bei den LCDs bietet es sich an die Desktop Auflösung zu nehmen
weil auf manchen LCDs das Bild sonnst doof angezeigt wird .

Zugegeben passt mein Überschrift dazu nicht, aber bei meinem Beispiel geht es explizit um die Seitenverhältnisse, nicht um die Auflösung und auch nicht um die Bitzahl. Natürlich stimmt es, dass wenn der Monitor das Bild skaliert wird, wird das Bild schwammig. Dies sollte natürlich auch berücksichtigt werden. Mein Problem noch einmal auf den Punkt gebracht:
wie kann ich ohne DLLs zu benutzen, die Seitenverhältnisse des Users erkennen?

jetzt aber mal zu deinem Beispiel:
Das ist glaube ich der Knackpunkt unseres Missverständnisses. Mit GfxMode und Co. bekomme ich leider nur die von der Grafikkarte unterstützten Modi, wobei es sich ja leider sowohl um 16:9 und 4:3 Seitenverhältnisse handelt. Man weiss also immer noch nichts, um das Problem zu lösen.[/quote]

Silver_Knee

BeitragDo, März 06, 2008 9:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein 800 600er Bild und möchte es ohne Verzerrung auf 1280 1024 darstellen:

1) ich mach MidImage und Positioniere es mit hilfe von GraphicsWidth und GraphicsHeight in der Mitte. Das gibt dann nen Schwarzen Rand aber damit muss man dann wohl leben. Ergebnis Keine Verzerrung.

2) Ich Scale das ding beim y auf Graphicsheight und bei x auf GraphicsHeight()*4/3 somit erzwinge ih dann ein Seitenverhältnis 4:3 bei 16:9 ist dann links und rechts halt etwas Rand....

Bei der 2. Methode empfiehlt sich ein 1600*900er bild:
...y auf GraphicsHeight() und bei x auf GraphicsHeight()*16/9....
Dann steht bei 4:3 der Rand einfach über da muss ich beim Design halt drauf achten dass die Ränder nicht sooo wichtig sind...

Zu der Sache Optimieren auf Bildschirmgröße:warum machst dus nicht wie bei Windows: höherer Graphikmodus -> kleinere Bildchen.... Mit GraphicsWidth()-Breite kann man Rects/Ovals/Images/etc auch Rechts (und mit Height unten...) an den Bildschirmrand Kleben..... stell dir mal vor so ne hyper high end Grafikkarte mit nem Hyper high end Monitor unterstützt deine Grafikmodi nicht mehr weil sie zu Grobkörnig sind...

oder Anders herum: dein spiel benutzt 1280*1024 aber meine Graka is jetzt net so guuut... sie wird überlastet und ich kann nicht auf nen kleineren Modus schalten weil mein bildschirm halt nur 16:9 macht und eben nicht mehr 4:3 oder 16:10 und deinem PRog fehelen die alternativen....das ding empfehle ich keinem weiter mit der begründung "des hackt voll und man kanns net runterstellen"....
 

Pitje Puck

BeitragDo, März 06, 2008 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@Silver_Knee
Estmal Danke für deine Lösung.

zu 1.):
Was ist MidImage? Embarassed Hört sich interessant an. Ist das irgend ne bestimmte Technik oder ein Befehl den mein B3d nicht hat? Bitte um Aufklärung.

zu 2.):
Bisher habe ich es auch immer mit Rand gemacht. Mittlerweile haben aber so viele nen Breitbildmonitor und immer noch genug einen 4:3 Monitor, dass ich dachte es wäre mal nett beides zu unterstützen.

Zitat:
warum machst dus nicht wie bei Windows: höherer Graphikmodus -> kleinere Bildchen

Weil Windows die Möglichkeit bietet dabei die Schriftgröße zu ändern. Bei meinem Projekt handelt es sich um ein Wordgame. Habe es mal auf nem 22"er mit 1680x1050 probiert und die Buchstabentiles waren schon sehr schlecht zu lesen.

Zu deiner Performancesorge: Wie ist das eigendlich wenn ich mit graphicsmode 3 die Grafik hoch oder runter skaliere. Übernimmt die Blitzengine die Arbeit oder Windows?

Zu deiner schlechten Graka: Wie schon vorher erwähnt sind die Auflösungen nur die nativen für das Spiel. Deswegen gibt es noch den zweiten Quelltextschnipsel, weil das Spiel schon noch an die Auflösung des Computers angepasst werden soll. Bei 16:9 und 16:10 ist der Unterschied so gering, dass ich mich dazu entschieden habe nur eines im Spiel zu berücksichtigen, und erst im zweiten Schritt die zum Monitor passende Auflösung zu erzwingen. Um den Sinn oder Unsinn dises Vorgehens zu beurteilen, wäre die Frage zur Performancesorge wichtig.

Eingeproggt

BeitragDo, März 06, 2008 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit MidImage ist vlt ql:MidHandle gemeint?

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Markus2

BeitragDo, März 06, 2008 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@Pitje Puck
das du nach Width/Height ein passendes Bild lädst ist schon ok .
Und wenn es mal nicht passen sollte machen die meisten bei dem Rand
irgendein geschnörkel hin .

Dem Benutzer nur gewisse Auflösungen zu erlauben ist nicht so toll .
Also im Ergebniss darf der Benutzer alle Auflösungen nehmen wo er meint
das die gut ausssehen und desswegen meinte ich ja das es schei* egal
ist wie breit und wie hoch das Fenster ist .

Es geht auch nicht darum welche Monitore gerade modern sind,
wichtig ist das dein Spiel mit jedem Monitor geht .

Silver_Knee

BeitragDo, März 06, 2008 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
oh da ist mir ein fehler unterlaufen "MidHandle Image" genau... Graphicsmodus 3 war mei mir meistens zum Kotzen lahm.... gerade dann wenn am ende ne große zahl rauskommt...
 

Pitje Puck

BeitragDo, März 06, 2008 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@Markus2
Zitat:
Es geht auch nicht darum welche Monitore gerade modern sind,
wichtig ist das dein Spiel mit jedem Monitor geht.

Hätte auch meine Antwort sein können. Du hast mit den "unüblichen Auflösungen" angefangen.

Zitat:
Dem Benutzer nur gewisse Auflösungen zu erlauben ist nicht so toll.

Wie schon erwähnt: Kann er ja im Spiel verstellen. Wurde in der letzten Antwort an dich ergeklärt.

Zitat:
..machen die meisten bei dem Rand
irgendein geschnörkel hin.

Vielleicht bei einem Spiel für Freunde oder nem Prototyp, bei nem vernünftigen Spiel kommt mir so was immer wie mangelnde Qualität vor. Habe grade mal 3 Bigfishgames probiert. Bei allen dreien wird bei 16:10 einfach verzerrt. Auch nicht so schön.

Irgendwie ging dieser Post an unserer bisherigen Diskussion echt vorbei. Dinge bei denen ich nur auf deine Kritiken eingegangen bin, werden umgedreht und mir wieder vorgelegt. Auf die Feststellung das dein Lösungsvorschlag gar nix bringt, gehst du nicht ein, stattdessen bringst du wieder die gleiche Kritik wie in deiner Antwort davor. Krieg das nicht in den falschen Hals, ich freue mich über dein reges Interesse und würde die Kritik auch gerne verstehen. Rolling Eyes


@Silver_Knee
Das würde schon alles gut funktionieren, doch verschwinden einige Element meines Spiels häufiger mal am Rand. Wenn das Hintergrundsbild kleiner ist sollten die dann auch an der Stelle verschwinden. Sonst hat man das Gefühl man sehe etwas was man nicht sehen soll, wie z.B eine Mikrofonangel in nem Kinofilm. Smile
Aller Aufwand das zu umgehen wäre größer als einfach verschiedene Bilder zu laden.

Markus2

BeitragDo, März 06, 2008 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
@Pitje Puck
ich habe versucht dir zu erklären das man eine Auflösung nicht erfindet
sondern gefälligst prüft ob das System die überhaupt darstellen kann .
Und das hast du oben immer noch nicht korrigiert .
Da wir ja der gleichen Meinung sind das der Benutzer eine Auflösung
frei wählen kann (also eine die gut passen würde) ist das oben eigentlich Humbug bzw. unvollständig .
Verzerrte Bilder mag ich auch überhaupt nicht .

Die Funk. Loadimage könnte man schlauer machen und je nach
Fenster Größe andere Unterordner nehmen .
 

Pitje Puck

BeitragDo, März 06, 2008 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ok. Jetzt hab ichs Markus. Das sind Punkte auf die wir uns einigen können. Ich habe in unserer Disskusion gelernt die Dinge hier ein wenig vollständiger und nicht ganz so exemplarisch hereinzustellen.
Wenn ich jetzt also vor habe, dass Spiel direkt im Volbild zu starten und erst im Spiel selbst die Auswahl der Auflösungen zu ermöglichen. sollte ich meine GraphicsWidth und GraphicsHeight auch für die Auflösung verwenden, da deine Abfrage der Graphikmodi leider nur die Graka berücksichtigt, und es dadurch zur schlechten Darstellung bei nicht nativen Auflösungen des TFTs kommt. Dann sind wir uns ja einig! Wink

Markus2

BeitragFr, März 07, 2008 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@Pitje Puck
die Auflösung des Desktops kann man ja trotzdem als bevorzugte
anbieten bzw. würde ich die Auflösungen die gut zum Spiel passen
markieren mit z.B. nen Stern oder Smile oder so .
Also nach dem Motto if desktop or 16:9 then Smile

Angelo

BeitragMi, Aug 20, 2008 3:44
Antworten mit Zitat
Benutzer-Profile anzeigen
hm ich würde einfach ein menufenster am anfang öffnen, 640x480 16bit.
Das einfachste wäre dann noch ein menu mit Auflösungs einstellungen und einen startbutton bzw.
speicherbutton.
Beim nächsten start einfach die speicherdatei abfragen und das spiel startet in der auflösung.
wenn die einstellung nicht unterstützt wird dann kann man noch ein savestart einrichten.

ihr macht euch ja probleme.
Alles was ich sagen kann, können auch andere ^^

Markus2

BeitragMi, Aug 20, 2008 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@Angelo
das steht hier in FAQ und Tutorials
und war schon Monate erledigt Wink
Ich hatte als erster Einwände mehr nicht .

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group