3D-Space-Game-013.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-013
; Date: 30.07.03
;-------------------------------------------------------
; BB3D: 1.83
;-------------------------------------------------------
; Mein Dank an: Markus und Hot-Bit
;-------------------------------------------------------
;
; Da das BB-Kollision-System nicht so konkret sicher
; funktioniert, mußte die Schiff-Bewegung wieder in 2
; Teile aufgeteilt werden. Die Bewegung des gesamten Universums,
; inklusive Kollisions-Abfrage funktioniert nicht. Das hängt
; mit dem Pivot-System zusammen, in Verbindung mit der
; Kollisions-Listen-Erzeugung. Aber da wir ja bereits ein
; Zwei-Ebenen-Bewegungs-System hatten, übernehmen wir
; es einfach wieder. Schaut euch die Erläuterungen der
; Deutschen Hilfe zu den Kollisions-Befehlen an. Um das
; Ganze ein bißchen besser sehen zu können, führen wir
; noch eine Kamera-Drehung um das Schiff ein. STRG +
; Pfeil Taste rechts/links.
;
; ------------------------------------------------------
;
; 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 Lokation in der
;sich das Schiff gerade befindet. Innerhalb
;der Lokation 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 Double-Buffering 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
;******
;
EntityType schiff,1
EntityRadius schiff,1
;
;******
; Danach die Kamera- und Licht- Einstellungen
;
;******
;
Global cammerap=CreatePivot(schiff) ; Drehpunkt für Außenansicht
Global Cammera=CreateCamera(cammerap) ; 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() ; Ein 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 Objekte
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-Sped
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
For i=0To anz_pl
Read t$,sc,x,y,z,r#,sch,scg,scd,ty ; Objekt-Daten holen
If ty=0 ; Erzeuge Sonne
plt(i)=LoadTexture(t$,2) ; Sonnen-Textur laden
pl(i)=CreateCube(plp) ; Objekt erzeugen
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
Else If ty=1 ; erzeuge Planeten
pl(i)=CreateSphere(16,plp) ; Eine Kugel erstellen
plt(i)=LoadTexture(t$) ; Die Welt-Textur laden
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
Else If ty=2 ; erzeuge Stationen
pl(i)=CreatePivot(plp)
station=LoadMesh("station.x",pl(i)) ; Schiff-Objekt laden
PositionEntity station,x,y,z ; Position beliebig
;*******
;
EntityType station,2
;
;*******
EndIf
plsc(i)=sc+sch ; Location-Durchmesser
plg(i)=sc+scg ; Gefahren-Grenze
pld(i)=sc+scd ; Todes-Grenze
plr(i)=r ; Planeten-Rotation
Next
; Nun kommt der Main Loop
;
Repeat
auto_rotation()