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 ; Alles beenden Function bewege_schiff() Local MSF#,x1#,y1#,z1#,x2#,y2#,z2#,x3#,y3#,z3#,x4#,y4#,z4#,i If KeyHit(60) ; Taste F2 hispeed=Not hispeed ; Ein- und Aus- schalten des Hochgeschwindigkeits- ; Modus. EndIf ; Ereignis- Auswertung für Location-Entfernung ; location=-1 gefahr=-1 tod=-1 For i=0To anz_pl x1=EntityDistance(schiff,pl(i)) If x1< plsc(i) ; Abschalt-Entfernung erreicht hispeed=0 location=i If x1< plg(i) ; Gefahren-Grenze erreicht gefahr=i If x1< pld(i) ; Game-Over-Grenze erreicht tod=i EndIf EndIf EndIf Next ; Geschwindigkeits-Kontrolle und Steuerung ; ;******* ; x1=EntityX(schiff) ; Hole alte Schiffs-Position in Bewegungs-Ebene 1 y1=EntityY(schiff) z1=EntityZ(schiff) If hispeed=1 MSF#=100 ;