Planeten-Umlaufbahn [2D]
Übersicht

![]() |
SephkaBetreff: Planeten-Umlaufbahn [2D] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,ich progge grad an nem Planetenspiel.
Und ich möchste wissen wie ich ein Planet auf einer bestimmten umlaufbahn "fahren"(oder wie man das sagt) lasse. MFG Sephka |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn nicht physikalisch korrekt, dann
mit sinus und cosinus um einen punkt rotieren lassen mit einer vorher festgelegten winkelgeschwindigkeit und einem vorher festgelegten radius. Code: [AUSKLAPPEN] posx=rotationsmittelpunktx+cos(alpha)*radius
posy=rotationsmittelpunkty-sin(alpha)*radius alpha=alpha+winkelgeschwindigkeit |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
sin![]() ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin zwar noch nicht mathematisch weit genug für sinus,cosinus,tangent..........
aber es funzt und ich versteh es ganz gut Danke,Sephka |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hier mal ein einfaches Beispiel aus meiner B3D Anfangszeit:
Code: [AUSKLAPPEN] Graphics 800,600,16,2
AppTitle "Sonnensystem" SetBuffer BackBuffer() ;Datenfelder auslesen Dim planeten$(9,8) Restore planeten For p=0 To 9 For q=0 To 8 Read planeten$(p,q) Next Next ;Parameter festlegen mx=GraphicsWidth()/2 my=GraphicsHeight()/2 zoom#=100 zeit#=1 ;1 Jahr = Umlaufzeit Erde jahr#=360/(365.256/Float(planeten$(3,4))) ;Fonts laden font1=LoadFont("System",16,0,0,0) font2=LoadFont("Small Fonts",10,0,0,0) ;Hauptschleife While Not KeyHit(1) ;Tastatursteuerung If KeyDown(208) Then zoom#=zoom#+10 If KeyDown(200) Then zoom#=zoom#-10 If KeyDown(205) Then zeit#=zeit#+(zoom#/1000) If KeyDown(203) Then zeit#=zeit#-(zoom#/1000) ;Begrenzungen If zoom#<25 Then zoom#=25 If zoom#>2500 Then zoom#=2500 If zeit#<1 Then zeit#=1 If zeit>1000 Then zeit#=1000 ; Bildschirm leeren Cls ;alle Objekte durchgehen For planet=0 To 9 ;Daten aus den Feldern lesen name$=planeten$(planet,0) dist#=Float(planeten$(planet,1))/zoom#*100 aphel#=Float(planeten$(planet,2)) perihel#=Float(planeten$(planet,3)) speed#=365.256/Float(planeten$(planet,4)) size#=Float(planeten$(planet,5))/zoom# If size#<5 Then size#=5 r=Int(planeten$(planet,6)) g=Int(planeten$(planet,7)) b=Int(planeten$(planet,8)) ;aktuellen Planet einzeichnen zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,360,r,g,b,font2) Next ;Winkel erhöhen i#=i#+zeit# SetFont font1 ;abgelaufene Zeit in Erdjahren zeigen Color 255,255,255 Text 0,0,"Erdumläufe:":Text 100,0,i#/jahr# Text 0,15,"Zoom:":Text 100,15,Int(zoom#) Text 0,30,"Speed:":Text 100,30,zeit# ;Bufferswitch Flip 1 Wend End .planeten ; -------------------------------------------------------------------------------- ; Daten der einzelnen Planeten, aus denen die Szene berechnet wird ; frei aus der Wikipedia übernommen bzw. umgerechnet ; -------------------------------------------------------------------------------- ; Name Radius Aphel Perihel synod.Per. Grösse Rot Grün Blau ; -------------------------------------------------------------------------------- Data "Sonne" , 0.0 , 1.000 , 1.000 , 1.000 , 1392.000 , 255 , 255 , 0 Data "Merkur" , 38.7 , 1.206 , 0.794 , 87.989 , 4.878 , 255 , 128 , 0 Data "Venus" , 108.2 , 1.007 , 0.993 , 224.701 , 5.000 , 255 , 255 , 0 Data "Erde" , 149.6 , 1.017 , 0.983 , 365.256 , 12.756 , 0 , 0 , 255 Data "Mars" , 227.9 , 1.093 , 0.906 , 686.980 , 6.794 , 255 , 0 , 0 Data "Jupiter" , 778.6 , 1.049 , 0.951 , 4332.589 , 142.984 , 255 , 192 , 0 Data "Saturn" ,1514.6 , 1.057 , 0.944 , 10759.346 , 120.536 , 255 , 224 , 0 Data "Uranus" ,3003.6 , 1.046 , 0.954 , 30685.400 , 51.118 , 0 , 128 , 255 Data "Neptun" ,4545.7 , 1.011 , 0.989 , 60267.240 , 49.248 , 0 , 255 , 255 Data "Pluto" ,7304.3 , 1.244 , 0.756 , 90465.000 , 2.390 , 255 , 255 , 255 ; -------------------------------------------------------------------------------- ;Planet an einer bestimmten Stelle mit Kreisbahn zeichnen Function zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,angle#,r,g,b,font) ;Vorberechnungen radiusx#=dist#*aphel# radiusy#=dist#*perihel# i#=i#*speed# ;mittleren Bahnradius einzeichnen Color 32,32,32 Oval mx-(dist#),my-(dist#),dist#*2,dist#*2,0 ;Ellipsenposition berechnen xcos#=Cos#(angle#) xsin#=Sin#(angle#) tmpx#=Cos#(i#)*radiusx# tmpy#=Sin#(i#)*-radiusy# x#=tmpx#*xcos#+tmpy*-xsin# y#=tmpx#*xsin#+tmpy*xcos# ;elliptischen Bahnradius einzeichnen Color r/4,g/4,b/4 Oval mx-radiusx#,my-radiusy,radiusx#*2,radiusy#*2,0 ;Planet auf Ellipsenposition zeichnen Color r,g,b Oval mx+x#-(size#/2),my+y#-(size#/2),size#,size#,1 ;Planetennamen über dem Objekt einzeichnen SetFont font Text mx+x#,my+y#-(size#/2)-5,name$,1,1 End Function Und hier ein kompliziertes mit Physik: Code: [AUSKLAPPEN] ;Realistisches 2D-Modell des Sonnensystems V1.0
;unter Berücksichtigung des N-Körper Problems ;mit realen Daten der Objekte vom 01.01.2000 AppTitle "Realistisches 2D-Modell des Sonnensystems V1.0" ;Parameter scrX = 640 ;Bildschirmbreite scrY = 480 ;Bildschirmhöhe scrD = 32 ;Farbtiefe scrT = 2 ;1=Fenster 2=Fullscreen pn = 10 ;Anzahl Planeten ps = 3 ;Grösse der Planeten zoom = 200 ;Zoomfaktor (1=weit,250=nah, 200=inneres System, 5=komplett) tracers = 1 ;Planetenspuren 1=ein 0=aus sunmove = 1 ;Korrektur der Sonnenbewegung 1=ein 0=aus sunmass#= 1.0 ;Sonnenmasse (1=normal) TIM# = 0 ;Zeitfaktor rücksetzen TIMINT# = 0.5 ;um x Sonnentage erhöhen pro Durchgang, je höher desto ungenauer! ;bei über 10 kann der Merkur "verloren" gehen :-) ;Gaußsche Gravitationskonstante K1# = .01720209895 K2# = K1# * K1# ;Felder dimensionieren Dim X#(pn), Y#(pn), Z#(pn), VX#(pn), VY#(pn), VZ#(pn), MASS#(pn), ro(pn), gr(pn), bl(pn) Dim name$(pn), oldx#(pn), oldy#(pn), DEG#(pn), MU#(pn), SEMI#(pn), ECCEN#(pn) ;Datenfelder auslesen Dim pla$(pn,11) Restore planetdata For p=0 To pn-1 For q=0 To 11 Read pla$(p,q) name$(p)=pla$(p,0) ;Name X#(p)=pla$(p,1) ;X-Position Y#(p)=pla$(p,2) ;Y-Position Z#(p)=pla$(p,3) ;Z-Position VX#(p)=pla$(p,4) ;Geschwindigkeit X VY#(p)=pla$(p,5) ;Geschwindigkeit Y VZ#(p)=pla$(p,6) ;Geschwindigkeit Z MASS#(p)=Float(pla$(p,7))*10^Int(pla$(p,8)) ;Masse ro(p)=pla$(p,9) ;Rotanteil gr(p)=pla$(p,10) ;Grünanteil bl(p)=pla$(p,11) ;Blauanteil Next Next ;Daten der Objekte Stand 01.01.2000 .planetdata ; Name POS X POS Y POS Z Vx Vy Vz Masse*10^X Rot Grü Bla Data "Sonne" , 0.0000000 , 0.0000000 , 0.0000000 , 0.000000000 , 0.000000000 , 0.000000000 , 1.991 , 30 , 255 , 255 , 0 Data "Merkur" , -0.1778023 , -0.3863251 , -0.1879025 , 0.020335410 , -0.007559570 , -0.006147710 , 3.191 , 23 , 255 , 64 , 0 Data "Venus" , 0.1787301 , -0.6390267 , -0.2987722 , 0.019469170 , 0.004915870 , 0.000978980 , 4.886 , 24 , 255 , 192 , 128 Data "Erde" , -0.3305873 , 0.8497269 , 0.3684325 , -0.016483420 , -0.005365460 , -0.002326460 , 5.979 , 24 , 0 , 0 , 255 Data "Mars" , -1.5848092 , -0.3648638 , -0.1244522 , 0.003821510 , -0.011241840 , -0.005259630 , 6.418 , 23 , 255 , 0 , 0 Data "Jupiter" , 4.1801700 , -2.5386080 , -1.1900210 , 0.004106423 , 0.006125327 , 0.002525539 , 1.901 , 27 , 128 , 255 , 0 Data "Saturn" , -4.6197080 , -8.2374610 , -3.2033610 , 0.004647751 , -0.002328957 , -0.001161564 , 5.684 , 26 , 255 , 255 , 128 Data "Uranus" , -3.7245900 , -17.1975200 , -7.4791700 , 0.003833665 , -0.000845721 , -0.000424809 , 8.682 , 25 , 0 , 255 , 255 Data "Neptun" , 1.9138100 , -27.9215500 , -11.4762000 , 0.003118271 , 0.000233303 , 0.000017967 , 1.027 , 26 , 0 , 128 , 255 Data "Pluto" , -23.2285900 , -18.5272000 , 1.2167500 , 0.002066577 , -0.002488884 , -0.001397200 , 1.080 , 24 , 128 , 128 , 128 ;Masse mit Sonne normalisieren (Sonne=1) For I = 1 To pn-1 MASS#(I) = MASS#(I) / MASS(0) Next MASS#(0) = sunmass# ;reduzierte Masse in Gaussschen Einheiten erzeugen For I = 1 To pn-1 MU#(I) = K2# * (1 + MASS#(I)) Next ;Grafikmodus Graphics scrX,scrY,scrD,scrT SetBuffer BackBuffer() ;Hauptschleife While Not KeyHit(1) If KeyDown(200) Then zoom=zoom+1: Cls: If zoom>250 Then zoom=250 If KeyDown(208) Then zoom=zoom-1: Cls: If zoom<1 Then zoom=1 If KeyDown(203) Then TIMINT#=TIMINT#-.5:If TIMINT#<.5 Then TIMINT#=.5 If KeyDown(205) Then TIMINT#=TIMINT#+.5:If TIMINT#>25 Then TIMINT#=25 If KeyHit(57) Then tracers=1-tracers:Cls If KeyDown(59) Then zoom=200:Cls If KeyDown(60) Then zoom=5:Cls If KeyDown(61) Then MASS#(0)=2 If KeyDown(62) Then MASS#(0)=0.5 If KeyDown(63) Then MASS#(3)=.05 ;Zeit um Faktor erhöhen TIM# = TIM# + TIMINT# ;Tracer einzeichnen For i=0 To pn-1 ;Tracerfarbe If tracers Then Color 32,32,32 Else Color 0,0,0 Oval(scrX/2+oldx#(i),scrY/2+oldy#(i),ps,ps,1) Next ;Berechnungen und Planetenausgabe Gosub NewV Gosub NewP ;Fake CLS oben links Rect 0,0,150,42,1 Color 255,255,255 ;Textausgabe oben links Text 0, 0,"Tage: "+Int(TIM#) Text 0,10,"Jahre: "+TIM#/365.25 Text 0,20,"Zeit: "+TIMINT# Text 0,30,"Zoom: "+zoom ;Tastaturbefehle ;Pfeil rauf/runter = Zoom in/out ;Pfeil links/rechts = langsamer/schneller ;Space = Tracers ein/aus ;F1 = inneres Sonnensystem ;F2 = komplettes Sonnensystem ;F3 = Sonnenmasse verdoppelt ;F4 = Sonnenmasse halbiert ;F5 = Erdmasse = 0.05 Sonnenmassen Wink kp=0 ;Bufferflip Flip 1 Wend End ;ab hier Gosubs------------------------------------------------------------- ;Gosub: neue Geschwindigkeit berechnen .NewV For I = 0 To pn-1 ;Parameter rücksetzen AX# = 0 AY# = 0 AZ# = 0 ;keine Ahnung was hier passiert For J = 0 To pn-1 If (J = I) Then Goto weiter XJI# = X#(J) - X#(I) YJI# = Y#(J) - Y#(I) ZJI# = Z#(J) - Z#(I) R# = Sqr(ZJI# * ZJI# + YJI# * YJI# + XJI# * XJI#) R3# = R# * R# * R# COEFF# = K2# * MASS#(J) / R3# AX# = COEFF# * XJI# + AX# AY# = COEFF# * YJI# + AY# AZ# = COEFF# * ZJI# + AZ# .weiter Next ;neue Geschwindigkeit berechnen VX#(I) = VX#(I) + AX# * TIMINT# VY#(I) = VY#(I) + AY# * TIMINT# VZ#(I) = VZ#(I) + AZ# * TIMINT# Next Return ;Gosub: neue Position berechnen und Planeten einzeichnen .NewP For i=0 To pn-1 ;neue Position berechnen X#(i) = X(i) + VX#(i) * TIMINT# Y#(i) = Y(i) + VY#(i) * TIMINT# Z#(i) = Z(i) + VZ#(i) * TIMINT# ;Zoomfaktor berücksichtigen sx#=X#(i)*zoom sy#=Y#(i)*zoom ;Korrektur der Sonnenbewegung If i=0 And sunmove=1 Then sunx#=sx# suny#=sy# EndIf ;Position mit Zoomfaktor und Sonnenkorrektur sx#=sx#-sunx# sy#=sy#-suny# ;alte Position für Tracer speichern oldx#(i)=sx# oldy#(i)=sy# ;Planeten zeichnen Color ro(i),gr(i),bl(i) Oval(scrX/2+sx#,scrY/2+sy#,ps,ps,1) Next Return Und hier was megakomplexes in 3D woraus man fast schon ein Spiel draus bauen könnte: Code: [AUSKLAPPEN] AppTitle "Interplanetary Travel"
Graphics3D 800,600,32,2 SeedRnd MilliSecs() ; sun obstacle demo ;SeedRnd 6 Const MOONS = 29 ; number of moons to read Const PLANETS = 9 ; number of planets to read Const RANDOMIZE% = True ; random positions on/off Const DAYINC# = 1.0/60 ; time increment per cycle Const YEAR# = 365.256 ; earth year in days Const AVOIDSUNCROSS%= True ; avoid sun crossing trajectory yes/no Const AVOIDINCDAYS% = 10 ; days increment for new trajectory Const START$ = "Moon" ; object to start at Const TARGET$ = "Callisto" ; object to target Const SHIPSPEED# = 20 ; ship speed (Mio. km/Day) (normal = 20 / hispeed = 40 / c=1079.9) Global WIDTH%=GraphicsWidth() ; screen width Global HEIGHT%=GraphicsHeight() ; screen height Global SPEED#=DAYINC*SHIPSPEED ; calculated ship speed Global TIMER%=CreateTimer(60) ; timer Global INFO%=True ; Text info flag Global STOPPER%=False ; Ship arrival flag Global S.System=New System Global DAYS#,MAXDIST#,CALCTIME#,ZOOM# Global CAM%,PLANETORBITS%,SUN%,SUN0%,SUN1%,SUN2%,SUN3%,TRACER%,SHIP%,STARTOBJECT%,TARGETOBJECT% Global MASTERPIVOT%,SOLIDPIVOT%,WIREDPIVOT%,TARGETPIVOT% Type Moon Field id%,parent%,name$,radius#,period#,size#,r%,g%,b%,SPEED#,random%,entity%,orbit% End Type Type Planet Field id%,parent%,name$,radius#,period#,size#,r%,g%,b%,MOONS%,moon.Moon[MOONS],SPEED#,random%,entity% End Type Type System Field planet.Planet[PLANETS] End Type ; init scene InitScene() ; init planet and moon objects and update once Initialize() UpdateObjects() ; set ship start position InitShipPosition(SHIP,AVOIDSUNCROSS,AVOIDINCDAYS) MoveMouse WIDTH/2,HEIGHT/2 ;=========================================================================== ; main loop ;=========================================================================== While Not KeyHit(1) ZOOM=1.0 Local oldx#,oldy#,oldz#,multi%=1,l#=5.0 Local f#=Sqr(EntityDistance(CAM,MASTERPIVOT)/1000.0) Local d#=EntityDistance(SHIP,TARGETPIVOT) ; store current ship position oldx=EntityX(SHIP) oldy=EntityY(SHIP) oldz=EntityZ(SHIP) ; LMB = advance time If MouseDown(1) And (Not STOPPER) Then DAYS=DAYS+DAYINC ; near target? stop it If d<=SPEED*2 Then UpdateObjects() STOPPER=True PositionEntity SHIP,EntityX(TARGETOBJECT),EntityY(TARGETOBJECT),EntityZ(TARGETOBJECT) CreateLine(TRACER,oldx,oldy,oldz,EntityX(SHIP),EntityY(SHIP),EntityZ(SHIP),0,255,0,1) Else ; move ship to target PointEntity SHIP,TARGETPIVOT MoveEntity SHIP,0,0,SPEED CreateLine(TRACER,oldx,oldy,oldz,EntityX(SHIP),EntityY(SHIP),EntityZ(SHIP),0,255,0,1) EndIf EndIf ; SHIFT = 10x faster cam flight If KeyDown(42) Or KeyDown(54) Then multi=10 ; RMB = Zoom If MouseDown(2) Then ZOOM=20 : l=50.0 ; SPACE = show/hide text info If KeyHit(57) Then INFO=1-INFO ; camera movement RotateEntity CAM,EntityPitch(CAM)+(MouseYSpeed()/l),EntityYaw(CAM)-(MouseXSpeed()/l),0 MoveEntity CAM,(KeyDown(205)-KeyDown(203))*f*multi,0,(KeyDown(200)-KeyDown(208))*f*multi MoveMouse WIDTH/2,HEIGHT/2 CameraZoom CAM,ZOOM ; sun quads always point to cam PointEntity SUN0,CAM PointEntity SUN1,CAM PointEntity SUN2,CAM PointEntity SUN3,CAM ; wireframe render pass WireFrame 1 ShowEntity WIREDPIVOT HideEntity SOLIDPIVOT CameraClsMode CAM,1,1 RenderWorld ; solid object render pass WireFrame 0 HideEntity WIREDPIVOT ShowEntity SOLIDPIVOT CameraClsMode CAM,0,0 RenderWorld ; update object positions UpdateObjects() ; text info Text 0, 0,"Source > Target: "+START+" > "+TARGET Text 0,15,"Distance.......: "+Round(d)+" Mio. km [total "+Round(MAXDIST)+" Mio. km]" Text 0,30,"Ship Speed.....: "+Round(SPEED/DAYINC)+" Mio. km/Day ["+Round(SPEED/DAYINC/3600*1000000)+"km/sec.]" Text 0,45,"Flight time....: "+Round(DAYS)+" Days ["+Round(CALCTIME)+" total]" WaitTimer TIMER Flip 0 Wend End ;=========================================================================== ; init scene objects ;=========================================================================== Function InitScene() Local size#=13.92,suntex% ; pivots MASTERPIVOT=CreatePivot() SOLIDPIVOT=CreatePivot(MASTERPIVOT) WIREDPIVOT=CreatePivot(MASTERPIVOT) ; cam CAM=CreateCamera() CameraRange CAM,1,32768 ; orbit wireframe PLANETORBITS=CreateMesh(WIREDPIVOT) CreateSurface(PLANETORBITS) EntityFX PLANETORBITS,1+2+16+32 ; ship tracer wireframe TRACER=CreateMesh() CreateSurface(TRACER) EntityFX TRACER,1+2+16+32 ; ship SHIP=CreateCone(16,1,SOLIDPIVOT) RotateMesh SHIP,90,0,0 EntityFX SHIP,1 EntityColor SHIP,255,0,255 ScaleEntity SHIP,0.2,0.2,0.2 ; sun SUN=CreateSphere(8) ScaleEntity SUN,size,size,size EntityRadius SUN,size/2.0,size/2.0 EntityPickMode SUN,1 EntityAlpha SUN,0 ; sun flares suntex=CreateSunTexture() SUN0=CreateQuad(SOLIDPIVOT,size*1.0,suntex,3,1+8,255,255,255,1.00) SUN1=CreateQuad(SOLIDPIVOT,size*1.5,suntex,3,1+8,255,192,128,1.00) SUN2=CreateQuad(SOLIDPIVOT,size*3.0,suntex,3,1+8,255,255,224,0.75) SUN3=CreateQuad(SOLIDPIVOT,size*6.0,suntex,3,1+8,255,255,224,0.50) End Function ;=========================================================================== ; calculate ship trajectory from start object to target object ;=========================================================================== Function CalculateTrajectory(add#=0.0,avoidsun%=True) Local pick% ; create ship target pivot TARGETPIVOT=CreatePivot(MASTERPIVOT) ; calculate distance and estimated time to reach target position MAXDIST#=EntityDistance(SHIP,TARGETOBJECT) CALCTIME#=(MAXDIST/SPEED*DAYINC)+add ; calculate approximate future position of target object DAYS=DAYS+CALCTIME UpdateObjects() ; get ship position Local sx#=EntityX(SHIP) Local sy#=EntityY(SHIP) Local sz#=EntityZ(SHIP) ; get target position Local tx#=EntityX(TARGETOBJECT) Local ty#=EntityY(TARGETOBJECT) Local tz#=EntityZ(TARGETOBJECT) ; place target pivot to target object position and calc distance PositionEntity TARGETPIVOT,tx,ty,tz MAXDIST#=EntityDistance(SHIP,TARGETOBJECT) ; reset scene to initial position DAYS=DAYS-CALCTIME UpdateObjects() ; check free path avoiding sun crossing If avoidsun Then ; check if sun is blocking pick=LinePick(sx,sy,sz,tx-sx,ty-sy,tz-sz,10) ; free path? If (Not pick) Then ; create a blue line and calculate the constant ship speed (should be slower than max ship speed) CreateLine(TRACER,sx,sy,sz,tx,ty,tz,0,0,128,1) SPEED#=(EntityDistance(SHIP,TARGETPIVOT)/(CALCTIME-DAYS)*DAYINC) ; position cam PositionEntity CAM,sx,sy+20,sz-20 PointEntity CAM,SHIP Else ; create a red line if occupied space (for debugging only) CreateLine(TRACER,sx,sy,sz,tx,ty,tz,255,0,0,0.2) EndIf Else ; create a blue line CreateLine(TRACER,sx,sy,sz,tx,ty,tz,0,0,128,1) SPEED#=(EntityDistance(SHIP,TARGETPIVOT)/(CALCTIME-DAYS)*DAYINC) ; position cam PositionEntity CAM,sx,sy+20,sz-20 PointEntity CAM,SHIP EndIf Return pick End Function ;=========================================================================== ; set a given object to start object position ;=========================================================================== Function InitShipPosition(obj%,avoidsun%=True,avoidinc%=1,addx#=0.0,addy#=0.0,addz#=0.0) Local i%,pick%,c%,p.Planet,m.Moon ; check all planets For p.Planet = Each Planet ; start or target found? store entity information If p\name=START Then STARTOBJECT=p\entity If p\name=TARGET Then TARGETOBJECT=p\entity ; check all moons For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) ; start or target found? store entity information If m\name=START Then STARTOBJECT=m\entity If m\name=TARGET Then TARGETOBJECT=m\entity Next Next ; position object to start object position PositionEntity obj,EntityX(STARTOBJECT)+addx,EntityY(STARTOBJECT)+addy,EntityZ(STARTOBJECT)+addz PointEntity obj,TARGETOBJECT ; calculate direct trajectory (with optional avoiding sun crossing) Repeat pick=CalculateTrajectory(c,avoidsun) : c=c+avoidinc : Until Not pick End Function ;=========================================================================== ; read planet/moon data and create objects, fill types ;=========================================================================== Function Initialize() Local p%,m% Local parent%,name$,radius#,period#,size#,r%,g%,b% Local speed#,entity%,random%,orbit% ; read planet data Restore PLANETDATA For p=1 To PLANETS Read parent,name,radius,period,size,r,g,b ; calc speed and initial position speed=YEAR/Float(period) If RANDOMIZE Then random=Rnd(0,2^16) ; create sphere object entity=CreateSphere(16,SOLIDPIVOT) EntityFX entity,1 EntityColor entity,r,g,b ScaleEntity entity,0.5,0.5,0.5 ; add orbit CreateOrbit(360,PLANETORBITS,radius,radius,255,255,255,0.1,0,0,0) ; add planet S\planet[p]=PLANETcreate(p,parent%,name$,radius#,period#,size#,r%,g%,b%,speed,entity,random) Next ; read moon data Restore MOONDATA For m=1 To MOONS Read parent,name,radius,period,size,r,g,b ; calc speed and initial position speed=YEAR/Float(period) If RANDOMIZE Then random=Rnd(0,2^16) ; create sphere object entity=CreateSphere(16,SOLIDPIVOT) EntityFX entity,1 EntityColor entity,r,g,b ScaleEntity entity,0.125,0.125,0.125 ; add orbit orbit=CreateOrbit(360,0,radius,radius,255,255,255,0.1) EntityFX orbit,1+16 EntityAlpha orbit,0.1 EntityAutoFade orbit,1,100 ; increase planet's moon counter S\planet[parent]\MOONS=S\planet[parent]\MOONS+1 ; add moon S\planet[parent]\moon[S\planet[parent]\MOONS]=MOONcreate(S\planet[parent]\MOONS,parent%,name$,radius#,period#,size#,r%,g%,b%,speed,entity,random,orbit) Next End Function ;=========================================================================== ; update object positions ;=========================================================================== Function UpdateObjects() Local p.Planet,m.Moon,i% For p.Planet = Each Planet UpdatePlanet(p\id) ; only show text if object is in view or text flag enabled If EntityInView(p\entity,CAM) And INFO Then CameraProject CAM,EntityX(p\entity),EntityY(p\entity),EntityZ(p\entity) Text ProjectedX(),ProjectedY(),p\name,1 EndIf For i=1 To p\MOONS m.Moon = MOONdata(p\id,i) If m<>Null Then UpdateMoon(p\id,m\id) ; only show text if object is in view or text flag enabled If EntityInView(m\entity,CAM) And INFO And EntityDistance(CAM,m\entity)<100*ZOOM Then CameraProject CAM,EntityX(m\entity),EntityY(m\entity),EntityZ(m\entity) Text ProjectedX(),ProjectedY(),m\name,1 EndIf EndIf Next Next End Function ;=========================================================================== ; create a planet object ;=========================================================================== Function PLANETcreate.Planet(id%,parent%,name$,radius#,period#,size#,r%,g%,b%,speed#,entity%,random%) Local p.Planet = New Planet p\id=id p\parent=parent p\name=name p\radius=radius p\period=period p\size=size p\r=r p\g=g p\b=b p\SPEED=speed p\entity=entity p\random=random Return p End Function ;=========================================================================== ; create a moon object ;=========================================================================== Function MOONcreate.Moon(id%,parent%,name$,radius#,period#,size#,r%,g%,b%,speed#,entity%,random%,orbit%) Local m.Moon = New Moon m\id=id m\parent=parent m\name=name m\radius=radius m\period=period m\size=size m\r=r m\g=g m\b=b m\SPEED=speed m\entity=entity m\random=random m\orbit=orbit Return m End Function ;=========================================================================== ; return a moon object handle ;=========================================================================== Function MOONdata.Moon(planet,moon) Return S\planet[planet]\moon[moon] End Function ;=========================================================================== ; return a planet object handle ;=========================================================================== Function PLANETdata.Planet(planet) Return S\planet[planet] End Function ;=========================================================================== ; update a single planet object position according to time ;=========================================================================== Function UpdatePlanet(id%) Local radiusx#,radiusy# Local xcos#=Cos(360) Local xsin#=Sin(360) Local tmpx#,tmpy# Local p.Planet= PLANETdata(id) radiusx=p\radius radiusy=p\radius tmpx#=(Cos((DAYS*(360.0/YEAR)*p\SPEED)+p\random)*radiusx#) tmpy#=(Sin((DAYS*(360.0/YEAR)*p\SPEED)+p\random)*radiusy#) PositionEntity p\entity,tmpx#*xcos#+tmpy*-xsin#,0,tmpx#*xsin#+tmpy*xcos# End Function ;=========================================================================== ; update a single moon object position according to time ;=========================================================================== Function UpdateMoon(planet%,id%) Local radiusx#,radiusy# Local xcos#=Cos(360) Local xsin#=Sin(360) Local tmpx#,tmpy#,addx#,addy#,addz# Local p.Planet = PLANETdata(planet) Local m.Moon= MOONdata(planet,id) radiusx=m\radius radiusy=m\radius addx=EntityX(p\entity) addy=EntityY(p\entity) addz=EntityZ(p\entity) tmpx#=(Cos((DAYS*(360.0/YEAR)*m\SPEED)+m\random)*radiusx#)+addx tmpy#=(Sin((DAYS*(360.0/YEAR)*m\SPEED)+m\random)*radiusy#)+addz PositionEntity m\entity,tmpx#*xcos#+tmpy*-xsin#,addy,tmpx#*xsin#+tmpy*xcos# PositionEntity m\orbit,addx,addy,addz End Function ;=========================================================================== ; round cut a value for better display ;=========================================================================== Function Round$(value$,digits%=1) Local midpoint%=Instr(value,".") Local prefix$,suffix$,zero%,i% If midpoint Then prefix=Mid(value,1,midpoint-1) suffix=Mid(value,midpoint+1,Len(value)) suffix=Mid(suffix,1,digits) zero=digits-Len(suffix) For i=1 To zero : suffix=suffix+"0" : Next Else prefix=Int(value) For i=1 To digits : suffix=suffix+"0" : Next EndIf Return prefix+"."+suffix End Function ;=========================================================================== ; create a wireframe orbit mesh ;=========================================================================== Function CreateOrbit(segments%,mesh=0,r1#=1,r2#=1.5,r%=255,g%=255,b%=255,a#=1.0,sx#=0.0,sy#=0.0,sz#=0.0) Local la#,na#,i% For i = 1 To segments na=la+(360.0/segments) mesh=CreateLine(mesh,(Cos(la)*r1)+sx,sy,(Sin(la)*r2)+sz,(Cos(na)*r1)+sx,sy,(Sin(na)*r2)+sz,r,g,b,a) la=na Next Return mesh End Function ;=========================================================================== ; create a single wireframe line ;=========================================================================== Function CreateLine(mesh,x0#,y0#,z0#,x1#,y1#,z1#,r%=255,g%=255,b%=255,a#=1.0) Local surf%,v1%,v2% If mesh Then surf=GetSurface(mesh,1) Else mesh = CreateMesh() surf = CreateSurface(mesh) EntityFX mesh,1+2+16+32 End If v1=AddVertex(surf,x1,y1,z1) v2=AddVertex(surf,x0,y0,z0) AddTriangle surf,v1,v1,v2 VertexColor surf,v1,r,g,b,a VertexColor surf,v2,r,g,b,a Return mesh End Function ;========================================================================== ; create a quad ;=========================================================================== Function CreateQuad(parent%=False,scale#=1.0,tex%=False,blend%=False,fx%=False,r%=255,g%=255,b%=255,a#=1.0) Local mesh%=CreateMesh() Local surf%=CreateSurface(mesh) Local v0%=AddVertex(surf, 1, 1,0,0,0) Local v1%=AddVertex(surf,-1, 1,0,1,0) Local v2%=AddVertex(surf,-1,-1,0,1,1) Local v3%=AddVertex(surf, 1,-1,0,0,1) AddTriangle surf,v0,v1,v2 AddTriangle surf,v0,v2,v3 If parent Then EntityParent mesh,parent If fx Then EntityFX mesh,fx If tex Then EntityTexture mesh,tex If blend Then EntityBlend mesh,blend EntityColor mesh,r,g,b EntityAlpha mesh,a VertexColor surf,v0,r,g,b,a VertexColor surf,v1,r,g,b,a VertexColor surf,v2,r,g,b,a VertexColor surf,v3,r,g,b,a ScaleEntity mesh,scale,scale,scale Return mesh End Function ;========================================================================== ; create sun texture ;=========================================================================== Function CreateSunTexture() Local tex%=CreateTexture(512,512,3) Local tb%=TextureBuffer(tex) Local i#,j%,col%,rgb% SetBuffer tb LockBuffer tb For j=0 To 255 col=255-j If col>255 Then col=255 rgb=col*$1000000+col*$10000+col*$100+col For i=0 To 360 Step 0.1 WritePixelFast 256+(Sin(i)*j),256+(Cos(i)*j),rgb,tb Next Next UnlockBuffer tb SetBuffer BackBuffer() Return tex End Function .PLANETDATA ;========================================================================== ; Parent Name Radius Period Size R G B ;========================================================================== Data 0 , "Mercury" , 57.909 , 87.989 , 4.878 , 255 , 128 , 0 Data 0 , "Venus" , 108.160 , 224.701 , 5.000 , 255 , 255 , 0 Data 0 , "Earth" , 149.600 , 365.256 , 12.756 , 0 , 0 , 255 Data 0 , "Mars" , 227.990 , 686.980 , 6.794 , 255 , 0 , 0 Data 0 , "Jupiter" , 778.360 , 4331.936 , 142.984 , 255 , 192 , 0 Data 0 , "Saturn" , 1433.400 , 10759.346 , 120.536 , 255 , 224 , 0 Data 0 , "Uranus" , 2872.400 , 30685.522 , 51.118 , 0 , 128 , 255 Data 0 , "Neptune" , 4495.000 , 60190.536 , 49.528 , 0 , 255 , 255 Data 0 , "Pluto" , 5906.400 , 90466.606 , 2.390 , 255 , 255 , 255 ;========================================================================== ; Parent Name Radius Period Size R G B ;========================================================================== .MOONDATA Data 3 , "Moon" , 1.000 , 1.000 , 3.476 , 255 , 255 , 255 Data 4 , "Phobos" , 1.000 , 1.000 , 0.027 , 255 , 255 , 255 Data 4 , "Deimos" , 2.000 , 2.000 , 0.015 , 255 , 255 , 255 Data 5 , "Amalthea" , 1.000 , 1.000 , 0.167 , 255 , 255 , 255 Data 5 , "Io" , 2.000 , 2.000 , 3.643 , 255 , 255 , 255 Data 5 , "Europa" , 3.000 , 4.000 , 3.122 , 255 , 255 , 255 Data 5 , "Ganymede" , 4.000 , 8.000 , 5.262 , 255 , 255 , 255 Data 5 , "Callisto" , 5.000 , 16.000 , 4.821 , 255 , 255 , 255 Data 5 , "Leda" , 6.000 , 32.000 , 0.020 , 255 , 255 , 255 Data 5 , "Himalia" , 7.000 , 64.000 , 0.170 , 255 , 255 , 255 Data 5 , "Elara" , 8.000 , 128.000 , 0.086 , 255 , 255 , 255 Data 5 , "Pasiphae" , 9.000 , 256.000 , 0.056 , 255 , 255 , 255 Data 6 , "Mimas" , 1.000 , 1.000 , 0.397 , 255 , 255 , 255 Data 6 , "Enceladus" , 2.000 , 2.000 , 0.504 , 255 , 255 , 255 Data 6 , "Tethys" , 3.000 , 4.000 , 1.060 , 255 , 255 , 255 Data 6 , "Dione" , 4.000 , 8.000 , 1.127 , 255 , 255 , 255 Data 6 , "Rhea" , 5.000 , 16.000 , 1.528 , 255 , 255 , 255 Data 6 , "Titan" , 6.000 , 32.000 , 5.150 , 255 , 255 , 255 Data 6 , "Hyperion" , 7.000 , 64.000 , 0.266 , 255 , 255 , 255 Data 6 , "Iapetus" , 8.000 , 128.000 , 1.436 , 255 , 255 , 255 Data 6 , "Phoebe" , 9.000 , 256.000 , 0.220 , 255 , 255 , 255 Data 7 , "Miranda" , 1.000 , 1.00 , 0.472 , 255 , 255 , 255 Data 7 , "Ariel" , 2.000 , 2.00 , 1.158 , 255 , 255 , 255 Data 7 , "Umbriel" , 3.000 , 4.00 , 1.169 , 255 , 255 , 255 Data 7 , "Titania" , 4.000 , 8.00 , 1.578 , 255 , 255 , 255 Data 7 , "Oberon" , 5.000 , 16.00 , 1.523 , 255 , 255 , 255 Data 8 , "Triton" , 1.000 , 1.00 , 2.707 , 255 , 255 , 255 Data 8 , "Nereid" , 2.000 , 2.00 , 0.340 , 255 , 255 , 255 Data 9 , "Charon" , 1.000 , 1.00 , 1.212 , 255 , 255 , 255 |
||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke aber ich bin zum entschluss gekommen auf das pysikalische größtenteils zu verzichten,bin erst in der 8 und gut in Pysik aber man solls ja nicht übertreiben ![]() Trotzdem danke! MFG Sephka |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also Beispiel 1 ist schon recht anschaulich. Der Rest war nur damit Du siehst was gehen kann. | ||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
So Krischan ich hab deine Code etwas modifiziert und würd gern wissen wie ich mache das die planeten nicht
eine zu flache bahn machen (z.b höhe der Bahn 2 Breite 100) MFG Sephka Code: [AUSKLAPPEN] Graphics 800,600,16,2
AppTitle "PLANETON" SetBuffer BackBuffer() ;Zufall SeedRnd(MilliSecs()) ;Types Type Tplanet Field name$ Field Radius# Field Aphel# Field Perihel Field synodper Field groesse Field rot,gruen,blau End Type ;Planeten erstellen For z=1 To 3 planet.tplanet = New tplanet planet\name$ = "Joonass" planet\Radius = Rnd(20,7000) planet\Aphel = Rnd(1,2) planet\perihel = Rnd(0.3,1) planet\synodper = Rnd(1000,100000) planet\groesse = Rnd(2,1200) planet\rot = 255 Next ;Parameter festlegen mx=GraphicsWidth()/2 my=GraphicsHeight()/2 zoom#=100 zeit#=1 ;1 Jahr = Umlaufzeit Erde ;jahr#=360/(365.256/Float(planeten$(3,4))) ;Fonts laden font1=LoadFont("System",16,0,0,0) font2=LoadFont("Small Fonts",10,0,0,0) ;Hauptschleife While Not KeyHit(1) ;Tastatursteuerung If KeyDown(208) Then zoom#=zoom#+10 If KeyDown(200) Then zoom#=zoom#-10 If KeyDown(205) Then zeit#=zeit#+(zoom#/1000) If KeyDown(203) Then zeit#=zeit#-(zoom#/1000) ;Begrenzungen If zoom#<25 Then zoom#=25 If zoom#>3000 Then zoom#=3000 If zeit#<1 Then zeit#=1 If zeit>1000 Then zeit#=1000 ; Bildschirm leeren Cls ;alle Objekte durchgehen For planet.Tplanet = Each Tplanet ;Daten aus den Feldern lesen name$=planet\name$ dist#=Float(planet\radius)/zoom#*100 aphel#=Float(planet\aphel) perihel#=Float(planet\perihel) speed#=365.256/Float(planet\synodper) size#=Float(planet\groesse)/zoom# If size#<5 Then size#=5 r=Int(planet\rot) g=Int(planet\gruen) b=Int(planet\blau) ;aktuellen Planet einzeichnen zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,360,r,g,b,font2) Next ;Winkel erhöhen i#=i#+zeit# SetFont font1 ;abgelaufene Zeit in Erdjahren zeigen Color 255,255,255 Text 0,0,"Erdumläufe:":Text 100,0,i#/jahr# Text 0,15,"Zoom:":Text 100,15,Int(zoom#) Text 0,30,"Speed:":Text 100,30,zeit# ;Bufferswitch Flip 1 Wend End .planeten ; -------------------------------------------------------------------------------- ; Daten der einzelnen Planeten, aus denen die Szene berechnet wird ; frei aus der Wikipedia übernommen bzw. umgerechnet ; -------------------------------------------------------------------------------- ; Name Radius Aphel Perihel synod.Per. Grösse Rot Grün Blau ; -------------------------------------------------------------------------------- Data "Sonne" , 0.0 , 1.000 , 1.000 , 1.000 , 1392.000 , 255 , 255 , 0 Data "Merkur" , 38.7 , 1.206 , 0.794 , 87.989 , 4.878 , 255 , 128 , 0 Data "Venus" , 108.2 , 1.007 , 0.993 , 224.701 , 5.000 , 255 , 255 , 0 Data "Erde" , 149.6 , 1.017 , 0.983 , 365.256 , 12.756 , 0 , 0 , 255 Data "Mars" , 227.9 , 1.093 , 0.906 , 686.980 , 6.794 , 255 , 0 , 0 Data "Jupiter" , 778.6 , 1.049 , 0.951 , 4332.589 , 142.984 , 255 , 192 , 0 Data "Saturn" ,1514.6 , 1.057 , 0.944 , 10759.346 , 120.536 , 255 , 224 , 0 Data "Uranus" ,3003.6 , 1.046 , 0.954 , 30685.400 , 51.118 , 0 , 128 , 255 Data "Neptun" ,4545.7 , 1.011 , 0.989 , 60267.240 , 49.248 , 0 , 255 , 255 Data "Pluto" ,7304.3 , 1.244 , 0.756 , 90465.000 , 2.390 , 255 , 255 , 255 ; -------------------------------------------------------------------------------- ;Planet an einer bestimmten Stelle mit Kreisbahn zeichnen Function zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,angle#,r,g,b,font) ;Vorberechnungen radiusx#=dist#*aphel# radiusy#=dist#*perihel# i#=i#*speed# ;mittleren Bahnradius einzeichnen Color 32,32,32 Oval mx-(dist#),my-(dist#),dist#*2,dist#*2,0 ;Ellipsenposition berechnen xcos#=Cos#(angle#) xsin#=Sin#(angle#) tmpx#=Cos#(i#)*radiusx# tmpy#=Sin#(i#)*-radiusy# x#=tmpx#*xcos#+tmpy*-xsin# y#=tmpx#*xsin#+tmpy*xcos# ;elliptischen Bahnradius einzeichnen Color r/4,g/4,b/4 Oval mx-radiusx#,my-radiusy,radiusx#*2,radiusy#*2,0 ;Planet auf Ellipsenposition zeichnen Color r,g,b Oval mx+x#-(size#/2),my+y#-(size#/2),size#,size#,1 ;Planetennamen über dem Objekt einzeichnen SetFont font Text mx+x#,my+y#-(size#/2)-5,name$,1,1 End Function |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sephka hat Folgendes geschrieben: So Krischan ich hab deine Code etwas modifiziert und würd gern wissen wie ich mache das die planeten nicht eine zu flache bahn machen (z.b höhe der Bahn 2 Breite 100)
Verstehe ich nicht ganz. Meinst Du dass es runde Kreise und keine Ellipsen sein sollen oder dass die Planeten eine realistische Entfernung ähnlich unserem Sonnensystem bekommen? |
||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sie sollen pysikalisch möglich sein(die Umlaufbahnen)
Und nicht so: ######################## ##--------------------------------------## ###-------------------------------------## ######################## - = Umlaufbahn # = universum Mfg Sephka |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also realistisch. Dann kannst Du mit der Titius-Bode-Reihe arbeiten:
planet\Radius=(4+3*2^(z-1))*10 Das sollte je nach Planetennummer (1-x) eine realistische Entfernung ergeben (wobei natürlich die inneren Planeten schneller fliegen müssen als die äusseren!), also auch die synodische Periode am Planetenindex festmachen: planet\synodper = z*100 EDITH: ach und Deine Aphel/Perihel Werte sind viel zu gross, bewege Dich mal im Bereich wie in meinem Datafield, also höchstens 1/100 bis 1/10 Abweichung von 1.0. Also: planet\Aphel = Rnd(0.9,1.1) planet\perihel = Rnd(0.9,1.1) Wenn Du gar keine elliptischen sondern runde Bahnen möchtest kannst Du die beiden Felder auch weglassen, musst aber in der zeichneplanet Funktion die ersten beiden Zeilen so abändern: radiusx#=dist# radiusy#=dist# |
||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt immer noch planeten dies sich fast auf einer linie bewegen.
Code: [AUSKLAPPEN] ;Planeten erstellen
For z=1 To 5 planet.tplanet = New tplanet planet\name$ = GenerateName(2,8) planet\Radius = (4+3*2^(z-1))*10 planet\Aphel = Rnd(1,2) planet\perihel = Rnd(0.3,1) planet\synodper = z*100 planet\groesse = Rnd(2,1200) planet\rot = Rnd(0,255) planet\gruen = Rnd(0,255) planet\blau = Rnd(0,255) Next So siehst hetzt bei mir aus MFG Sephka |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hatte meinen Beitrag zwischenzeitlich noch nacheditiert, hier mal alles zusammengefügt und les noch mal was bei "EDITH" steht:
Code: [AUSKLAPPEN] Graphics 800,600,16,2
AppTitle "PLANETON" SetBuffer BackBuffer() ;Zufall SeedRnd(MilliSecs()) ;Types Type Tplanet Field name$ Field Radius# Field Aphel# Field Perihel# Field synodper# Field groesse# Field rot%,gruen%,blau% End Type ;Planeten erstellen For z=1 To 3 planet.tplanet = New Tplanet planet\name$ = "Joonass" ;planet\Radius = Rnd(20,7000) planet\Radius=(4+3*2^(z-1))*10 planet\Aphel = Rnd(0.9,1.1) planet\perihel = Rnd(0.9,1.1) planet\synodper = z*100;Rnd(1000,100000) planet\groesse = Rnd(2,1200) planet\rot = 255 Next ;Parameter festlegen mx=GraphicsWidth()/2 my=GraphicsHeight()/2 zoom#=100 zeit#=1 ;1 Jahr = Umlaufzeit Erde ;jahr#=360/(365.256/Float(planeten$(3,4))) ;Fonts laden font1=LoadFont("System",16,0,0,0) font2=LoadFont("Small Fonts",10,0,0,0) ;Hauptschleife While Not KeyHit(1) ;Tastatursteuerung If KeyDown(208) Then zoom#=zoom#+10 If KeyDown(200) Then zoom#=zoom#-10 If KeyDown(205) Then zeit#=zeit#+(zoom#/1000) If KeyDown(203) Then zeit#=zeit#-(zoom#/1000) ;Begrenzungen If zoom#<25 Then zoom#=25 If zoom#>3000 Then zoom#=3000 If zeit#<1 Then zeit#=1 If zeit>1000 Then zeit#=1000 ; Bildschirm leeren Cls ;alle Objekte durchgehen For planet.Tplanet = Each Tplanet ;Daten aus den Feldern lesen name$=planet\name$ dist#=Float(planet\radius)/zoom#*100 aphel#=Float(planet\aphel) perihel#=Float(planet\perihel) speed#=365.256/Float(planet\synodper) size#=Float(planet\groesse)/zoom# If size#<5 Then size#=5 r=Int(planet\rot) g=Int(planet\gruen) b=Int(planet\blau) ;aktuellen Planet einzeichnen zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,360,r,g,b,font2) Next ;Winkel erhöhen i#=i#+zeit# SetFont font1 ;abgelaufene Zeit in Erdjahren zeigen Color 255,255,255 Text 0,0,"Erdumläufe:":Text 100,0,i#/jahr# Text 0,15,"Zoom:":Text 100,15,Int(zoom#) Text 0,30,"Speed:":Text 100,30,zeit# ;Bufferswitch Flip 1 Wend End .planeten ; -------------------------------------------------------------------------------- ; Daten der einzelnen Planeten, aus denen die Szene berechnet wird ; frei aus der Wikipedia übernommen bzw. umgerechnet ; -------------------------------------------------------------------------------- ; Name Radius Aphel Perihel synod.Per. Grösse Rot Grün Blau ; -------------------------------------------------------------------------------- Data "Sonne" , 0.0 , 1.000 , 1.000 , 1.000 , 1392.000 , 255 , 255 , 0 Data "Merkur" , 38.7 , 1.206 , 0.794 , 87.989 , 4.878 , 255 , 128 , 0 Data "Venus" , 108.2 , 1.007 , 0.993 , 224.701 , 5.000 , 255 , 255 , 0 Data "Erde" , 149.6 , 1.017 , 0.983 , 365.256 , 12.756 , 0 , 0 , 255 Data "Mars" , 227.9 , 1.093 , 0.906 , 686.980 , 6.794 , 255 , 0 , 0 Data "Jupiter" , 778.6 , 1.049 , 0.951 , 4332.589 , 142.984 , 255 , 192 , 0 Data "Saturn" ,1514.6 , 1.057 , 0.944 , 10759.346 , 120.536 , 255 , 224 , 0 Data "Uranus" ,3003.6 , 1.046 , 0.954 , 30685.400 , 51.118 , 0 , 128 , 255 Data "Neptun" ,4545.7 , 1.011 , 0.989 , 60267.240 , 49.248 , 0 , 255 , 255 Data "Pluto" ,7304.3 , 1.244 , 0.756 , 90465.000 , 2.390 , 255 , 255 , 255 ; -------------------------------------------------------------------------------- ;Planet an einer bestimmten Stelle mit Kreisbahn zeichnen Function zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,angle#,r,g,b,font) ;Vorberechnungen radiusx#=dist#*aphel# radiusy#=dist#*perihel# i#=i#*speed# ;mittleren Bahnradius einzeichnen Color 32,32,32 Oval mx-(dist#),my-(dist#),dist#*2,dist#*2,0 ;Ellipsenposition berechnen xcos#=Cos#(angle#) xsin#=Sin#(angle#) tmpx#=Cos#(i#)*radiusx# tmpy#=Sin#(i#)*-radiusy# x#=tmpx#*xcos#+tmpy*-xsin# y#=tmpx#*xsin#+tmpy*xcos# ;elliptischen Bahnradius einzeichnen Color r/4,g/4,b/4 Oval mx-radiusx#,my-radiusy,radiusx#*2,radiusy#*2,0 ;Planet auf Ellipsenposition zeichnen Color r,g,b Oval mx+x#-(size#/2),my+y#-(size#/2),size#,size#,1 ;Planetennamen über dem Objekt einzeichnen SetFont font Text mx+x#,my+y#-(size#/2)-5,name$,1,1 End Function |
||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Graphics 800,600,16,2
AppTitle "PLANETON" SetBuffer BackBuffer() ;Zufall SeedRnd(MilliSecs()) ;Types Type Tplanet Field name$ Field Radius# Field Aphel# Field Perihel Field synodper Field groesse Field rot,gruen,blau End Type ;Einen Stern erstellen planet.tplanet = New tplanet planet\name$ = "Helios" planet\Radius = 0 planet\Aphel = 0 planet\perihel = 0 planet\synodper = 1 planet\groesse = 2000 planet\rot = 220 planet\gruen = 125 planet\blau = 0 ;Planeten erstellen For z=1 To 5 planet.tplanet = New tplanet planet\name$ = GenerateName(2,8) planet\Radius = (4+3*2^(z-1))*10 planet\Aphel = Rnd(0.9,1.1) planet\perihel = Rnd(0.9,1.1) planet\synodper = z*100 planet\groesse = Rnd(2,1200) planet\rot = Rnd(0,255) planet\gruen = Rnd(0,255) planet\blau = Rnd(0,255) Next ;Parameter festlegen mx=GraphicsWidth()/2 my=GraphicsHeight()/2 zoom#=100 zeit#=1 ;1 Jahr = Umlaufzeit Erde ;jahr#=360/(365.256/Float(planeten$(3,4))) ;Fonts laden font1=LoadFont("System",16,0,0,0) font2=LoadFont("Small Fonts",10,0,0,0) ;Hauptschleife While Not KeyHit(1) ;Tastatursteuerung If KeyDown(208) Then zoom#=zoom#+10 If KeyDown(200) Then zoom#=zoom#-10 If KeyDown(205) Then zeit#=zeit#+(zoom#/1000) If KeyDown(203) Then zeit#=zeit#-(zoom#/1000) ;Begrenzungen If zoom#<25 Then zoom#=25 If zoom#>3000 Then zoom#=3000 If zeit#<1 Then zeit#=1 If zeit>1000 Then zeit#=1000 ; Bildschirm leeren Cls ;alle Objekte durchgehen For planet.Tplanet = Each Tplanet ;Daten aus den Feldern lesen name$=planet\name$ dist#=Float(planet\radius)/zoom#*100 aphel#=Float(planet\aphel) perihel#=Float(planet\perihel) speed#=365.256/Float(planet\synodper) size#=Float(planet\groesse)/zoom# If size#<5 Then size#=5 r=Int(planet\rot) g=Int(planet\gruen) b=Int(planet\blau) ;aktuellen Planet einzeichnen zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,360,r,g,b,font2) Next ;Winkel erhöhen i#=i#+zeit# SetFont font1 ;abgelaufene Zeit in Erdjahren zeigen Color 255,255,255 Text 0,0,"Erdumläufe:":Text 100,0,i#/jahr# Text 0,15,"Zoom:":Text 100,15,Int(zoom#) Text 0,30,"Speed:":Text 100,30,zeit# ;Bufferswitch Flip 1 Wend End ;Planet an einer bestimmten Stelle mit Kreisbahn zeichnen Function zeichneplanet(mx,my,name$,dist#,aphel#,perihel#,speed#,size#,i#,angle#,r,g,b,font) ;Vorberechnungen radiusx#=dist#*aphel# radiusy#=dist#*perihel# i#=i#*speed# ;mittleren Bahnradius einzeichnen Color 32,32,32 ;Oval mx-(dist#),my-(dist#),dist#*2,dist#*2,0 ;Ellipsenposition berechnen xcos#=Cos#(angle#) xsin#=Sin#(angle#) tmpx#=Cos#(i#)*radiusx# tmpy#=Sin#(i#)*-radiusy# x#=tmpx#*xcos#+tmpy*-xsin# y#=tmpx#*xsin#+tmpy*xcos# ;elliptischen Bahnradius einzeichnen Color 255,255,255 Oval mx-radiusx#,my-radiusy,radiusx#*2,radiusy#*2,0 ;Planet auf Ellipsenposition zeichnen Color r,g,b Oval mx+x#-(size#/2),my+y#-(size#/2),size#,size#,1 ;Planetennamen über dem Objekt einzeichnen SetFont font Text mx+x#,my+y#-(size#/2)-5,name$,1,1 End Function Function GenerateName$(min, max) Local name$, char, vowel, length vowel = Rand(0, 1) length = Rand(min, max) For x = 1 To length vowel = Not vowel If vowel Repeat char = Rand(95, 122) Until (char <> Asc("a")) And (char <> Asc("e")) And (char <> Asc("i")) And (char <> Asc("o")) And (char <> Asc("u")) Else Select Rand(1, 5) Case 1 char = 97 Case 2 char = 101 Case 3 char = 105 Case 4 char = 111 Case 5 char = 117 End Select EndIf name = name + Chr(char) Next name= Replace(name, "q", "qu") name= Replace(name, Chr(96), "sch") name= Replace(name, Chr(95), "ch") name = Upper(Mid(name, 1,1)) + Mid(name,2) Return name End Function So funktioniert es.Hast du noch nen Tipp es noch etwas realistischer zu machen? |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ach und beim Deklarieren der Typefields am besten gleich definieren was Integer und was Float ist, der Perihel-Wert wird mit RND bestimmt, ist aber im Type-Field ohne # angegeben, also Integer. Der ist dann immer 0 oder 1, änder das mal so ab:
Type Tplanet Field name$ Field Radius# Field Aphel# Field Perihel# Field synodper# Field groesse# Field rot%,gruen%,blau% End Type |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ist doch realistisch genug, oder? Ansonsten kannst Du Dich mal an meinem dritten, 3D-Beispiel versuchen, da fliegen noch Monde um die Planeten herum. Aber das ist dann wirklich keine Anfängergeschichte mehr. Und es ist halt 3D, müsste man auch erst auf 2D umbauen. | ||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
ehhm die Sonne hat ja bestimmt eine bestimmte strahlungszone,also die Zone in der leben auf dem Planet nicht nötig ist.
Also wie berechne ich in welcher entfernung der Sonne welche Tempereatur und schädliche strahlung ist(ich möchte ein art spiel machen). Mfg Sephka |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kommt ehrlich gesagt auf den Sonnentyp an, wenn Du es glaubwürdig haben willst, guck mal hier: Habitable Zone
![]() Bei einem kleinen Stern mit geringer Masse/Strahlung ist die natürlich näher als bei einem Superstern. Wenn Du es ganz genau wissen willst eignen sich vermutlich sowieso nur "normale" Sterne wie unsere Sonne, ggf. noch die Klassen darüber/darunter für Leben, da die anderen zu schwach oder zu schnell ausgebrannt sind bzw. zu stark strahlen. Kommt drauf an was Du in Deinem Spiel machen willst. |
||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab die Idee das mann (ganz simpel) in seinem Sonnensytstem planeten erobern kann... udn dann in neue galaxien kommt...usw.
1.Wie erechne ich wie viele Tage ein Planet für einmal Stern umkreisen brauch 2.Darf ich dein Galaxie benutztn(diese Grafik) 3..Hast du ne seite wo son zeug steht außer Wikipedia? MFG Sephka und Danke |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. das müsste die planet\synodper sein (wobei die Bezeichnung falsch ist, das ist eher die Siderische Periode, die ist bei der Erde z.B. 365,256 Tage = 1 Erdjahr)
2. was für eine Grafik? 3. Wikipedia hat mir bislang immer gereicht |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group