3D-Space-Game-011.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-011 ; Date: 29.07.03 ;------------------------------------------------------- ; BB3D: 1.83 ;------------------------------------------------------- ; Mein Dank an: Markus und Hot-Bit ;------------------------------------------------------- ; ; In diesem Teil werden wir ein wenig Ereignis-Steuerung ; hinein bringen. Nur so in der Gegend rumfliegen ist zwar ; ganz toll, aber bei weitem nicht ausreichend. Die Daten- ; Struktur für die Planeten-Location wird um einige Infos ; erweitert. Da die Anzahl Locations im allgemeinen recht ; niedrig sind, ermitteln wir einfach den definitiven ; Abstand zum Schiff und reagieren auf die Entfernungen ; die sich ergeben. Die Variable "location" enthält da- ; bei immer die Nummer der Aktuellen Lokation oder -1. ; Wenn das Schiff der Lokation zu nahe kommt, dann ; wird eine Gefahr-Warnung ausgegeben. Dazu dient die ; Funktion "monitor". Hier werden alle optischen Ausgaben ; gemacht, welche auf dem Bildschirm auszugeben sind. Die ; Funktion "auto_rotation" wird in Zukunft alle Dreh-Bewegungen ; aufnehmen. Wie z.B. die der Planeten. ; ; ------------------------------------------------------ ; ; 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 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,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-Objecte 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-Speed Dim plg(10) ; Gefahrengrenze 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 Read t$,sc,x,y,z,r#,sch,scg,scd ; Objekt-Daten holen plt(i)=LoadTexture(t$,2) ; Sonnen-Textur laden pl(i)=CreateCube(plp) ; Objekt erzeugen ;******* ; plsc(i)=sc+sch ; Location-Durchmesser plg(i)=sc+scg ; Gefahren-Grenze pld(i)=sc+scd ; Todes-Grenze ;******* 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,sch,scg,scd ; Objekt-Daten holen pl(i)=CreateSphere(12,plp) ; Eine Kugel erstellen plt(i)=LoadTexture(t$) ; Die Welt-Textur laden plsc(i)=sc+sch ; Location-Durchmesser plg(i)=sc+scg ; Gefahren-Grenze pld(i)=sc+scd ; Todes-Grenze 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 auto_rotation() ; Objekte, die sich um die eigene Achse drehen, aktuallisieren 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 ;********* ; 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 ;********* If hispeed=1 MSF#=100 ; Maximale High-Speed-Geschwindigkeit x1=EntityX(schiff) ; hole alte Schiffs-Position in Bewegungs-Ebene 1 y1=EntityY(schiff) z1=EntityZ(schiff) ; Die Bewegungs-Richtung für High-Speed ist nur vorwärts ; MoveEntity schiff,0,0,MSF x2=EntityX(schiff)-x1 ; Differenz neue/alte Schiffs-Position y2=EntityY(schiff)-y1 z2=EntityZ(schiff)-z1 x3=EntityX(plp) ; Aktuelle Position des System-Sammel-Punktes ; merken y3=EntityY(plp) z3=EntityZ(plp) x4=x3-x2 ; Bewegungs-Differenz des Schiffes vom ; Sammel-Punkt abziehen y4=y3-y2 z4=z3-z2 PositionEntity plp,x4,y4,z4 ; Das ganze System auf neue Position bringen ; Die Schiffs-Position langsam wieder auf 0,0,0 zurücksetzen ; i=5 ; Rücksetz-Geschwindigkeit If x1>i x1=x1-i Else If x1<-i x1=x1+i Else If x1-i x1=0 EndIf If y1>i y1=y1-i Else If y1<-i y1=y1+i Else If y1-i y1=0 EndIf If z1>i z1=z1-i Else If z1<-i z1=z1+i Else If z1-i z1=0 EndIf PositionEntity schiff,x1,y1,z1 ; Alte Schiffs-Position übernehmen, ; inklusive Verschiebung nach 0,0,0 Else MSF#=1 ; Maximale Schiffs-Bewegung in der ersten Ebene 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 EndIf PositionEntity skay,EntityX(schiff),EntityY(schiff),EntityZ(schiff) ; Sky-Box immer Schiff relativ ohne Drehung PointEntity pl(0),schiff ; Sonne zeigt immer in Richtung Schiff End Function Function monitor() Color $ff,$ff,$ff Text 10,10,Int(EntityX(schiff)) Text 50,10,Int(EntityY(schiff)) Text 90,10,Int(EntityZ(schiff)) If hispeed<>0 Text screen_x-100,10,"High Speed" EndIf If location=>0 Text screen_x-125,10,"No High Speed" EndIf If gefahr=>0 Text screen_x-125,20,"Gefahr" EndIf If tod=>0 Text screen_x-125,30,"Game Over" EndIf End Function Function auto_rotation() Local i For i= 1 To anz_pl TurnEntity pl(i),0,plr(i),0 ; Die Planeten-Drehung Next End Function ; 1. Anzahl Planeten ; Daten für erstes Planeten-Objekt ; 2. Planeten Textur ; 3. Durchmesser des Planeten ; 4. x,y,z- Position ; 5. Eigen-Rotation ; 6. High-Speed-Ausschaltungs-Entfernung (3+6) ; 7. Gefahren-Warnung (3+7) ; 8. Kollisions-Abstand (3+8) .Planeten_System_Daten Data 3 Data "sonne.jpg",10000,80000,0,0,0,5000,4500,4300 Data "welt.jpg",1000,0,0,2000,0.01,1000,300,200 Data "welt.jpg",1000,180000,0,2000,0.01,1000,300,200 Data "welt.jpg",1000,-30000,1500,-10000,0.01,1000,300,200 ; ------------------------------------------------------ ; ; Auch ohne Kollisions-Befehle ist mit wenigen Zeilen ; eine Ereignis-Programmierung machbar. Die Sache mit ; der Pivot-Verschiebung scheint super zu funktionieren. ; Das Game-Over-Ereignis lassen wir erst mal beiseite. ; Es ist aber schon mal vorbereitet. Im nächsten Part ; werden wir andere Objekte wie Stationen etc.., in die ; Location-Tabelle aufnehmen, und entsprechende Ereignisse ; programmieren. ; ; -> Weiter mit 3D-Space-Game-012.bb
Created on 20.08.2005
Zurueck