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<=101or (y>(600-s)) or (y<=151);
Form1.Canvas.Ellipse(x,y,x+s,y+s);



Moderiert von user profile iconNarses: 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.


Delphi-Quelltext
1:
RX:=random(1)-2;                    

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<=101or (y>(600-s)) or (y<=151);
Form1.Canvas.Ellipse(x,y,x+s,y+s);
stop:=true;
end;

  //hier ggf. Code ergänzen


//-------- Refresh (public) --------------------------------------------
destructor TBall.Destroy;
begin
Form1.Destroy;
inherited Destroy;
  //hier ggf. Code ergänzen
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;
// Bewegt den Ball in eine zufaellige Richtung 
var
  rx,ry: integer;
begin
Form1.Canvas.Ellipse(x,y,x+s,y+s);//lieber (TBall.)Draw(Form1.canvas) ???
rx := random(10)-5;
ry := random(10)-5;
while (x<(950-s)) AND (x>101AND (y<(600-s)) AND (y>151do
  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 - Fr 09.09.11 12:46

Moin Lazarusboy,
vielleicht hift Dir http://www.delphi-forum.de/topic_Ballbewegung+in+OOP_80910.html
Gruß Fiete