![]() |
20 sich bewegende Kreise erstellen
Hallo,
leider war ich die letzten zwei Wochen aufgrund von Grippe nicht in der Schule und habe deswegen 7 Stunden Informatik Unterricht verpasst. In diesen Stunden bekamen meine Mitschüler die Aufgabe 20 Ellipsen zu erstellen (mithilfe von arrays) die alle von den Wänden abprallen und auch wenn sie sich berühren abprallen. Wie gesagt sollten sie dies nur mithilfe von arrays tun, d.h. keine records o.Ä. nutzen. Das mit dem voneinander abprallen haben sie mithilfe des Pythagoras getan. Nun mein Problem: Ich habe natürlich selber versucht mir so ein Programm zu programmieren komme jetzt aber, da ich als unser Lehrer das erklärt hat als ich eben krank war, nicht weiter. Immoment habe ich es geschafft das eine Ellipse normal erstellt wird und auch von den Bordern abprallt, allerdings habe ich jetzt für die restlichen 19 arrays benutzt und jetzt werden ganz viele (unendlich) Kreise "gemalt" und nur die erste Ellipse bewegt sich. Mein Problem ist das ich einfach nicht weiß wann ich die nötigen Programmzeilen bzw. Formeln einsetzen muss und so entstehen immer wieder Errors wie "identifier not overloaded", oder sowas. Das mit dem Pythagoras habe ich jetzt noch überhaupt nicht probiert, da ich erstmal hinbekommen möchte, dass ich 20 sich bewegende Kreise habe die von den Rändern des Image 1 abprallen. Hier mein bisheriges nicht funktionierendes Programm:
Code:
mit freundlichem Gruß
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Image1: TImage; Timer1: TTimer; Timer2: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end; var Form1: TForm1; mx, my, r, vx, vy : integer; mx1 : array[0..19] of integer; my1 : array[0..19] of integer; r1 : array[0..19] of integer; vx1 : array[0..19] of integer; vy1 : array[0..19] of integer; c : integer; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin timer1.enabled := true; end; procedure TForm1.Button2Click(Sender: TObject); begin timer1.enabled := false; end; procedure TForm1.FormCreate(Sender: TObject); begin doublebuffered := true; mx := 10; my := 10; r := 10; vx := 1; vy := 1; timer1.enabled := false; end; procedure TForm1.Timer1Timer(Sender: TObject); begin with image1.canvas do begin pen.color := clblack; brush.color := clblack; ellipse(mx-r, my-r, mx+r, my+r); mx:=mx+vx; my:=my+vy; pen.color:=clred; brush.color:=clred; ellipse(mx-r, my-r, mx+r, my+r); end; if my+r>=image1.height then vy:= -vy; if mx+r>=image1.width then vx:=-vx; if my-r<0 then vy:=-vy; if mx-r<0 then vx:=-vx; for c := 0 to 19 do begin mX1[c] := random(image1.width); mY1[c] := random(image1.height); R1[c] := 10; vX1[c] := 1; vY1[c] := 1; image1.canvas.ellipse(mx1[c]-r1[c], my1[c] - r1[c], mx1[c] + r1[c], my1[c]+r1[c]); end; end; end. Brady PS: Das sich die Ellipsen vom Rand "abstoßen" wird durch diese Zeilen bewirkt: mx:=mx+vx; my:=my+vy; |
AW: 20 sich bewegende Kreise erstellen
Zunächst rate ich Dir den Inhalt von .Timer1Timer auseinander zu rupfen. Z.B.
Delphi-Quellcode:
Wo Du das "Zurückprallen" zuordnest ist meiner Meinung nach Geschmackssache. Ich würde es in die NewCoordinates packen.
procedure TForm1.Timer1Timer(Sender: TObject);
begin NewCoordinates; PaintElipsis; end; Das Initiale Zeichnen erfolgt z.B im
Delphi-Quellcode:
Wenn Du das so oä handhabst wird es ein wenig übersichtlicher.
procedure TForm1.FormCreate(Sender: TObject);
begin doublebuffered := true; mx := 10; my := 10; r := 10; vx := 1; vy := 1; timer1.enabled := false; PaintEllepsis; end; Gruß K-H |
AW: 20 sich bewegende Kreise erstellen
Achtung: Das Zeichnen der Kreise sollte im OnPaint der jeweiligen Komponente stattfinden. Ansonsten hat man beim Minimieren und beim Übermalen durch andere Forms einen unschönen Nebeneffekt.
Außerdem solltest du vor dem ganzen zeichnen ein
Delphi-Quellcode:
ausführen damit die zuvor gezeichneten Kreise wieder "gelöscht" bzw. mit einer vollen Fläche übermalt werden. Wobei ClientRect eventuell durch ein passendes Rect von dir ersetzt werden müsste.
Canvas.FillRect(ClientRect);
|
AW: 20 sich bewegende Kreise erstellen
Hey,
also ich habe keine Ahnung was ihr da oben meint, aber ich bin selber ein wenig weiter gekommen. MfG brady |
AW: 20 sich bewegende Kreise erstellen
Was verstehst Du denn nicht? vielleicht können wir Dir weiter helfen.
Gruß K-H |
AW: 20 sich bewegende Kreise erstellen
Und noch nebenher: Kennst du schon Klassen bzw. Records? Dann könntest du dir nämlich alle Parameter eines Kreises gesammelt speichern und brauchst nicht für jede Eigenschaft ein eigenes Array?
Sollen es zudem tatsächlich Ellipsen sein, oder einfache Kreise? Im Falle des Kreises, würde ich mir überlegen, was einen Kreis eindeutig definiert und mir dann auch nur diese Werte speichern. Hier würde mir für deinen Anwendungsfall erstmal der Mittelpunkt und der Radius einfallen. Eventuell noch Richtungsvektor und Bewegungsgeschwindigkeit (falls das pro Kreis individuell festgelegt werden kann). |
AW: 20 sich bewegende Kreise erstellen
Zitat:
Zitat:
|
AW: 20 sich bewegende Kreise erstellen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz