Entwickler-Ecke
Multimedia / Grafik - Delphi Bewegung eines gezeichneten Balles
Lazarusboy - Do 08.09.11 19:13
Titel: Delphi Bewegung eines gezeichneten Balles
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 - 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.
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
Lazarusboy - 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.
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: 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 - 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
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!