3D-Space-Game-011.bb
;-------------------------------------------------------
;
; 3D Space Game Tutorial
;
; (C) by Turgut Frank Temucin alias TFT
;
; Alle Rechte verbleiben beim Autor. Die Veröffentlich-
; ung außerhalb des BlitzForums ist nur mit Genehmigung
; gestattet. Der Source-Code ist Freeware, und darf für den
; privaten Gebrauch frei verwendet werden.
;
;-------------------------------------------------------
; File: 3D-Space-Game-011
; Date: 29.07.03
;-------------------------------------------------------
; BB3D: 1.83
;-------------------------------------------------------
; Mein Dank an: Markus und Hot-Bit
;-------------------------------------------------------
;
; In diesem Teil werden wir ein wenig Ereignis-Steuerung
; hinein bringen. Nur so in der Gegend rumfliegen ist zwar
; ganz toll, aber bei weitem nicht ausreichend. Die Daten-
; Struktur für die Planeten-Location wird um einige Infos
; erweitert. Da die Anzahl Locations im allgemeinen recht
; niedrig sind, ermitteln wir einfach den definitiven
; Abstand zum Schiff und reagieren auf die Entfernungen
; die sich ergeben. Die Variable "location" enthält da-
; bei immer die Nummer der Aktuellen Lokation oder -1.
; Wenn das Schiff der Lokation zu nahe kommt, dann
; wird eine Gefahr-Warnung ausgegeben. Dazu dient die
; Funktion "monitor". Hier werden alle optischen Ausgaben
; gemacht, welche auf dem Bildschirm auszugeben sind. Die
; Funktion "auto_rotation" wird in Zukunft alle Dreh-Bewegungen
; aufnehmen. Wie z.B. die der Planeten.
;
; ------------------------------------------------------
;
; Als erstes werden ein paar Konstanten definiert. Diese
; sind unveränderbar und immer Global.
Const screen_x=640
Const screen_y=480
Const screen_m=2 ; Bildschirm Modus
; 2=Fenster 1=Fullscreen
Const screen_t=16; 16 Bit oder 32 Bit Bildschirm
Global hispeed ; Schalter-Variable. Zum Ein- und Aus-schalten
; der schnellen Geschwindigkeit.
;******
Global location ; enthält -1 oder die Nummer der Location in der
;sich das Schiff gerade befindet. Innerhalb
;der Location funktioniert kein High-Speed.
Global gefahr ;
Global tod ;
;******
; Dann wird der Bildschirm geöffnet
;
Graphics3D screen_x,screen_y,screen_t,screen_m ; Den Bildschirm öffnen
SetBuffer BackBuffer() ; das DoubleBuffering aktivieren
; Ein Object, welches mit DOGA L1 erstellt wurde, wird geladen
Global schiff=LoadMesh("schiff.x") ; Schiff-Object laden
PositionEntity schiff,0,0,0 ; Position beliebig
; Danach die Kamera- und Licht- Einstellungen
;
Global Cammera=CreateCamera(schiff) ; Ohne Kamera sieht man nichts
; und es wird an das Schiff angebunden
CameraRange cammera,1,600000 ; Sichtweite der Kamera anpassen
MoveEntity cammera,0,.5,-4 ; Da die Kamera mitten im Schiff liegt,
; wird sie etwas nach hinten verschoben.
CameraZoom cammera,2 ; Fischaugen korrigieren
Global plp=CreatePivot() ; Einen Sammel-Punkt für das verschieben des ganzen
; Systems anlegen
Global licht=CreateLight(2,plp) ; Für das richtige Ambiente muß eine ordentliche
; Lichtquelle her.
PositionEntity licht,80000,0,0 ; Licht positionieren
LightRange licht,100000 ; Reichweite des Lichtes
AmbientLight 100,100,100 ; Umgebungslicht verstärkt oder schwächt den Kontrast
; Die Sky-Box wird erstellt
;
Global skay=CreateSphere(12) ; Eine Kugel erstellen
Global skay_tex=LoadTexture("all.jpg") ; Die All-Textur laden
EntityTexture skay,skay_tex ; und dem Objekt zuweisen
ScaleEntity skay,500000,500000,500000 ; Den Weltraum vergrößern
FlipMesh skay ; Von innen sichtbar
EntityOrder skay,1 ; Immer als erstes darstellen
EntityFX skay,1 ; Kein Licht-Effekt für die Sky-Box
; Das Sonnen-System erzeugen
;
Restore planeten_system_daten
Dim pl(10) ; enthält die Handler der Planeten-Objecte
Dim plt(10) ; Zeiger auf Planeten-Textur
Dim plr#(10) ; Eigen-Rotation
;*******
;
Dim plsc(10) ; Speicher für Planeten-Location Durchmesser
; Für das Abschalten des High-Speed
Dim plg(10) ; Gefahrengrenze
Dim pld(10) ; Kollisions-Grenze (Game Over) für Planeten etc
;*******
Global anz_pl ; Anzahl der Planeten im System
i=0 ; Das erste Objekt ist die Sonne
Read anz_pl ; Anzahl Planeten ohne Sonne
Read t$,sc,x,y,z,r#,sch,scg,scd ; Objekt-Daten holen
plt(i)=LoadTexture(t$,2) ; Sonnen-Textur laden
pl(i)=CreateCube(plp) ; Objekt erzeugen
;*******
;
plsc(i)=sc+sch ; Location-Durchmesser
plg(i)=sc+scg ; Gefahren-Grenze
pld(i)=sc+scd ; Todes-Grenze
;*******
EntityTexture(pl(i),plt(i)) ; Textur aufbringen
EntityAlpha(pl(i),.9) ; Sonne etwas transparent machen
PositionEntity(pl(i),x,y,z) ; Im Raum positionieren
ScaleEntity(pl(i),sc,sc,1) ; Vergrößern
EntityFX pl(i),1 ; Kein Licht-Effekt für die Sonne
plr(i)=r ; Eigen-Rotation
; Jetzt werden die Planeten erzeugt und positioniert
;
For i=1To anz_pl
Read t$,sc,x,y,z,r,sch,scg,scd ; Objekt-Daten holen
pl(i)=CreateSphere(12,plp) ; Eine Kugel erstellen
plt(i)=LoadTexture(t$) ; Die Welt-Textur laden
plsc(i)=sc+sch ; Location-Durchmesser
plg(i)=sc+scg ; Gefahren-Grenze
pld(i)=sc+scd ; Todes-Grenze
EntityTexture pl(i),plt(i) ; und dem Objekt zuweisen
ScaleEntity pl(i),sc,sc,sc ; Den Planet vergrößern
PositionEntity pl(i),x,y,z ; Und vor die Kamera stellen
plr(i)=r ; Planeten-Rotation
Next
; Einige Dummy-Objekte werden erstellt