3D-Space-Game-013.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-013 ; Date: 30.07.03 ;------------------------------------------------------- ; BB3D: 1.83 ;------------------------------------------------------- ; Mein Dank an: Markus und Hot-Bit ;------------------------------------------------------- ; ; Da das BB-Kollision-System nicht so konkret sicher ; funktioniert, mußte die Schiff-Bewegung wieder in 2 ; Teile aufgeteilt werden. Die Bewegung des gesamten Universums, ; inklusive Kollisions-Abfrage funktioniert nicht. Das hängt ; mit dem Pivot-System zusammen, in Verbindung mit der ; Kollisions-Listen-Erzeugung. Aber da wir ja bereits ein ; Zwei-Ebenen-Bewegungs-System hatten, übernehmen wir ; es einfach wieder. Schaut euch die Erläuterungen der ; Deutschen Hilfe zu den Kollisions-Befehlen an. Um das ; Ganze ein bißchen besser sehen zu können, führen wir ; noch eine Kamera-Drehung um das Schiff ein. STRG + ; Pfeil Taste rechts/links. ; ; ------------------------------------------------------ ; ; 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 Lokation in der ;sich das Schiff gerade befindet. Innerhalb ;der Lokation 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 Object, welches mit DOGA L1 erstellt wurde, wird geladen Global schiff=LoadMesh("schiff.x") ; Schiff-Object laden PositionEntity schiff,0,0,0 ; Position beliebig ;****** ; EntityType schiff,1 EntityRadius schiff,1 ; ;****** ; Danach die Kamera- und Licht- Einstellungen ; ;****** ; Global cammerap=CreatePivot(schiff) ; Drehpunkt für Außenansicht Global Cammera=CreateCamera(cammerap) ; 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() ; Ein 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) ; 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 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(16,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 ;******* ; EntityType station,2 ; ;******* 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 ;******* ; Collisions 1,2,2,1 ; ;******* UpdateWorld RenderWorld ; Bild berechnen und zeichnen kolision() ; Kollisions-Kontrolle 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 KeyDown(29)=0 ; Taste Strg If hispeed=1 MSF#=100 ; Maxiamle 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 neu-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 rü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 Else ;******* ; ; Kamera um das chiff drehen If KeyDown(205) ; rechts TurnEntity cammerap,0,.8,0 Else If KeyDown(203) ; links TurnEntity cammerap,0,-.8,0 EndIf ; ;******* EndIf End Function Function monitor() Color $ff,$ff,0 If CountCollisions(schiff)>0 Text 10,10,CollisionTime(schiff,1) EndIf 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 ;****** ; Function kolision() End Function ; ;****** ; 1. Anzahl Planeten ; Daten für erstes Planeten Object ; 2. Planeten Textur/FileName ; 3. Durchmesser des Planeten ; 4. x,y,z, Position ; 5. Eigen-Rotation ; 6. High-Speed Ausschaltungs-Entfernung (3+6) ; 7. Gefahrenwarnung (3+7) ; 8. Kollisions-Abstand (3+8) ; 9. Objekt-Type : 0=Sonne / 1=Planet / 2=Station .Planeten_System_Daten Data 4 Data "sonne.jpg",10000,80000,0,0,0,5000,4500,4300,0 Data "welt.jpg",1000,0,0,2000,0.01,1000,200,50,1 Data "welt.jpg",1000,180000,0,2000,0.01,1000,200,50,1 Data "welt.jpg",1000,-30000,1500,-10000,0.01,1000,200,50,1 Data "station.x",1,0,0,100,0,1000,200,-1,2 ; ------------------------------------------------------ ; ; Die Kollisions-Abfrage funktioniert schon mal. Als ; Ereignis passiert erst mal nichts. Aber die ; Function "kolision" wird diese Auswertung später ; übernehmen. ; ; -> Weiter mit 3D-Space-Game-014.bb
Created on 20.08.2005
Zurueck