Kostik's Kurs - Erste Schritte1

Einführung

Ich bin ein erfahrener Blitz2D (das normale BlitzBasic) Programmierer, deshalb dachte ich dass die Umstellung auf Blitz3D überhaupt kein Problem wäre. Und ich hatte fast recht! Blitz3D fordert eine andere Art zu denken, aber wenn man es begriffen hat, ist es genauso einfach wie mit Blitz2D.

Nun, nur weil die Sprache so einfach ist, bedeutet das noch lange nicht, dass das Spiele-programmieren so einfach wird... außer man programmiert nur in 2D. 3D Spiele zu machen erfordert viel mehr Arbeit im grafischen Bereich. Ein Beispiel: wo man einfach nur flache Bilder für 2D Spiele macht, muss man für 3D Spiele komplette 3D Modelle (auch genannt "Meshes"=Drahtgitter-modell) erstellen.

Aber wenn man sich erst daran gewöhnt, merkt man dass es nicht sehr viel komplizierter ist und es macht eigentlich auch sehr viel Spaß. Zumindest macht es mir Spaß!

Jetzt fangen wir mal damit an, ein sehr einfaches Programm zu erstellen. Das wird dir eine Ahnung geben, wie deine Blitz3D Programme später aussehen werden.

Ein einfaches Programm in Blitz3D

(Anmerk. v. Konstantin: Dieses Tutorial erfordert gewisse Grundkenntnisse mit BlitzBasic2D, man muss wissen was sowohl "Doublebuffering" als auch die Befehle Flip usw. bedeuten)

Das folgende Programm zeigt einfach einen drehenden Zylinder auf dem Bildschirm.

;Als erstes müssen wir den 3D Bildschirmmodus setzen.
;Ich benutze hier eine Auflösung von 640x480
GRAPHICS3D 640,480

;Zweitens, genau wie in Blitz2D,
;benutzen wir den "Double-Buffer"
SETBUFFER BACKBUFFER()

;Nun brauchen wir eine Kamera
camera = CREATECAMERA()

;und wir stellen die Kamera so ein, dass sie auf
;dem ganzen Bildschirm angezeigt wird
CAMERAVIEWPORT camera,0,0,GRAPHICSWIDTH(),GRAPHICSHEIGHT()

;Jetzt erstellen wir einen Zylinder, damit wir
;überhaupt irgendwas auf dem Bildschirm haben
GLOBAL cylinder=CREATECYLINDER(6)

;Bewegen des Zylinders nach vorne,
;damit er sichtbar wird
MOVEENTITY cylinder,0,0,5

;Eine Schleife bis die "ESC"-Taste gedrückt wird.
WHILE NOT KEYHIT(1)

;Drehen unseres Zylinders in alle Richtungen
TURNENTITY cylinder,1,1,1

;Die Animationen aktualisieren und
;Kollision abfragen
UPDATEWORLD

;Rendern der erstellten Welt auf den Bildschirm
RENDERWORLD

;Jetzt müssen wir den Buffer "flippen"
;(näheres dazu siehe "Flip" in der BB-Befehlsliste)
FLIP

WEND ;Ende der While-Schleife

Nun, wenn du schon Erfahrung mit Blitz2D hast, siehst du einige schon bekannte Befehle. Wenn nicht, musst du dir erst mal ein Blitz2D-Tutorial "reinziehen".

Im Folgenden werde ich einzelne Teile des Codes herausnehmen und sie näher erläutern. Ich werde nicht alle Befehle erklären, denn die sind schon in den Blitz2D Tutorials sehr gut beschrieben. Ich werde nur die Blitz3D Befehle herauspicken. Auf geht's...:

GRAPHICS3D 640,480

Der Graphics3D Befehl sagt Blitz3D, dass man bereit ist um das 3D Grafik System zu starten. Man kann verschiedene Auflösungen als Argumente benutzen, aber das Programm wird abstürzen, wenn deine Grafikkarte und/oder die Treiber die gewünschte Auflösung nicht unterstützen.

camera = CREATECAMERA()

Eine Kamera ist nötig um die 3D-Elemente (Entity's) benutzen zu können. Der beste Weg sich das Kamera-Entity (Entity=Ding, Sache) zu verstehen ist, sich vorzustellen dass deine Augen eine Kamera ist. Wenn du dich umschaust, siehst du Dinge in 3D. Jetzt stell dir vor du hast eine coole Szene "gemalt", aber du hast keine Kamera (Augen) eingebaut um das alles zu sehen...was würdest du sehen? Nichts.

Warum braucht man in 2D kein Kamera-"Ding"? Eigentlich braucht man sie, nur muss man sie nicht positionieren. Weil 2D eine ebene Fläche ist, die sich über den ganzen Bildschirm erstreckt, die Kamera ist sozusagen immer auf dem selben Platz. Wenn du schon mal ein 3D Spiel gespielt hast, weist du, dass man sich umdrehen kann und sehen was hinter dir ist, oder nach oben schauen, oder sogar eine Taste drücken und deinen Helden von einem anderen Winkel anschauen. Das ist weil man in 3D die Position, Ort und den Winkel ändern kann. Das ist wirklich eine coole Sache :-)

CAMERAVIEWPORT camera,0,0,GRAPHICSWIDTH(),GRAPHICSHEIGHT()

Da wir nun eine Kamera eingebaut haben, müssen wir Blitz3D sagen, wo wir es (auf dem Bildschirm) "setzen" wollen. Mit dem CameraViewport Befehl habe ich einfach die Kamera auf die volle Bildschirmgröße gesetzt. Es ist fast wie unsere Standard 2D Kamera. Die ersten zwei Nummern 0,0, sind die x,y Koordinaten für die linke obere Ecke der Kamera. Dann benutze ich die GraphicsWidth() und GraphicsHeight() Befehle (die die aktuelle Auflösung zurückgeben(...)) um zu sagen wie Breit und wie hoch die Kamera sein soll. Ändere den Befehl so:

CAMERAVIEWPORT camera,100,100,440,280

...und starte das Programm wieder. Du wirst sehen dass dein Viewport ziemlich kleiner geworden ist! Spiele damit etwas rum um zu sehen was man damit machen kann.

GLOBAL cylinder=CREATECYLINDER(6)

Damit man auf dem Bildschirm etwas sehen kann, habe ich entschieden einen Zylinder zu erstellen. Ich hätte mich auch für einen Quader oder eine Kugel entscheiden können, aber ich mochte eben den Zylinder. Die "6" die in den Klammern steht, sagt Blitz3D, wie viele "Segmente" der Zylinder unterteilt werden soll. Ein Segment ist ein Dreieck (=Polygon). Wenn man eine Gruppe von Polygonen aneinander reiht, kann man die verschiedensten gestalten erstellen. Es ist schwer, das zu glauben, aber versuch es und du wirst sehen, dass es wahr ist. je mehr Segmente man benutzt, desto glätter wird die Figur. Aber Vorsicht, das bedeutet auch dass dein Programm umso langsamer arbeiten wird... und es kann sogar abstürzen. Nun, während ein Zylinder mit 100 Segmenten keine große Sache ist, können 1000 Zylinder mit 100 Segmenten es werden.

Um das besser zu verstehen, füge wie folgt den Wireframe Befehl zu dem Code über dem While-Befehl hinzu:

WIREFRAME 1

Das zeigt das Drahtgitter-Modell der aktuellen 3D-Welt (einige Grafikkarten und/oder Treiber arbeiten nicht korrekt mit diesem Befehl!). Ändere nun die Anzahl der Segmente in dem Befehl CreateCylinder und schau was passiert.

TURNENTITY cylinder,1,1,1

Das ist ein lustiger Befehl! TurnEntity ist eines der nützlichsten Befehle. Warum? ganz einfach, du willst eine lebendige Welt und der einzige Weg sie lebendig zu machen, ist, die Dinge zu drehen und zu bewegen und so. Der TurnEntity Befehl (zu deutsch: "Ding drehen") erlaubt das drehen jedes Objektes um alle 3 Achsen (x-,y-,z-Achse).

Probiert einfach einzeln um jede Achse zu drehen um zu sehen wie das aussehen kann. Blitz3D nennt das Drehen um die Achsen folgendermaßen:


(Diese drei Begriffe werden später bei anderen Befehlen gebraucht, also muss man das verstanden haben. Experimentiert mit dem Kegel etwas rum, ihr werdet schon sehen, was damit gemeint ist. Anm. von Konstantin)

UPDATEWORLD

Dieser Befehl ist ein Teil von Blitz3D, weil es dafür verantwortlich ist, alle Objekte (Entyty's=Dinge) in deiner Welt auf den neuesten Stand zu bringen. Wenn du also einen Jet, Wasser, Berge und ein Himmel hast, stellt dieser Befehl sicher dass alle Dinge die aktuellen Werte zugewiesen bekommen um dem Spieler den Eindruck eines Fluges zu vermitteln (kurz gesagt: Damit die Veränderungen an der Position, Winkel usw. den Objekten zugewiesen und aktualisiert werden. Anm. v. Konstantin). Natürlich, wenn man nichts bewegt, bleibt es auch ein starrer Bildschirm, aber wenn man anfängt Dinge zu bewegen, sorgt UpdateWorld dafür, dass sich alles auch tatsächlich bewegt.

RENDERWORLD

Eines der Dinge, die du viel in der 3D Welt zu hören bekommst, ist das Wort "rendern". Dieser Term bedeutet ganz einfach, dass das Zeug gemalt wird. Also wenn du diesen Jet, Wasser, Berge und den Himmel auf dem Bildschirm hast, muss Blitz3D diese Dinge "malen" (also, rendern), jedes einzelne Frame. Um das zu tun muss dieser Befehl benutzt werden.

(man muss also praktisch die folgenden 3 Befehle immer am Ende einer Hauptschleife einfügen, damit die Veränderungen an den Objekten auch sichtbar werden. Anm. v. Konstantin)

; ...der Code der Hauptschleife...
UPDATEWORLD
RENDERWORLD
FLIP
; ...Ende der Hauptschleife...


Weiter mit Kurs 2



Quelle: www.BlitzBasic.istcool.de