| |
|
|
| ← zurück zur OGL-Tutorialübersicht ogl->tutorial
[head]Einleitung[/head] Hallo Freunde des XProfan-OpenGL,
dies ist ein Versuch der Implementierung von Tutorials in die OnlineDoku.
Die OnlineDoku ist daher besonders geeignet da Mitglieder beliebig mitmischen, korrigieren und erweitern können.
In diesem Kapitel widme ich mich lediglich der Herstellung eines OpenGL-Fensters das später zur Anzeige von Objekten dienen soll.
Hier geht es nicht darum ogl ("init"... mit seinen Parametern zu erklären.
Anfangs sollte man sich für eine Variante entscheiden:
? Erzeugung <a href='#full'>Vollbild-Gamescreen</a> wie bei redcube ? Erzeugung <a href='#win'>Fenster-Gamescreens</a> ? Erzeugung <a href='#gdi'>Fenster mit OGL-Anzeigebereich neben GDI-Controls</a> wie z.B. bei okrea
Trotzdem einfach mal vorab ein Minisource welcher OpenGL einfach erzeugt und einen Cuboiden zeigt:
cls
ogl("init",%hwnd,0.0,0.0,0.0,1)
ogl("clear")
ogl("origin",0,0,-10)
ogl("cuboid",1,1,1)
ogl("show")
waitinput
end
[head]>full Vollbild-Gamescreen erzeugen[/head] Ein Vollbild-Gamescreen erzeugen ist die leichteste aller Übungen, birgt aber dennoch die Tücke wegen der Anzeigeproportionalität.
Wer es ganz einfach möchte erzeugt also zuerst ein Hauptfenster %hwnd und initialisiert einfach darauf das OGL. Das funktioniert so:
Jenachdem welche Auflösung am Computer eingestellt ist wird hiernach ein gröstmögliches Fenster erzeugt und OpenGL darauf initialisiert.
Jetzt kann es aber sein das die Auflösung nicht typisch 4/3 ist - das heist - das die Y-Auflösung z.B. nicht wie bei 640x480 oder 1024x768 genau das Dreiviertel der X-Auflösung ist. Auch die neuen TFT-Bildschirme kommen gerne mit sehr unterschiedlichen Auflösungen daher - wie z.B. 1280x768 oder 1280x1024.
Das XProfanOpenGL-Anzeigefenster skaliert sich jedoch nicht unproportional was zur Folge hat das z.B. links und rechts ein schwarzer Rand entstehen kann. Wenn (%maxx /4*3)<%maxy ist entsteht oben und unten ein Rand, andernfalls entsteht der Rand links und rechts.
Der möglicherweise entstehende Rand ist insofern problematisch da der Rand trotzdem zum Zeichnen von OpenGL verwendet wird. Das Anbringen z.B. von einem Cockpit ginge also nicht da entweder das Cockpit nicht vollständig zu sehen ist oder "unterhalb" vom Cockpit ein Rand entsteht bei dem z.B. die Strasse/Land zu sehen wäre. Der Rand muss also weg!
Bedienen wir uns also eines Tricks wenn wir die Bildschirmauflösung nicht ändern wollen. Wir gehen jetzt mal davon aus das die Y-Auflösung grösser sein kann als %maxx /4*3. Umgekehrt ists seltener der Fall - kann aber genauso vorkommen!
Wir erzeugen einfach ein zweites Fenster unterhalb von %hwnd was den ganzen Bildschirm ausfüllt, und legen ein in der Größe angepasstes (4/3Proportional!) %hwnd einfach darüber.
windowstyle 80'Fenster ohne jeden Schnickschnack
var bgwin&=createwindow(0,"",0,0,%maxx,%maxy)'auf Desktop ein Hintergrundfenster erzeugen
enablewindow bgwin&,0'deaktivieren wir es damit ein Klick das Fenster noch weniger tangiert
window 0,0 - maxx,maxy/4*3
setwindowpos hwnd%=0,((maxy-(maxx/4*3))/2) - maxx,maxx/4*3;-1'hwnd in Bildschirmmitte verrücken und in den Vordergrund holen.
ogl("init",%hwnd,0,0,0,1)
waitinput
ogl("done")
end
Natürlich kann man nun dem bgwin& z.B. eine Farbe verpassen. Hierzu kann man einfach startpaint nutzen:
Mehr dazu später...
[head]>win Fenster-Gamescreen erzeugen[/head] Wie auch beim Vollbild-Gamescreen müssen wir auf die Proportionalität vom OGL-Anzeigebereich achten. Der innere Bereich von %hwnd sollte also 4/3 sein.
Hierbei können wir uns folgende kleine Prozedur zunutze machen:
An diese Prozedur können wir Höhe und Breite übergeben und das %hwnd wird auf diese Maße angepasst.
Erzeugen wir also zunächst ein Fenster und passen die Größe auf Proportionalität an:
Hierdrauf nun den OpenGL-Anzeigebereich initialisieren:
und das wars auch schon. Natürlich sollte man per windowstyle dafür sorgen das entweder a) ein Vergrössern/Verkleinern/Skalieren des %hwnd nicht möglich ist oder b) nach Erkennung einer Skalierung vom %hwnd erneut setinnersize wie oben aufrufen.
Mehr dazu später...
[head]>gdi OGL-Anzeigebereich neben GDI-Controls erzeugen[/head] Dies ist sicherlich eine der schlimmsten Aufgaben denn die Position und Größe des OGL-Anzeigebereiches können wir nicht bestimmen. Der OGL-Anzeigebereich füllt immer den kompletten Parent aus und nimmt seine Ausmaße an.
Hierbei müssen wir also den OGL-Anzeigebereich auf ein anderes Control statt auf das %hwnd legen.
Nach viel Herumprobiererei mit okrea kann ich von etwas Erfahrung berichten das hierzu am Besten ein Control genutzt wird was mit dieser Funktion erstellt wird:
proc createChildWindowAsStatic
parameters h&,s$,x&,y&,xx&,yy&
declare ws&
h&=create("ChildWindow",h&,s$,x&,y&,xx&,yy&)'child erzeugen
'titelbar und rahmen entfernen | setwindowlonggedöns
ws&=GetWindowLongA(h&,-16) - $C00000 - $40000
SetWindowLongA(h&,-16,ws&)
return h&
endproc
Wir erzeugen also zuerst das Hauptfenster %hwnd :
erzeugen dann unser OGL-Child:
und initialisieren nun hierdrauf unseren OGL-Anzeigebereich:
fertig. Jetzt können wir einfach mit setwindowpos das Control ogl.child& positionieren und damit auch unseren OGL-Anzeigebereich. Nach Positionierung von ogl.child& sollte auch immer ein ogl("Show") erfolgen da hier kein automatisches Neuzeichnen von Statten geht.
Mehr dazu später...
|
|
|
| |
|
|