Delphi Bewegung eines gezeichneten Balles
spacer
Autor Nachricht
Lazarusboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: 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?

ausblenden Delphi-Quelltext markieren
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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 08.09.2011 um 21:29
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 1004
Erhaltene Danke: 10

WIN7,PuppyLinux
Turbo Delphi, FreePascal
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext markieren
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

Für diesen Beitrag haben gedankt: Lazarusboy
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Lazarusboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: 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.
ausblenden volle Höhe Delphi-Quelltext markieren
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;

//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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 1004
Erhaltene Danke: 10

WIN7,PuppyLinux
Turbo Delphi, FreePascal
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext markieren
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>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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230
Erhaltene Danke: 17

WinXP und Win98SE
Delphi 6 pro, Delphi 2006 und Turbo Pascal 7
BeitragVerfasst: 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)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home