3D-Space-Game-014.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-014
; Date: 30.07.03
;-------------------------------------------------------
; BB3D: 1.83
;-------------------------------------------------------
; Mein Dank an: Markus und Hot-Bit
;-------------------------------------------------------
;
; Da die Kollisions-Abfrage Kugel/Poligon recht Zeit-
; intensiv ist, müssen wir dafür sorgen, daß die Abfrage
; nur dann aktiv ist, wenn die Gefahren-Grenze erreicht
; ist. Dazu muß die DATA-Section erweitert werden.
; Zudem machen wir etwas für die Synchronisation. Dazu
; einige Theoretische Infos. Eine Sekunde hat 1000 Milli-
; sekunden. Daraus ergibt sich bei 30 Bildern pro Sekunde
; das pro Frame 33 ms zur Verfügung stehen. Das ist natürlich
; nur Theorie. Außerdem werden wir Portale einführen.
; Diese benutzt man, um z.B. das Eintreten in die Station
; oder das Transferieren in andere Lokation zu realisieren.
; Das Grund-Problem dabei ist aber die Positionierung.
; Da jeder seine eigene Station gebastelt hat, muß ich es so
; drehen, daß die Positionierung transparent erfolgt.
; Dazu erzeugen wir eine Kugel und positionieren sie so,
; daß sie sich am Eingang der Hangar-Schleuse befindet.
; Die Kugel sollte sich zur Hälfte in der Schleuse befinden.
; Die Ereignis-Steuerung und die Data-Zone werden entsprechend
; angepaßt.
; ------------------------------------------------------
;
; 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 ;
Global t2,t3,c1 ; Timing-Anzeige für Monitor-Funktion
; 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-Objekt laden
PositionEntity schiff,0,0,0 ; Position beliebig
EntityType schiff,1 ; Kollisions-Type
EntityRadius schiff,1 ; Kollisions-Radius
; 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/Lokation Durchmesser
; Für das Abschalten des High-Sped
Dim plg(10) ; Gefahren-Grenze
Dim pld(10) ; Kollisions-Grenze (Game Over) für Planeten etc...
;******
;
Dim pln(10) ; Sortier-Nummer der Planeten/Objekte, damit
; eine Identifikation im Ereignis-Fall möglich ist
;******
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,n ; 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)) ; Station-Objekt laden
PositionEntity station,x,y,z ; Position beliebig
EntityType station,2
Else If ty=3
;******
;
pl(i)=CreateSphere(5)
ScaleEntity pl(i),sc,sc,sc
PositionEntity pl(i),x,y,z
EntityType pl(i),3
EntityRadius pl(i),sc
;