3D-Space-Game-012.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-012
; Date: 29.07.03
;-------------------------------------------------------
; BB3D: 1.83
;-------------------------------------------------------
; Mein Dank an: Markus und Hot-Bit
;-------------------------------------------------------
;
; Als nächstes werden wir Locations einbinden, die keine
; Planeten sind. Dies erfordert eine grundlegende Er-
; weiterung der Daten-Strukturen und Ereignis-Auswertung.
; Danach ändern wir in der Funktion "bewege_schiff" den
; gesamten Geschwindigkeits- und Steuer-Teil. Die Aufteilung
; in zwei Sektoren zur Bewegungs-Steuerung hat sich als
; unnötig erwiesen, da die Berechnung nicht merklich dadurch
; beschleunigt wird. Nun wird generell nicht das Schiff,
; sondern das gesamte Universum bewegt. In älteren BB-
; Varianten hat das Pivot-System noch nicht so richtig funktioniert.
; Daher kann es sein, daß es nicht richtig funktioniert,
; wenn eine andere Version als 1.83 verwendet wird.
; Sollte dies so sein, bitte ich um Infos.
;
; ------------------------------------------------------
;
; 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 Double-Buffering aktivieren
; Ein Objekt, welches mit DOGA L1 erstellt wurde, wird geladen
Global schiff=LoadMesh("schiff.x") ; Schiff-Objekt 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 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) ; Gefahren-Grenze
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(12,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
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() ; Objekte, welche sich um die eigene Achse drehen, aktualisieren
bewege_schiff() ; Funktions-Aufruf für die Schiffs-Bewegung
RenderWorld ; Bild berechnen und zeichnen
monitor() ; Zur Kontrolle bestimmter Werte
Flip 1 ; Seite wechseln
Until KeyHit(1) ; Abrechen, wenn ESC gedrückt
; Und zum Schluß das Ende
;
End