| Autor |
Beitrag |
-Nala-
      
Beiträge: 62
|
Verfasst: So 16.12.07 14:33
Hallo!
Ich habe eine Frage zu einem Programm, welches ich geschrieben habe.
Indem Programm bewegt sich ein Objekt namens Planeten, welches ich mit einer neuen klasse (TPlanet) festgelegt habe. Dies habe ich in 2 Units programmiert. Die eine Unit (Weltraum) beschreibt das ganz normale Programm. Die andere (mPlanet) das Objekt Planeten mit all seinen Eigenschaften und Prozeduren. Nun habe ich, damit man das bewegen auch sieht das objekt immer neu gezeichnet. Das Problem das daraus nun folgt ist, dass die neu gezeichneten Objekte stehen bleiben und nach einiger zeit sieht das ganze so aus wie ein Donut (ich habe das Objekt im Kreis bewegt). Wie kann ich die gezeichneten Objekte sozusagen "verschwinden" lassen, dass nur das eine zu sehen ist??
Hier sind die Units :
1. Weltraum:
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: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| unit Weltraum;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, mPlanet, ExtCtrls;
type TForm1 = class(TForm) GroupBox1: TGroupBox; Button1: TButton; Button2: TButton; TiMond: TTimer; Memo: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure TiMondTimer(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1; Planeten: TPlanet;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Planeten := TPlanet.create (0, 6393, 1738, 100, 27, 200, round(clientwidth/2)-40, round(clientheight/2)-40, 544, 223, clMedGray, clblue, clbtnface); end;
procedure TForm1.Button1Click(Sender: TObject); begin Planeten.zeichnen(form1.canvas); end;
procedure TForm1.TiMondTimer(Sender: TObject); begin Planeten.bewegen(Form1); Memo.Lines.Add('Koordinaten des Mondes: ' + IntToStr(Planeten.Mlinks)+' '+ IntToStr(Planeten.Moben) ); end;
procedure TForm1.Button2Click(Sender: TObject); begin TiMond.Enabled := true; end;
end. |
2. mPlanet:
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: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
| unit mPlanet;
interface
uses graphics, math, forms;
type TPlanet = Class(TObject) G : real; Re : integer; Rm : integer; RPe : integer; RPm : integer; Rk : integer; Elinks : integer; Eoben : integer; Mlinks : integer; Moben : integer; Fm : TColor; Fe : TColor; Fh : TColor; constructor Create (G2:real; Re2, Rm2, RPe2, RPm2, Rk2, Elinks2, Eoben2, Mlinks2, Moben2: integer; Fm2, Fe2, Fh2:Tcolor);
procedure zeichnen (canv : Tcanvas); procedure bewegen (form : Tform); end;
implementation
constructor TPlanet.Create (G2:real; Re2, Rm2, RPe2, RPm2, Rk2, Elinks2, Eoben2, Mlinks2, Moben2: integer; Fm2, Fe2, Fh2:Tcolor); begin G := G2; Re := Re2; Rm := Rm2; RPe := RPe2; RPm := Rpm2; Rk := Rk2; Elinks := Elinks2; Eoben := Eoben2; Mlinks := Mlinks2; Moben := Moben2; Fm := Fm2; Fe := Fe2; Fh := Fh2; end;
procedure TPlanet.zeichnen (canv : Tcanvas); begin canv.Brush.Color := Fe; canv.Ellipse(Elinks, Eoben, Elinks+RPe, Eoben+RPe);
canv.Brush.Color := Fm; canv.Ellipse(Mlinks, Moben, Mlinks+RPm, Moben+RPm); end;
procedure TPlanet.bewegen(form : Tform); begin G := G + 0.1; Mlinks := round(form.clientwidth/2 + cos(G) * Rk); Moben := round (form.clientheight/2 + sin(G) * Rk); zeichnen(form.canvas); end;
end. |
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 16.12.07 15:38
Bevor der neue Mond gezeichnet wird, muss ja wohl der alte noch weg. Quick and dirty Lösung anhand des vorliegenden Quelltextes :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TPlanet.wegzeichnen (canv : Tcanvas); begin canv.Pen.Color := clBtnFace; canv.Brush.Color := clBtnFace; canv.Ellipse(Elinks, Eoben, Elinks+RPe, Eoben+RPe);
canv.Pen.Color := clBtnFace; canv.Brush.Color := clBtnFace; canv.Ellipse(Mlinks, Moben, Mlinks+RPm, Moben+RPm); end;
procedure TPlanet.bewegen(form : Tform); begin Mlinks := round(form.clientwidth/2 + cos(G) * Rk); Moben := round (form.clientheight/2 + sin(G) * Rk); wegzeichnen(form.canvas); G := G + 0.1; Mlinks := round(form.clientwidth/2 + cos(G) * Rk); Moben := round (form.clientheight/2 + sin(G) * Rk); zeichnen(form.canvas); end; |
Tip am Rande : Kommentare nur in der Deklaration hinzuschreiben ist ja schön und gut. Sind die Bezeichner selbsterklärend, dann kann man die fast komplett einsparen. Wichtiger ist aber, das Programm selbst zu kommentieren !
_________________ Gruß
Hansa
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 16.12.07 17:51
Du musst die Malfläche bei jedem Frame komplett löschen und alle Planeten neu zeichnen.
|
|
-Nala- 
      
Beiträge: 62
|
Verfasst: So 16.12.07 20:29
Hey!!!!
Es funktioniert!
Vielen Dank!!
|
|
|