Einzelnen Beitrag anzeigen

bradyhartsfield

Registriert seit: 28. Dez 2017
2 Beiträge
 
#1

20 sich bewegende Kreise erstellen

  Alt 28. Dez 2017, 23:15
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;

Geändert von bradyhartsfield (28. Dez 2017 um 23:16 Uhr) Grund: wichtiger teil vergessen
  Mit Zitat antworten Zitat