3D-Space-Game-009.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-009
; Date: 26.07.03
;-------------------------------------------------------
; BB3D: 1.83
;-------------------------------------------------------
; Mein dank an: Markus und HotBit
;-------------------------------------------------------
;
; Diejenigen von euch, die genau hinschauen, werden be-
; merken, daß die Lichtverhältnisse für die SkyBox nicht
; richtig sind. Auch die Hell/Dunkel- Abstufung ist etwas
; dünn. Die Befehle AmbientLight und EntityFx helfen.
; Außerdem werden wir eine Sonne basteln damit die
; Licht- Effekte so richtig zur Geltung kommen. Dazu
; müßt ihr euch eine Textur suchen, die dafür geeignet
; scheint. Versucht einfach einige. Wichtig ist auf
; jeden Fall, daß die Sonne an der richtigen Stelle po-
; sitioniert wird. Und immer brav in Richtung Schiff
; zeigt.
;
; ------------------------------------------------------
;
; 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
; 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,500000 ; 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 licht=CreateLight(2) ; Für das richtige Ambiente muß eine ordentliche
; Lichtquelle her.
;******
PositionEntity licht,80000,0,0 ; Licht positionieren
LightRange licht,200000 ; Reichweite des Lichtes
AmbientLight 10,10,10 ; Umgebungslicht verstärkt oder schwächt den Kontrast
; Die Sonne erzeugen
;
Global sonne=LoadTexture("sonne.jpg",2) ; Sonnen-Textur laden
Global son=CreateCube() ; Objekt erzeugen
;
; Sicherlich könnte man die Sonne auch als Kugel
; oder als Sprite darstellen. Aber ich möchte nicht
; mit zu vielen Befehlen die User verwirren. Wer möchte,
; kann ja Alternativen coden.
EntityTexture(son,sonne) ; Textur aufbringen
EntityAlpha(son,.9) ; Sonne etwas transparent machen
PositionEntity(son,80000,0,0) ; Im Raum positionieren
ScaleEntity(son,10000,10000,1) ; Vergrößern
EntityFX son,1 ; Kein Licht-Effekt für die Sonne
;******
; Jetzt wird ein Objekt erzeugt und positioniert
;
Global ball=CreateSphere(12) ; Eine Kugel erstellen
Global tex=LoadTexture("welt.jpg") ; Die Welt-Textur laden
EntityTexture ball,tex ; und dem Objekt zuweisen
ScaleEntity ball,1000,1000,1000 ; Den Planet vergrößern
PositionEntity ball,0,0,4003 ; Und vor die Kamera stellen
; Die SkyBox 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,100000,100000,100000 ; 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 SkyBox
;******
; Nun kommt der Main Loop
;
Repeat
TurnEntity ball,0,.1,0 ; Das Objekt wird bewegt/gedreht
bewege_schiff() ; Funktions-aufruf für die Schiffs-bewegung
RenderWorld ; Bild berechnen und zeichnen
Flip 1 ; Seite wechseln
Until KeyHit(1) ; Abrechen, wenn ESC gedrückt
; Und zum Schluß das Ende
;
End ; Alles beenden
Function bewege_schiff()
Local MSF#=10
If KeyDown(200) ; Taste Pfeil auf
TurnEntity schiff,.4,0,0
Else If KeyDown(208) ; Taste Pfeil ab
TurnEntity schiff,-.4,0,0
Else If KeyDown(205) ; Taste rechts
TurnEntity schiff,0,-.4,0
Else If KeyDown(203) ; Taste links
TurnEntity schiff,0,.4,0
EndIf
If KeyDown(17) ; Taste W
MoveEntity schiff,0,0,MSF
Else If KeyDown(31) ; Taste S
MoveEntity schiff,0,0,-MSF
EndIf
If KeyDown(30) ; Taste A
TurnEntity schiff,0,0,.2
Else If KeyDown(32) ; Taste D
TurnEntity schiff,0,0,-.2
EndIf
PositionEntity skay,EntityX(schiff),EntityY(schiff),EntityZ(schiff)
;******
PointEntity son,schiff ; Sonne zeigt immer in Richtung Schiff
;******
End Function
; ------------------------------------------------------
;
; Wenn ihr eine Weile durch unseren Weltraum düst,
; wird euch auffallen, daß das Schiff, je weiter es sich
; vom Startpunkt wegbewegt, immer mehr zu wackeln beginnt.
; Das hat mich am Anfang schier zum Wahnsinn getrieben.
; Die Größen-ordnungen, mit denen man es im Welraum zu
; tun bekommt, sind eindeutig mit BB nicht ohne Tricks
; zu bewältigen. 32 bit Fließkomma-berechnungen haben
; ihre Grenzen. Je größer die Zahlen desto größer die Un-
; genauigkeit. Erschwerend kommt hinzu, daß das Z-Buffering
; nur mit 16 Bit arbeitet. Das verursacht gelegentlich