3D-Space-Game-017.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-017 ; Date: 1.08.03 ;------------------------------------------------------- ; BB3D: 1.83 ;------------------------------------------------------- ; Mein dank an: Markus und HotBit ;------------------------------------------------------- ; ; Ich habe den Code so eingeteilt. Das die einzelnen ; segmente leicht getrennt werden können. Speichert die ; Include Teile ab und nemt das semikolon vom Include ; befehl weg. Dann löscht den Teil zwischen dem Include ; und dem ; End Include. ; ------------------------------------------------------ ; ; Var ****** ;Include "Init-Var.bb" ; 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 ausschalten ; der Schnellen geschwindigkeit. Global location ; enthält -1 oder die nummer der Location in der ;sich das schiff gerade befindedet. Innerhalb ;der Location funktioniert kein HighSpeed. Global ot ; Object Type bei gefahr oder -1 Global inHangar ; Schalter Variable, Ob sich das Schiff in einem ; Hangar befindet. Global SchiffAlpha=1 ; ist das schiff sichtbar oder nicht Global gefahr ; Global tod ; Global t2,t3,c1 ; Timing anzeige für Monitor Funktion Global t5,trans_go,ziehl ; teimer für erzeuge transporter ;End Include ; Start ***** ;Include "Screen.bb" ; 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 EntityType schiff,1 ; kollisions Type EntityRadius schiff,1 ; kollisions Radius ; Danach die Kamera- und Licht- Einstellungen ; Global cammerap=CreatePivot(schiff) ; Drehpunkt für aussenansicht 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 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 ;End Include ;Include "System.bb" ; Das SonnenSystem erzeugen ; Restore planeten_system_daten Dim pl(10) ; enthält die Handler der Planeten Objecte Dim plt(10) ; Zeiger auf Planeten Texture Dim plr#(10) ; eigen rotation Dim plsc(10) ; Speicher für Planeten/Location Durchmesser ; Für das abschalten des HighSped Dim plg(10) ; Gefahrengrenze Dim pld(10) ; Colisions grenze (Game Over) für Planeten etc Dim pln(10) ; Sortiernummer der Planeten/Objecte damit ; eine identivikation im ereignissfall möglich ist Dim plb(10) ; Object bindung Global anz_pl ; Anzahl der Planeten im System i=0 ; Das erste object ist die Sonne Read anz_pl ; Anzahl Planeten Ohne Sonne For i1=0To anz_pl Read t$,sc,x,y,z,r#,sch,scg,scd,ty,i,b,nn$ ; Object 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 EntityRadius pl(i),sc 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 EntityRadius pl(i),sc ; Else If ty=2 ; erzeuge stationen pl(i)=LoadMesh("station.x",plp) ; Station-Object laden PositionEntity pl(i),x,y,z,1 ; Position beliebig EntityType pl(i),2 Else If ty=3 pl(i)=CreatePivot(pl(b)) ;CreateSphere(5,pl(b)) ScaleEntity pl(i),sc,sc,sc PositionEntity pl(i),x,y,z,1 EntityType pl(i),3 EntityRadius pl(i),sc EndIf plsc(i)=sc+sch ; Location durchmesser plg(i)=sc+scg ; Gefahren grenze pld(i)=sc+scd ; Todes grenze plr(i)=r ; planeten Rotation pln(i)=i ; object nummer plb(i)=b ; Object bindung NameEntity(pl(i),nn$) ; Info String zuordnen Next ;End Include Global trans=LoadMesh("transporter.x",plp) ; Schiff-Object laden PositionEntity trans,-5,-6,100 ; Position solte im bereich der Schleuse sein EntityType trans,4 ; kollisions Type EntityRadius trans,1 ; kollisions Radius RotateEntity trans,0,180,0 ; Object um 180 grad drehen HideEntity trans ; Object erst mal ausschalten ; Main ***** ;Include "main_loop.bb" ; Nun kommt der Main Loop ; Repeat t1=MilliSecs() ; Zeit name for allen berechnungen auto_rotation() ; Objecte die sich um die eigene Achse drehen actuallisieren bewege_schiff() ; Funktions-aufruf für die Schiffs-bewegung schiffe() ; Kontrolle der Transporter etc. kolision1() ; kolisions kontrolle vor berechnung UpdateWorld RenderWorld ; Bild berechnen und zeichnen kolision2() ; kolisions kontrolle nach berechnung hangar() ; Wenn sich das schiff in einem Hangar befindet monitor() ; Zur kontrolle bestimmter werte t3=MilliSecs()-t1 ; Zeit in Millisecunden t2=t2+t3 ; Für Zwischen summe aufrechnen t4=MilliSecs()+25-t3 ; Warte schleife berechnen Repeat Until MilliSecs()=>t4 ; Warten bis zeit in ms abgelaufen Flip 1 ; Seite wechseln Until KeyHit(1) ; Abrechen, wenn ESC gedrückt ; Und zum Schluß das Ende ; End ; Alles beenden ;End Include ; Functionen ****** ;Include "bewege-schiff.bb" Function bewege_schiff() Local MSF#,x1#,y1#,z1#,x2#,y2#,z2#,x3#,y3#,z3#,x4#,y4#,z4#,i If inHangar=0 ; Steuerung nur ausserhalb des Hangars 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 ereicht hispeed=0 location=i If x1< plg(i) ; Gefahren grenze ereicht gefahr=pln(i) ; Object nummer für ereigniss steuerung If x1< pld(i) ; Game over grenze ereicht tod=i EndIf EndIf EndIf Next ; Geschwindigkeits kontrolle und Steuerung ; x1=EntityX(schiff) ; hole alte schifs 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 HiSpeed 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=1 ; 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,.8,0,0 Else If KeyDown(208) ; Taste Pfeil ab TurnEntity schiff,-.8,0,0 Else If KeyDown(205) ; Taste rechts TurnEntity schiff,0,-.8,0 Else If KeyDown(203) ; Taste links TurnEntity schiff,0,.8,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,.4 Else If KeyDown(32) ; Taste D TurnEntity schiff,0,0,-.4 EndIf EndIf PositionEntity skay,EntityX(schiff),EntityY(schiff),EntityZ(schiff) ; SkyBox immer Schiff-relativ ohne Drehung PointEntity pl(0),schiff ; Sonne zeigt immer in Richtung Schiff Else If KeyDown(205) ; rechts TurnEntity cammerap,0,.8,0 Else If KeyDown(203) ; lings TurnEntity cammerap,0,-.8,0 EndIf EndIf EndIf End Function ;End Include ;Include "monitor.bb" Function monitor() Color $ff,$ff,0 c1=c1+1 ; Counter für Zwischen summe If c1=5 ; Counter ende ereicht c1=0 ; Counter zurücksetzten t3=t2/6 ; Durchnit berechen t2=0 EndIf Text 10,screen_y-20,"ms : "+Str$(t3) ; Anzeige wiefiel ms die gesamte Main Schleife benötigt 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 ;End Include ;Include "auto_rotation.bb" Function auto_rotation() Local i For i= 1 To anz_pl TurnEntity pl(i),0,plr(i),0 ; Die Planeten / Object dehung Next End Function ;End Include ;Include "kolision.bb" Function kolision1() Local i ot=-1 If gefahr>0 i=GetEntityType(pl(gefahr)) If i=2 ; Station in reichweite ot=i ; Kolisions abfrage activ ; Freigabe für kolision2 Collisions 1,2,2,1 ; Collision Schiff / Station Collisions 1,3,1,1 ; Collision Schiff / Portal EndIf EndIf End Function Function kolision2() Local i,i1,i2 If ot>0 ; object in reichweite i=CountCollisions(schiff) If i>0 ; Eine Collision mit dem schiff liegt an i1=CollisionEntity(schiff,i) ; Object Zeiger holen i2=GetEntityType(i1) If i2=3 ; Object Typ= portal portal(i1) ; dann ereigniss, Zum Beispiel Handels schirm etc. Else If i2=2 ; Object Typ= Station ; Collision und abprallbewegung EndIf EndIf EndIf End Function ;End Include ;Include "portal.bb" Function portal(i) Local i1$ i1$=EntityName(i) ; Hole Object infostring If Instr(i1$,"Hangar") ; Ist das Portal ein Hangar? inHangar=i ; den Object zeiger als ein/aus Schalter übergeben EndIf End Function ;End Include ;Include "hangar.bb" Function hangar() If inHangar>0 ; wenn das schiff sich im Hangar befindet ; Eine andere ansicht einbleneden EntityAlpha schiff,0 ; Schiffs ansicht aus SchiffAlpha=0 ; zustand merken PositionEntity cammera,0,0,-350 ; neue Cammera Position TurnEntity cammerap,0,.1,0 ; Rotation um die Station If KeyHit(61) ; Taste F3 inHangar=0 ; Hangar verlassen RotateEntity schiff,0,180,0 ; Schiff drehen MoveEntity schiff,0,0,50 ; von der Station wegbewegen EndIf Else If SchiffAlpha=0 ; Schiff noch nicht zu sehen SchiffAlpha=1 ; Schiff wider sichtbar EntityAlpha schiff,1 ; RotateEntity cammerap,0,0,0 ; Cammera rotation auf 0 PositionEntity cammera,0,.5,-4 ; Alte position hinter dem Schiff einnehmen EndIf EndIf End Function ;End Include ;Include "schiffe.bb" Function schiffe() If t5=0 ; bei start die nächste ausfahrt des Transporters t5=MilliSecs()+Int(Rnd(3000,20000)) ; festlegen EndIf If t5; Warte Zeit abgelaufen und noch kein Transpoter ShowEntity trans ; unterwegs. Dann Transporter anzeigen trans_go=1 ; Bewegungs freigabe für den Transporter ziehl=pl(Int(Rand(3))) ; Zufalls Ziehl auswählen EndIf If trans_go=1 ; Der Transporter ist unterwegs If t5+20000; If EntityDistance(trans,pl(5))>200 ; Mit hoher geschwindigkeit das System ferlassen MoveEntity trans,0,0,20.0 Else MoveEntity trans,0,0,.2 EndIf Else If t5+10000; MoveEntity trans,0,0,.2 ; Sich dem Ziehl zuwenden AlignToVector trans,EntityX(ziehl),EntityY(ziehl),EntityZ(ziehl),1,.005 Else MoveEntity trans,0,0,.2 EndIf If EntityDistance(schiff,trans)>1000 ; Wenn das Object die sichtbarkeits reichweite ; überschritten hat. Dan wider im Hangar plazieren. PositionEntity trans,-5,-6,100 ; Position beliebig EntityType trans,4 ; kollisions Type EntityRadius trans,1 ; kollisions Radius RotateEntity trans,0,180,0 HideEntity trans ; t5=0 ; und alles auf 0 trans_go=0 ziehl=0 EndIf EndIf End Function ;End Include ; Data ****** ;Include "data.bb" ; 1. Anzahl Planeten ; Daten für erstes Planeten Object ; 1. Planeten Texture/FileName ; 2. Durchmesser des Planeten/objesct für die Scalierung ; 3. x,y,z, Position ; 6. Eigenrotation ; 7. Higspeed ausschaltungs entfernung (2+7) ; 8. Gefahrenwarnung (2+8) ; 9. Colisions abstand (2+9) : Nur Planeten+Sonne ; 10.Object Type : 0=Sonne / 1=Planet / 2=Station / 3= Portal ; 11.Object nummer für Ereignis identivizierung ; 12.Object nummer an die dieses Object angebunden werden soll ; 13.Object Name. Info String. .Planeten_System_Daten Data 5 Data "sonne.jpg",10000,80000,0,0,0,5000,4500,4300,0,0,0,"EM 0012" Data "welt.jpg",1000,0,0,2000,0.01,1000,200,50,1,1,0,"Atika 1" Data "welt.jpg",1000,180000,0,2000,0.01,1000,200,50,1,2,0,"Atika 2" Data "welt.jpg",1000,-30000,1500,-10000,0.01,1000,200,50,1,3,0,"Horus" Data "station.x",1,0,0,100,0,1000,200,-1,2,4,1,"New Berlin" Data "portal",8,-5,-7,90,0,0,50,0,3,5,4,"Hangar 1/New Berlin/Atika 1/EM 0012" ;End Include ; ------------------------------------------------------ ; ; wenn ihr alles richtig gemacht habt. Sollte das Game ; wie gehabt functionieren. Includes sind eine feine sache. ; Manchmal ist es etwas ümständlich. Aber ich habe mich ; daran gewöhnt. ; ; -> Weiter mit 3D-Space-Game-018.bb
Created on 20.08.2005
Zurueck