3D-Space-Game-010.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-010 ; Date: 28.07.03 ;------------------------------------------------------- ; BB3D: 1.83 ;------------------------------------------------------- ; Mein Dank an: Markus und HotBit ;------------------------------------------------------- ; ; Die Änderungen in diesem Part sind doch umfangreicher ; geworden, als ich dachte. Daher schaut euch den Code bitte ; genau an. Ich habe versucht, alle Zeilen die wichtig sind, ; zu kommentieren. Grundsätzlich habe ich die Bewegung ; des Schiffes in zwei Teile geteilt. Die Normal- und ; die HiSpeed- Geschwindigkeit. Die Normale ist voll beweglich, ; während die HiSpeed-Geschwindigkeit nur gerade aus ; funktioniert. Zur besseren Demonstration habe ich ; einige Planeten hinzugefügt. Und einige Dummy-Objekte. ; Letztere dienen der Größen-Orientierung. Wie im vorigen ; Part angesprochen, besteht das Problem in der Entfernung ; der großen Objekte. Um ein einigermaßen realistisches ; Aussehen des Sonnensystems zu erreichen, muß halt Raum da sein. ; Während bei Normal-Speed das Schiff bewegt wird, werden ; bei High-Speed alle Objekte verschoben. Um nicht jedes ; Objekt einzeln verschieben zu müssen, sind alle an ein ; Pivot Point gebunden. Dieser wird dann invers zur Schiffs- ; Bewegung positioniert. Um die Position der ersten ; Ebene wieder nach 0,0,0 zu bekommen. Dies wird langsam ; gemacht, um nicht ungewollte Ruck-Bewegungen zu be- ; kommen. Mit diesem Trick ist das Ruckeln des Schiffes ; bei großen Entfernungen Geschichte. Die normale Ge- ; schwindigkeit ist so klein, daß es eine ganze Weile ; dauert, bis das wackeln auftritt. Um den Spieler davon ; abzuhalten, lange in der Pampa herum zu irren, werden ; wir uns später was einfallen lassen. ; ------------------------------------------------------ ; ; 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. ; Dann wird der Bildschirm geöffnet ; Graphics3D screen_x,screen_y,screen_t,screen_m ; Den Bildschirm öffnen SetBuffer BackBuffer() ; das DoubleBuffering 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 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,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 SkyBox ; Das Sonnen-System erzeugen ; Restore planeten_system_daten Dim pl(10) ; enthält die Handler der Planeten Objekte Dim plt(10) ; Zeiger auf Planeten-Texture Dim plr#(10) ; Eigen-Rotation Global anz_pl ; Anzahl der Planeten im System i=0 ; Das erste Objekt ist die Sonne Read anz_pl ; Anzahl Planeten ohne Sonne Read t$,sc,x,y,z,r# ; Objekt-Daten holen 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 plr(i)=r ; Eigen-Rotation ; Jetzt werden die Planeten erzeugt und positioniert ; For i=1To anz_pl Read t$,sc,x,y,z,r ; Objekt-Daten holen 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 plr(i)=r ; Planeten-Rotation Next ; Einige Dummy-Objekte werden erstellt ; Dim obj(400) For i= 0To 400 obj(i)=CreateCube(plp) PositionEntity obj(i),Rnd(200)-100,Rnd(200)-100,Rnd(200)-100 ScaleEntity obj(i),1,1,1 EntityColor obj(i),$ff,$66,$66 Next ; Nun kommt der Main Loop ; Repeat For i= 1 To anz_pl TurnEntity pl(i),0,plr(i),0 ; Die Planeten-Drehung Next bewege_schiff() ; Funktions-Aufruf für die Schiffs-Bewegung RenderWorld ; Bild berechnen und zeichnen monitor() ; Zur Kontrolle bestimmter Werte Flip 1 ;