Planeten-Umlaufbahn [2D]

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Sephka

Betreff: Planeten-Umlaufbahn [2D]

BeitragDo, Sep 16, 2010 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 16, 2010 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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/

BladeRunner

Moderator

BeitragDo, Sep 16, 2010 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
sin cos
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

BeitragDo, Sep 16, 2010 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 16, 2010 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink .
Trotzdem danke!
MFG Sephka
 

Krischan

BeitragFr, Sep 17, 2010 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also Beispiel 1 ist schon recht anschaulich. Der Rest war nur damit Du siehst was gehen kann.

Sephka

BeitragFr, Sep 17, 2010 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Sie sollen pysikalisch möglich sein(die Umlaufbahnen)
Und nicht so:
########################
##--------------------------------------##
###-------------------------------------##
########################
- = Umlaufbahn
# = universum
Mfg Sephka
 

Krischan

BeitragFr, Sep 17, 2010 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Kommt ehrlich gesagt auf den Sonnentyp an, wenn Du es glaubwürdig haben willst, guck mal hier: Habitable Zone

user posted image

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

BeitragFr, Sep 17, 2010 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Sep 17, 2010 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group