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 ; Darstellungs- Probleme. Im nächsten Teil werden ; wir versuchen, diesen Probs zuleibe zu rücken. ; ; -> Weiter mit 3D-Space-Game-010.bb
Created on 20.08.2005
Zurueck