Autor |
Beitrag |
Lazarusboy
      
Beiträge: 28
|
Verfasst: Di 06.12.11 18:05
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
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..9] of 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<151) or (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
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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 
      
Beiträge: 28
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Für diesen Beitrag haben gedankt: Lazarusboy
|
|
Lazarusboy 
      
Beiträge: 28
|
Verfasst: 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
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 06.12.11 23:43
Inzwischen wurde ja geantwortet, ich war dabei ein kleines Beispiel zu basteln ...
ist im Anhang
Einloggen, um Attachments anzusehen!
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Für diesen Beitrag haben gedankt: Lazarusboy
|
|
Lazarusboy 
      
Beiträge: 28
|
Verfasst: 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 
      
Beiträge: 28
|
Verfasst: Do 08.12.11 22:00
bummi hat folgendes geschrieben : | 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
      
Beiträge: 617
Erhaltene Danke: 364
W7
Delphi 6 pro
|
Verfasst: Fr 09.12.11 11:03
Moin Lazarusboy,
vielleicht hilt dies weiter: www.delphi-forum.de/...ng+in+OOP_80910.html
Gruß Fiete
_________________ Fietes Gesetz: use your brain (THINK)
|
|
|