Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   20 sich bewegende Kreise erstellen (https://www.delphipraxis.net/194730-20-sich-bewegende-kreise-erstellen.html)

bradyhartsfield 29. Dez 2017 00:15

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:
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.
mit freundlichem Gruß
Brady

PS: Das sich die Ellipsen vom Rand "abstoßen" wird durch diese Zeilen bewirkt:
mx:=mx+vx;
my:=my+vy;

p80286 29. Dez 2017 10:20

AW: 20 sich bewegende Kreise erstellen
 
Zunächst rate ich Dir den Inhalt von .Timer1Timer auseinander zu rupfen. Z.B.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  NewCoordinates;
  PaintElipsis;
end;
Wo Du das "Zurückprallen" zuordnest ist meiner Meinung nach Geschmackssache. Ich würde es in die NewCoordinates packen.

Das Initiale Zeichnen erfolgt z.B im
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
 begin
   doublebuffered := true;
   mx := 10;
   my := 10;
   r := 10;
   vx := 1;
   vy := 1;
   timer1.enabled := false;
   PaintEllepsis;
 end;
Wenn Du das so oä handhabst wird es ein wenig übersichtlicher.

Gruß
K-H

Aviator 29. Dez 2017 11:33

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:
Canvas.FillRect(ClientRect);
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.

bradyhartsfield 29. Dez 2017 19:16

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

p80286 29. Dez 2017 22:42

AW: 20 sich bewegende Kreise erstellen
 
Was verstehst Du denn nicht? vielleicht können wir Dir weiter helfen.

Gruß
K-H

Zacherl 30. Dez 2017 00:20

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).

Aviator 30. Dez 2017 00:49

AW: 20 sich bewegende Kreise erstellen
 
Zitat:

Zitat von Zacherl (Beitrag 1389857)
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?

Ich zitiere den TE an dieser Stelle einmal :-D
Zitat:

Zitat von bradyhartsfield (Beitrag 1389829)
Wie gesagt sollten sie dies nur mithilfe von arrays tun, d.h. keine records o.Ä. nutzen.


Zacherl 30. Dez 2017 02:03

AW: 20 sich bewegende Kreise erstellen
 
Zitat:

Zitat von Aviator (Beitrag 1389858)
Zitat:

Zitat von Zacherl (Beitrag 1389857)
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?

Ich zitiere den TE an dieser Stelle einmal :-D
Zitat:

Zitat von bradyhartsfield (Beitrag 1389829)
Wie gesagt sollten sie dies nur mithilfe von arrays tun, d.h. keine records o.Ä. nutzen.


Oh, das hatte ich wohl übersehen :stupid: Auch wenn ich nicht wüsste, was gegen Records sprechen würde, wenn man diese trotzdem in einem Array verwendet. Soll ja vermutlich einfach nur der Umgang mit Arrays gelehrt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz