Autor |
Beitrag |
Lazarusboy
Beiträge: 28
|
Verfasst: Do 08.09.11 19:13
Hallo Leute,
Ich brauche eure Hilfe.
Ich soll einen Ball mit Delphi zeichen, der sich in einem begrenzten Raum zufällig bewegen soll.
Nur funktionert bei mir random nicht richtig, er bewegt sich immer noch in eine richtung.
wo liegt hier in der procedure der Fehler?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TBall.Bewegen; begin RX:=0; RY:=0; Ball:=TBall.Create(500,450,80); Form1.Canvas.Ellipse(x,y,x+s,y+s); repeat tempx:=1; tempy:=1; randomize; RX:=random(1)-2; RY:=random(1)-2; X:=x+tempx+RX; y:=y+tempy+RY; Form1.DoubleBuffered:=true; Form1.Canvas.Ellipse(x,y,x+s,y+s); Form1.Refresh; until (x>(950-s)) or (x<=101) or (y>(600-s)) or (y<=151); Form1.Canvas.Ellipse(x,y,x+s,y+s); | Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Do 08.09.2011 um 21:29
|
|
Horst_H
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 08.09.11 19:33
Hallo,
das ist alles etwas wirr.
Innerhalb von Tball.Bewegen erstellst Du einen neuen Ball in Zeile 5 oder ueberschreibst einen global vorhandenen.
Die Zeile muss weg.
Randomize wird nur einmal im gesamten Programm aufgerufen und gut ist.
Es hat also nichts innerhalb der Schleife zu suchen, also eher bei der Erstellung der Form.
Delphi-Quelltext
Random(1) ist immer 0
random(n) erzeugt Zahlen von 0..n-1, also n verschiedene Zahlen.
Gemeint war wohl, Zahlen aus [-1..+1] zu erzeugen:
RX:=random(3)-1;
tempx und tempy muessen auch noch verschwinden...
Grusz Horst
Für diesen Beitrag haben gedankt: Lazarusboy
|
|
Lazarusboy
Beiträge: 28
|
Verfasst: Do 08.09.11 19:44
okay danke soweit, aber wenn ich das nun teste, bewegt sich der Ball nun überhaupt nicht mehr.
hier der ganze 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: 51: 52: 53: 54:
| constructor TBall.Create(Posx,Posy,Size:integer); begin x:=PosX; y:=PosY; s:=Size; end;
procedure TBall.Bewegen; begin Form1.Canvas.Ellipse(x,y,x+s,y+s); repeat X:=x+RX; y:=y+RY; Form1.DoubleBuffered:=true; Form1.Canvas.Ellipse(x,y,x+s,y+s); Form1.Refresh; until (x>(950-s)) or (x<=101) or (y>(600-s)) or (y<=151); Form1.Canvas.Ellipse(x,y,x+s,y+s); stop:=true; end;
destructor TBall.Destroy; begin Form1.Destroy; inherited Destroy; end;
procedure TForm1.FormCreate(Sender: TObject); begin Dauerschleife:=True; Ball:=TBall.Create(100,150,80); Form1.Canvas.Brush.Color:=clRed; stop:=false; randomize; RX:=random(10)-5; RY:=random(10)-5; end;
procedure TForm1.BStartClick(Sender: TObject); begin Ball.Bewegen; end;
procedure TForm1.BStopClick(Sender: TObject); begin Ball.Destroy; Stop:=true; end;
end. |
|
|
Horst_H
Beiträge: 1652
Erhaltene Danke: 243
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 08.09.11 20:04
Hallo,
Hallo,
wie sieht dein Objekt/Klasse TBall denn komplett aus.
Dort koennten auch die maximalen Bewgungsgrenzen (950-s,100,600-s,151 ) als Properties stehen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TBall.Bewegen; var rx,ry: integer; begin Form1.Canvas.Ellipse(x,y,x+s,y+s);rx := random(10)-5; ry := random(10)-5; while (x<(950-s)) AND (x>101) AND (y<(600-s)) AND (y>151) do begin Form1.Canvas.Ellipse(x,y,x+s,y+s); Form1.Refresh; X:=x+RX; y:=y+RY; end; stop:=true; end; |
Besser solltest Du rx,ry in TBall speichern und solange bewege aufrufen, bis Stopp wahr ist.
Ist stop eine Eigenschaft von TBall ?
Grusz Horst
|
|
Fiete
Beiträge: 603
Erhaltene Danke: 340
W7
Delphi 6 pro
|
Verfasst: Fr 09.09.11 12:46
Moin Lazarusboy,
vielleicht hift Dir www.delphi-forum.de/...ng+in+OOP_80910.html
Gruß Fiete
_________________ Fietes Gesetz: use your brain (THINK)
|
|
|