Entwickler-Ecke
Sonstiges (Delphi) - Projekt Umlaufbahn
Lazarusboy - So 13.03.11 18:30
Titel: Projekt Umlaufbahn
Hallo Leute,
Ich bitte um eure Hilfe
Ich muss ein Projekt entwickeln, wo der Mond um die Erde kreist, und sobald er nicht mehr zu sehen ist(also den Bildrand verlassen hat), soll die Sonne zum Vorschein kommen und das gleiche machen wie der mond.
Nur leider funktioniert es nicht sehr gut:
Hier der Quelltext
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure TForm1.Timer1Timer(Sender: TObject); begin If (IMond.Top>0) and (IMond.Left<400)then begin Form1.Color:=clWindowtext; IMond.Left:=IMond.Left+1 ; Imond.Top:=Imond.Top-1; end else begin IMond.Left:=IMond.Left+1 ; Imond.Top:=Imond.Top+2; end; If (Imond.Left>800) and (ISonne.Left<599) and (ISonne.Top>0) then begin Form1.Color:=clForm; Imond.Visible:=False ; ISonne.Visible:=True; ISonne.Left:=ISonne.Left+1 ; ISonne.Top:=ISonne.Top-1; end else begin ISonne.Left:=ISonne.Left+1; ISonne.Top:=ISonne.Top+2; end; If ISonne.Left>800 then begin ISonne.Visible:=False ; ISonne.Left:=0; ISonne.Top:=400 ; IMond.Left:=0; Imond.Top:=400; Imond.Visible:=True; end else begin end; end; |
Danke für eure Mithilfe
Moderiert von
Kha: Delphi-Tags hinzugefügt
Lazarusboy - So 13.03.11 19:05
Also , sobald das Programm startet, fängt der Mond an 1 nach oben und nach links zu zu wandern, jedoch stoppt er sobald er am oberen Rand angekommen ist(er sollte dann eigentlich wieder die Kurve nach unten wander. Das gleiche dann auch mit der Sonne
Wäre nett , wenn du mir das mit den trigonometrischen Funktionen erklären könntest, denn damit habe ich noch nicht gearbeitet.
jaenicke - So 13.03.11 19:18
Lazarusboy hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| If (IMond.Top>0) and (IMond.Left<400)then begin Form1.Color:=clWindowtext; IMond.Left:=IMond.Left+1 ; Imond.Top:=Imond.Top-1; end else begin IMond.Left:=IMond.Left+1 ; Imond.Top:=Imond.Top+2; end; | |
Das sollte funktionieren. Da bei dir aber beide Bedingungen erfüllt sein müssen, funktioniert es nur, wenn der Mond beim Start 400 Pixel vom oberen Rand entfernt ist.
Zudem läuft die Sonne gleich beim Start mit los. Wie wäre es, wenn du dir den aktuellen Status besser in Feldern unter private merkst? Dann kannst du es besser steuern.
Ja, wenn du Sinus und Cosinus noch nicht kennst, dann musst du das wohl erst lernen. Wikipedia sollte dabei helfen, deshalb ja auch der Link.
Lazarusboy - So 13.03.11 20:32
Also mit dem Mond, das funktioniert nun
Aber jetzt startet meine Sonne nicht einmal
Sonder der Mond läuft die ganze Zeit ab...
jaenicke - So 13.03.11 20:38
Wie hast du es denn jetzt?
Lazarusboy - So 13.03.11 20:41
So hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure TForm1.Timer1Timer(Sender: TObject); begin If (IMond.Top>0) and (IMond.Left<300)then begin Form1.Color:=clWindowtext; IMond.Left:=IMond.Left+1 ; Imond.Top:=Imond.Top-1; end else begin IMond.Left:=IMond.Left+1 ; Imond.Top:=Imond.Top+1; If (Imond.Left>700) and (ISonne.Left<300) and (ISonne.Top>0) then begin ISonne.Visible:=True; Form1.Color:=clForm; Imond.Visible:=False; ISonne.Visible:=True; ISonne.Left:=ISonne.Left+1; ISonne.Top:=ISonne.Top-1; end else begin ISonne.Left:=ISonne.Left+1; ISonne.Top:=ISonne.Top+1; end; If ISonne.Left>700 then begin ISonne.Visible:=False ; ISonne.Left:=0; ISonne.Top:=400 ; IMond.Left:=0; Imond.Top:=400; Imond.Visible:=True; end else begin end; end; end; |
elundril - So 13.03.11 20:43
btw, die [delphi][/delphi]-Tags funktionieren auch bei Lazarus-Quelltexten. ;)
lg elundril
Lazarusboy - So 13.03.11 21:00
okay, danke
Wollte trotzdem noch gerne wissen, welche Fehler ich hier in dem obigen Quelltext gemacht habe, damit
meine sonne sich auch bewegt
---
Moderiert von
Narses: Beiträge zusammengefasst---
Okay habs nun hinbekommen...
Hab noch eine frage, wie kann ich den mond und die Sonne in einem kreis bewegen lassen?
elundril - So 13.03.11 21:54
Lazarusboy hat folgendes geschrieben : |
Okay habs nun hinbekommen...
Hab noch eine frage, wie kann ich den mond und die Sonne in einem kreis bewegen lassen? |
beantwortet das deine frage?
lg elundril
Lazarusboy - So 13.03.11 22:02
eher weniger, da ich keine Ahnung habe welches Befehl ich verwenden muss, damit der Mond und die Sonne in einem Kreisförmigen Radius sich bewegen.
jaenicke - So 13.03.11 22:20
Das ist kein programmiertechnisches Problem, sondern ein mathematisches...
Die Delphifunktionen heißen einfach Sin und Cos und nutzen das Bogenmaß. Zur Umwandlung in Grad gibt es RadToDeg bzw. DegToRad.
Du berechnest die Position dann aus Radius und aktuellem Winkel.
Lazarusboy - So 20.03.11 15:06
okay ich habe nun verscucht , dass der Mond eine kreisförmige Umlaufbahn einnimt, leider funktionert das nicht so wie ich es gedacht habe(Der Mond macht seine kreisbahn bei jedem Versuch in eine andere Richtung) , könnt ihr mich vielleicht nocheinmal hellfen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| procedure TForm1.Timer1Timer(Sender: TObject); var x,y:integer; begin If (IMond.Top>0) and (IMond.Left<=290)then begin if z>=360 then z:=0; inc(z,1); Form1.Color:=clWindowtext; x := Round(Cos(DegToRad(z))*10); y := Round(Sin(DegtoRad(z))*10); IMond.Left:=IMond.Left+x; IMond.Top:=IMond.Top+y; end else begin If (IMond.Left>290) and (Imond.left<700) then begin Form1.Color:=clWindowtext; x := Round(Cos(DegToRad(-z))*10); y := Round(Sin(DegtoRad(z))*10); IMond.Left:=IMond.Left+x; IMond.Top:=IMond.Top+y; end else begin If (ISonne.Left<310) and (ISonne.Top>0) then begin ISonne.Visible:=True; Form1.Color:=clForm; Imond.Visible:=False; ISonne.Visible:=True; ISonne.Left:=ISonne.Left+1; ISonne.Top:=ISonne.Top-1; end else begin ISonne.Left:=ISonne.Left+1; ISonne.Top:=ISonne.Top+1; end; If ISonne.Left>700 then begin ISonne.Visible:=False ; ISonne.Left:=48; ISonne.Top:=440 ; IMond.Left:=0; Imond.Top:=400; Imond.Visible:=True; end else begin end; end; end; end; |
Lazarusboy - Di 22.03.11 00:15
Hallo Leute, bitte um Hilfe
Sobald der Mond seine Runde gedreht hat, erscheint die Sonne ganz links und macht nichts...
Eigentlich sollte die Sonne auch ihre Runde drehen...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| begin ISonne.Left:=40; If Imond.Left<700 then begin Form1.Color:=clWindowtext; if l>=360 then l:=0; inc(l,1); x := round(Cos(DegTorad(l))*10); y := round(Sin(DegToRad(l))*10); IMond.Left:=IMond.Left+x; IMond.Top:=IMond.Top-12+2*y; end else begin If (ISonne.Left<700) then begin IMond.Visible:=False; Isonne.Visible:=true; ISonne.Left:=48; ISonne.Top:=440; Form1.Color:=clForm; if l>=360 then l:=0; inc(l,1); x := round(Cos(DegTorad(l))*10); y := round(Sin(DegToRad(l))*10); IMond.Left:=IMond.Left+x; IMond.Top:=IMond.Top-12+2*y; end else begin ISonne.Visible:=False ; IMond.Left:=0; Imond.Top:=400; Imond.Visible:=True; end; end; end; |
jaenicke - Di 22.03.11 06:58
Lazarusboy hat folgendes geschrieben : |
Eigentlich sollte die Sonne auch ihre Runde drehen... |
Dann poste doch dazu auch den Quelltext. In dem aktuell geposteten weist du nur eine feste Position zu. :nixweiss:
Lazarusboy hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| begin ISonne.Left:=40; If Imond.Left<700 then begin [...] end else begin If (ISonne.Left<700) then begin IMond.Visible:=False; Isonne.Visible:=true; ISonne.Left:=48; ISonne.Top:=440; Form1.Color:=clForm; [...] | |
Lazarusboy - Di 22.03.11 09:30
mmeinst du es so?
object Image1: TImage des is ist die erde
Left = 304
Height = 95
Top = 288
Width = 96
Picture.Data = {
}
end
object ISonne: TImage Sonne
Left = 8
Height = 50
Top = 376
Width = 50
Picture.Data = {
Visible = False
end
object IMond: TImage Mond
Left = -16
Height = 112
Top = 384
Width = 120
Picture.Data = {
end
object Timer1: TTimer
Interval = 1
OnTimer = Timer1Timer
left = 592
top = 16
end
jaenicke - Di 22.03.11 09:34
Was haben die DFM-Definitionen damit zu tun? Du weist schlicht keinen dynamisch berechneten Wert für die Position der Sonne zu, also wie soll sich diese denn ändern? :gruebel:
Lazarusboy - Di 22.03.11 09:42
Ich weiß nicht genau, welchen Quelltext du möchtest...
Lazarusboy - Di 22.03.11 09:55
aber egal habs gerade sekber hinbekommen
Danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!