Seite 2 von 2

Verfasst: 22.01.2008 22:31
von Riacon

Code: Alles auswählen

Structure planet
  name$
  farbe.l
  radius.d
  masse.d
  x.d
  y.d
  speed.d
  richtung.d  ;in bogenmaß: 360° = 2*#pi
EndStructure


Global NewList planet.planet()


#Window_0=0
#ScrollArea_0=0

#zoom=100000  ;vergrößert/verkleinert alles
#lupe=50  ;vergrößert/verkleinert nur die planeten
#grav=6.67428e-11 ;"m^3/(kg*sec^2)"
#x_offset=50 ;verschiebt die x-achse richtg. bildsschirmmitte
#y_offset=400 ;verschiebt die y-achse richtg. bildsschirmmitte




Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 800, 600, "Gravitation",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ScrollAreaGadget(#ScrollArea_0, 0, 0, 1284, 748, 8192, 8192, 10)
      ImageGadget(1, 0, 0, 8192, 8192, ImageID(1))
      CloseGadgetList()
    EndIf
  EndIf
EndProcedure



If AddElement(planet())<>0
  planet()\name$="erde"
  planet()\farbe=RGB(0,50,250)
  planet()\radius=#lupe*(12756+12714)/4 ;mittlerer radius in km
  planet()\masse=5.974e23 ;kg
  planet()\x=1.496e8  ;mittlerer sonnenabstand in km
  planet()\y=0
  planet()\speed=29.78  ;km/sec
  planet()\richtung=2*#PI
EndIf

If AddElement(planet())<>0
  planet()\name$="sonne"
  planet()\farbe=RGB(250,250,0)
  planet()\radius=#lupe*1.3914e6/2 ;km
  planet()\masse=1.989e30 ;kg
  planet()\x=0
  planet()\y=0
  planet()\speed=0  ;km/sec
  planet()\richtung=0
EndIf

If AddElement(planet())<>0
  planet()\name$="mond"
  planet()\farbe=RGB(75,75,75)
  planet()\radius=#lupe*3476/2 ;km
  planet()\masse=7.349e22 ;kg
  planet()\x=1.496e8+(363200+405500)/2
  planet()\y=0
  planet()\speed=1.023+29.78  ;km/sec (rel. zur sonne)
  planet()\richtung=2*#PI
EndIf

If AddElement(planet())<>0
  planet()\name$="venus"
  planet()\farbe=RGB(200, 200, 200)
  planet()\radius=#lupe*(12103.6+12103.6)/4 ;km
  planet()\masse=4.869e24 ;kg
  planet()\x=108210000
  planet()\y=0
  planet()\speed=35.02  ;km/sec
  planet()\richtung=2*#PI
EndIf

If AddElement(planet())<>0
  planet()\name$="merkur"
  planet()\farbe=RGB(75,75,75)
  planet()\radius=#lupe*(4879+4879)/4 ;km
  planet()\masse=3.302e23 ;kg
  planet()\x=57910000
  planet()\y=0
  planet()\speed=47.87  ;km/sec
  planet()\richtung=2*#PI
EndIf

If AddElement(planet())<>0
  planet()\name$="jupiter"
  planet()\farbe=RGB(200, 100, 50)
  planet()\radius=#lupe*(142984+133708)/4 ;km
  planet()\masse=1.899e27 ;kg
  planet()\x=778570000
  planet()\y=0
  planet()\speed=13.07  ;km/sec
  planet()\richtung=2*#PI
EndIf

If AddElement(planet())<>0
  planet()\name$="mars"
  planet()\farbe=RGB(200, 50, 50)
  planet()\radius=#lupe*(6794+6750)/4 ;km
  planet()\masse=6.419e23 ;kg
  planet()\x=227920000
  planet()\y=0
  planet()\speed=24.13  ;km/sec
  planet()\richtung=2*#PI
EndIf




;******************* main ********************
;open_window_0()

;Repeat
;StartDrawing(WindowOutput(0))
      
;ResetList(planet())
;While NextElement(planet())
;  Circle((planet()\x)/#zoom+#x_offset, planet()\y/#zoom+#y_offset, planet()\radius/#zoom, planet()\farbe)
;Wend
    
;StopDrawing()
;Until WaitWindowEvent() = #PB_Event_CloseWindow
;****************** main **********************


;****************** main **********************
CreateImage(1, 8192, 1000, #PB_Image_DisplayFormat)

ResetList(planet())
StartDrawing(ImageOutput(1))
While NextElement(planet())
  Circle((planet()\x)/#zoom+#x_offset, planet()\y/#zoom+#y_offset, planet()\radius/#zoom, planet()\farbe)
Wend
StopDrawing()

open_window_0()
Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
;****************** main **********************


End
direkt aufs fenster zu zeichnen klappt irgendwie nicht. deswegen mit einem imagegadget. das sonnensystem ist halt bloß ein bißchen groß. sprites klingt interessant, muß ich mir mal anschauen.

irgendwann soll sich das ganze natürlich auch drehen, am besten in 3d

Verfasst: 23.01.2008 18:46
von Kaeru Gaman
yo, dann nimm nen WindowedScreen und Sprites, da fährste besser,
und bist gleich auf ner Game-Oberfläche die ganz anders
programmiert werden muss als ein reines Fensterle.

um direkt auf ein Window zu zeichnen, musst du ein Redraw-Callback mit einbaun,
der also bei Bedarf deinen krempel neu zeichnet.
auch ein ImageGadget könntest du ja nicht komplett darstellen,
also bräuchtest du ja wohl sowieso ne ScrollArea,
dort könntest du dann doch auch mehrere Images reinpacken,
die jeweils nur die Planeten darstellen.

aber wenn du das auf nem (Windowed-)Screen machst,
ist es insgesamt wesentlich einfacher.

Verfasst: 23.01.2008 20:17
von hardfalcon
Darf man fragen, welchen Zweck das Ganze eigentlich haben wird? Ausdrucken geht nicht (es sei denn, du druckst auf Endlospapier, allerdings schaut ein 10 Meter langer und 20cm breiter Ausdruck vielleicht etwas lächerlich aus). Um es maßstabsgetreu darstellen zu können, müsstest du vermutlich die halbe 5th Avenue mit Displays zukleistern (zumindest wenn man die Erde da noch erkennen soll).
Ansonsten könnte ich mir höchstens noch vorstellen, dass du dem Benutzer deines Programms die Entfernung anhand der Stunden, während der er rumscrollen muss, um von der Sonne zur Erde zu kommen, veranschaulichen willst... <)

Ist nicht böse gemeint, aber warum tust du dir den ganzen Aufwand denn letztendlich an? :?

Verfasst: 23.01.2008 23:03
von Riacon
ich hab vor 30 jahren mal ein mondlandespiel auf einem alten wang gemacht. dann hab ich verbessert und verbessert.. bis es nicht mehr funktionierte.

ich geb ja nicht auf :-D

Verfasst: 25.01.2008 18:19
von Xaby
Ich schätze mal Google Earth hat auch nur ein ganz großes Bild für die gesamte Erde :mrgreen:

Wirst das schon schaffen. Einfach die Erde auf ein Sprite zeichnen, dann die Sonne auf ein größeres Spreit und die Entfernung dazwischen brauchste ja nicht zeichnen. Da kommen Sternsprites hin /:-> :allright:

Verfasst: 29.01.2008 16:48
von Kaeru Gaman
Xaby hat geschrieben:Ich schätze mal Google Earth hat auch nur ein ganz großes Bild für die gesamte Erde
BULL! :roll:

@Riacon
"Mondlandespiel" klingt schon mal weit einfacher.
ne Erde von ~6400pix müßtest du mit ner großgezoomten Sprite3D schon hinbekommen.
den Mond dann ~1700pix auf die selbe weise,
und mit nem Mittelpunktabstand von ~384000pix darstellen,
also in 375 bildscheirmseiten entfernung...

bloß, treffen kann man immer so schlecht, wenn man mit Draufsicht arbeitet...
im gegensatz zur realität kannst du in 400km entfernung vorbeifliegen und siehst es nicht einmal.

sowas macht man dann doch lieber kapitelweise getrennt,
also die eigentliche Landung in nem ganz anderen Maßstab als den Flug,

oder gleich in 3D.