Entwickler-Ecke

Sonstiges (Delphi) - Array Problem


Lazarusboy - Di 06.12.11 18:05
Titel: Array Problem
Hallo Leute,
Habe eine kleines Problem, hatte letztens ein Projekt erstellt, wo sich ein Ball in einem Fenster hin un her bewegt, nun wollte ich durch array mehrere hinzufügen. Nur leider habe ich nach mehreren Versuchen keine Lösung gefunden, würde mich freuen wenn mir jemand helfen kann

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:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
var
  Form1: TForm1;
  Ball:TBall;
  x,y,s:integer;
  RX,RY:integer;
  Halt:boolean;
  a:array[1..9of TBall;
 

implementation

{$R *.dfm}
constructor TBall.Create(Posx,Posy,Size:integer);
begin
x:=PosX; y:=PosY; s:=Size;
end;

procedure TBall.Bewegen;
begin
Halt:=false;
Ball:=TBall.Create(100,150,80);
randomize;
x:=random(749)+101;
y:=random(299)+151;
repeat
Application.ProcessMessages;
Randomize;
RX:=random(12)+1;
RY:=Random(6)+1;
while  (x<(950-s)) and (y<(600-s)) and (Halt=false) do begin
Application.ProcessMessages;
X:=x+RX;
y:=y+RY;
Form1.DoubleBuffered:=true;
Form1.Refresh;
Form1.Canvas.Ellipse(x,y,x+s,y+s);
end;
Form1.Canvas.Ellipse(x,y,x+s,y+s);
RX:=random(12)+1;
RY:=Random(6)+1;
repeat
Application.ProcessMessages;
X:=x-RX;
y:=y-RY;
Form1.DoubleBuffered:=true;
Form1.Refresh;
Form1.Canvas.Ellipse(x,y,x+s,y+s);
until  (y<151or (x<(101)) or (Halt=true);
until Halt=true;

end;

procedure TBall.Verschwinden;
begin
Form1.Refresh;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Ball:=TBall.Create(100,150,80);
Form1.Canvas.Brush.Color:=clred;
end;

procedure TForm1.BStartClick(Sender: TObject);
begin
Ball.Bewegen;
end;


ub60 - Di 06.12.11 19:00

An mehreren Stellen sollten dann auch die ganzen Bälle und nicht nur einer angesprochen werden, z. B. so:


Delphi-Quelltext
1:
2:
for i:=1 to 
  a[i]:=TBall.Create(x, y, r);

Das Gleiche gilt dann natürlich auch für das Bewegen usw.

ub60


Lazarusboy - Di 06.12.11 20:16

okay danke , habe ich grade versucht, nur ändert sich da rein gar nichts....
Habe grade aber rausgefunden, dass jeder einzelne Ball nacheinander startet und nicht gleichzeitig, dh erst wenn ich beende drücke , fängt ein neuer an.....


bummi - Di 06.12.11 22:01

Es wird ja auch jedesmal die komplette Bewegen-Routine durchlaufen.

Gib TBall ein paar mehr Informationen mit (Grenzen x,y,Richtung,Canvas) und bau bewegen um auf eine einzelne Bewegung.

Später läufst Du über Dein BallArray in der Art

Wenn nicht BallArray[i].Halt dann BallArray[i].Bewegen, das ganz in einem Äußeren Loop solange bis alle Bälle auf Halt stehen.


Lazarusboy - Di 06.12.11 22:23

Okay, teilweise verstanden.
Nur wie soll ich die ganzen Informationen in TBall dann nutzen. Verstehe da noch nicht ganz das Prinzip.


ub60 - Di 06.12.11 23:11

Die Informationen, die Du in Deinem ganzen Programm verteilst, sollten zum Großteil in der Klasse TBall sein, zum Beispiel so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type TBall=class
  protected
    FCanvas : TCanvas;
    FFarbe : TColor;
    FGeschwindigkeitX, FGeschwindigkeitY : Integer;
    FX, FY, FRadius: Integer;
    FGrenzeX, FGrenzeY : Integer;
  public
    constructor Create;
    procedure SetCanvas(Canvas:TCanvas);
    procedure SetFarbe(Farbe : TColor);
    procedure SetGrenzeX(x:Integer);
    procedure SetGrenzeY(y:Integer);
    procedure Zeichne;
    procedure Loesche;
    procedure Bewege;
end;

Die Werte für FX, FY, FRadius und die Geschwindigkeiten kannst Du in Create setzen.
Die Grenzen der Bewegung setzt Du in Abhängigkeit von Deiner Zeichenfläche.
Die Methode Bewege überprüft die Grenzen und setzt für FGeschwindigkeit bei Bereichsüberschreitung jeweils den negativen Wert des verherigen Wertes.
In einem Timer rufst Du dann aller paar Millisekunden folgendes auf:
-alle Bälle löschen
-alle Bälle bewegen
-alle Bälle zeichnen

ub60


bummi - Di 06.12.11 23:43

Inzwischen wurde ja geantwortet, ich war dabei ein kleines Beispiel zu basteln ...
ist im Anhang


Lazarusboy - Do 08.12.11 21:50

Danke für eure Hilfe,
Ich lasse es jetzt lieber, nach gefühlten 100 Versuchen scheitere ich noch immer... :-(
Mehrere Bälle werden zwar teilweise erzeugt, bewegen sich dann aber net und etc.


Lazarusboy - Do 08.12.11 22:00

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Inzwischen wurde ja geantwortet, ich war dabei ein kleines Beispiel zu basteln ...
ist im Anhang


Okay, funkt doch, mehrere Bälle bilden sich ... thx
Jetzt hab ich wenigstens ein Eindruck wie das ungefähr funktioniert.


Fiete - Fr 09.12.11 11:03

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