Blitz2D: Fullscreen

Aus Wikibooks

Navigation: BlitzBasic >>> Blitz2D >>> Funktionen >>>> 2D-Grafik

Einleitung[Bearbeiten]

Eigentlich ist es sehr einfach, BlitzBasic im Fullscreen-Modus zu verwenden. Dazu braucht man nur in der Graphics-Anweisung für den Modus den Wert 1 verwenden (Graphics Breite%,Höhe%,Farbtiefe%,1).

Doch wenn die vom Progamm verwendete Auflösung auf dem Monitor des Programmierers gut funktioniert, heißt das noch lange nicht, dass dies bei jedem Anwender des Programms auch so gut funktioniert. Denn welche Auflösungen ein Anwender verwenden kann, ist sowohl von seiner Grafikkarte, als auch von seinem Monitor abhängig. In der blitzinternen (englischen) Beschreibung steht, das Auflösungen von 640x480 und 800x600 immer sicher funktionieren sollten, aber als bei implementierung der Graphics-Anweisung diese Beschreibung geschrieben wurde, hatten wohl noch alle Monitore ein Breite/Höhe-Verhältnis von 4:3 und seitdem wurde die Beschreibung nicht mehr angepasst. Inzwischen gibt es viele verschiedene Monitore mit unterschiedlichem Breite/Höhe-Verhältnis sowie viele verschiedene Grafikkarten, die unterschiedliche Grafikauflösungen darstellen können.

Auf Softwareverpackungen steht gewöhnlich nur eine erforderliche Windows- und DirectX-Version, sowie der erforderliche Grafik- und Festplattenspeicher. Wer sich jedoch einmal anhand dieser Angaben ein Programm gekauft hat und dann erst zu Hause feststellen konnte, dass das Programm auf dem eigenen 16:9-Monitor eine stark verzerrte Darstellung zeigt, die aber keine andere Einstellung ermöglicht, der weiss wie ärgerlich es ist, dass Software gewöhnlich vom Umtausch ausgeschlossen ist.

Andersherum ist es leicht vorstellbar, dass ein Programm, dass auf jedem Windows seit Win98 mit jedem DirectX ab DirectX7 lauffähig ist und auf jede beliebige Bildschirmauflösung anpassbar ist, deutlich mehr potenziell zufriedene Kunden erreichen kann, als ein Programm das hier starke Einschränkungen hat. Die Lauffähigkeit auf jedem Windows seit Win98 sowie die Funktionsfähigkeit ab DirectX7 bring BlitzBasic schon mit, und für die Anpassungen an verschiedene Bildschirmauflösungen gibt es entsprechende Funktionen, die man nur noch sinnvoll miteinander koordinieren(programmieren) muss.

Jedoch auch wenn man ein Programm nur für den privaten Gebrauch schreibt und je nach Bedarf um weitere Funktionen ergänzt, kann es durchaus sein das man irgendwann einmal eine andere Grafikkarte, oder einen anderen Monitor verwendet. Jedoch ein Programm später auf verschiedene Auflösungen anzupassen ist ungleich komplexer und fehleranfälliger, als ein Programm von Anfang an flexibel aufzubauen.

Die Grafikkarte[Bearbeiten]

Jeder Grafikkarte ist ein Treiber zugeordnet, daher kann man aus der Anzahl der Grafktreiber auch die Anzahl der Grafikkarten ermitteln. Die Funktion CountGfxDrivers() gibt die Anzahl der Grafiktreiber zurück. Der zurück gegebene Wert kann jedoch niemals 0 sein, auch wenn der PC keine Grafikkarte hat. Das liegt daran, das ein PC auch ohne Grafikkarte Grafik ausgeben kann. Die ersten PCs hatten auch noch keine Grafikkarte und konnten auch nur 16 verschiedene Farben auf einem Bildschirm mit 640x480 Punkten darstellen, doch das ist schon etliche Jahre her. Aber auch heute können PCs auch ohne Grafikkarte Grafik darstellen. Daher gibt es immer im PC einen Grafiktreiber, der keiner Grafikkarte zugeordnet ist. Daher gibt CountGfxDrivers bei einem PC mit Grafikkarte gewöhnlich den Wert 2 zurück. (trotzdem sollte man auf jeden Fall CountGfxDrivers aufrufen, denn es gibt auch PCs mit mehreren Grafikkarten)

Mit GfxDriverName(Index%) kann der Name eines Treibers/einer Grafikkarte ermittelt werden. GfxDriverName erfordert einen Integer-Parameter „Index“, der mindestens 1 und maximal der von CountGfxDrivers zurück gegebene Wert sein darf.

Mit SetGfxDriver(Index%) wird ein Treiber für weitere Abfragen ausgewählt. Auch SetGfxDriver erfordert einen Integer-Parameter „Index“, der mindestens 1 und maximal der von CountGfxDrivers zurück gegebene Wert sein darf.

Damit sollte es kein Problem sein, das nachfolgende kurze Programm zu verstehen, das in ähnlicher Form in der blitzinternen Hilfe als Beispiel zu den drei genannten Funktionen steht:

; GfxDriver-Beispiel
Local AnzahlTreiber%,Index%,Auswahl%

; Anzahl der Grafik-Treiber holen 
AnzahlTreiber=CountGfxDrivers()
If AnzahlTreiber=1 Then Auswahl=1 ;wenn nur ein Treiber, diesen auswählen und dadurch Schleife überspringen

While (Auswahl<1)Or(Auswahl>AnzahlTreiber) ;Schleife wiederholen bis zu einer zulässigen Auswahl
  Cls
  Locate 0,0
  Print "Wähle den zu verwendenden Treiber:" 

  ;für jeden Treiber Index und Name anzeigen  
  For Index = 1 To AnzahlTreiber 
    Print Index+") " + GfxDriverName(Index) 
  Next 

  ;Auf Benutzereingabe warten 
  Auswahl=Input("Welcher Treiber (1-"+AnzahlTreiber+") ? ") 
Wend

;Den gewählten Treiber für weitere Abfragen setzen! 
SetGfxDriver Auswahl
Print "Der Treiber "+Chr(34)+GfxDriverName(Auswahl)+Chr(34)+" wurde gesetzt!"

;Auf Maustaste warten und Programm beenden
Print "(Maustaste)"
WaitMouse
End

Die Bildschirmauflösungen[Bearbeiten]

Nachdem der Treiber ausgewählt wurde, kann man mit CountGFXModes() die Anzahl der zulässigen Bildschirmauflösungen ermitteln. Aus jedem „GfxMode“ kann mit GfxModeWidth(Index%), GfxModeHeight(Index%) und GfxModeDepth(Index%) die Breite, Höhe und Farbtiefe ausgelesen werden, wobei der Integer-Parameter „Index“, wieder mindestens 1 und maximal der von CountGFXModes zurück gegebene Wert sein darf. Die blitzinterne Hilfe bietet zu den genannten Funktionen wieder ein Beispiel-Programm, dass ähnlich dem folgendem Programm ist:

;GFXMode-Beispiel
Local AnzahlModes%,Index%,AusgabeZeile$
AnzahlModes=CountGFXModes() 

;zu allen Modes Breite, Höhe und Farbtiefe auflisten
Print "Folgende Grafik-Modes sind verfügbar:" 

For Index = 1 To AnzahlModes
  AusgabeZeile="Auflösung: "+GfxModeWidth(Index)
  AusgabeZeile=AusgabeZeile+"x"+GfxModeHeight(Index)
  AusgabeZeile=AusgabeZeile+" ("+GfxModeDepth(Index)+" Bit)"
  Print AusgabeZeile
Next

;Auf Maustaste warten und Programm beenden
Print "(Maustaste)"
WaitMouse
End

Diese Liste kann jedoch recht lang werden, daher ist es sinnvoll, die Werte erst zu speichern und nach Farbtiefe und Seitenverhältnis zu filtern.

Das Seitenverhältnis[Bearbeiten]

Unter Seitenverhältnis (englisch „aspectratio“, oft auch nur als „ratio“ bezeichnet) versteht man das Verhältnis der Breite zur Höhe des angezegten Bildbereichs. Dabei wird sowohl die Breite in Pixeln, als auch die Höhe in Pixeln so oft durch die gleiche ganze Zahl geteilt, bis beide Werte noch einen ganzzahligen Wert haben, aber nicht mehr ohne Rest durch die gleiche Zahl geteilt werden können. Als mögliche Teiler verwendet man gewöhnlich die Primzahlen, die unter 20 liegen, da höhere Teiler extrem selten vorkommen.

Diese Definition kann man direkt in eine eigene Funktion umsetzen: (die nach Verständnis des Kapitels Grundwissen leicht verständlich sein sollte)

;"GetRatio"
;In: Breit (Integer,erforderlich) Breite des Screen
;In: Hoch (Integer,erforderlich) Höhe des Screen
;Out: (String) Seitenverhältnis im Format "B:H"
Function GetRatio$(Breit%,Hoch%)
  Local Fertig%,Teiler%
  Repeat
    If Teiler
      Breit=Breit/Teiler
      Hoch=Hoch/Teiler
    EndIf
    Select True
      Case (Breit Mod 2 =0)And(Hoch Mod 2 =0):Teiler=2
      Case (Breit Mod 3 =0)And(Hoch Mod 3 =0):Teiler=3
      Case (Breit Mod 5 =0)And(Hoch Mod 5 =0):Teiler=5
      Case (Breit Mod 7 =0)And(Hoch Mod 7 =0):Teiler=7
      Case (Breit Mod 11 =0)And(Hoch Mod 11 =0):Teiler=11
      Case (Breit Mod 13 =0)And(Hoch Mod 13 =0):Teiler=13
      Case (Breit Mod 17 =0)And(Hoch Mod 17 =0):Teiler=17
      Case (Breit Mod 19 =0)And(Hoch Mod 19 =0):Teiler=19
      Default Fertig=True
    End Select
  Until Fertig
  Return Str(Breit)+":"+Str(Hoch)
End Function