AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

20 sich bewegende Kreise erstellen

Offene Frage von "Zacherl"
Ein Thema von bradyhartsfield · begonnen am 29. Dez 2017 · letzter Beitrag vom 30. Dez 2017
Antwort Antwort
bradyhartsfield

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

20 sich bewegende Kreise erstellen

  Alt 29. Dez 2017, 00: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 (29. Dez 2017 um 00:16 Uhr) Grund: wichtiger teil vergessen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: 20 sich bewegende Kreise erstellen

  Alt 29. Dez 2017, 10:20
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: 20 sich bewegende Kreise erstellen

  Alt 29. Dez 2017, 11:33
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 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.
  Mit Zitat antworten Zitat
bradyhartsfield

Registriert seit: 29. Dez 2017
2 Beiträge
 
#4

AW: 20 sich bewegende Kreise erstellen

  Alt 29. Dez 2017, 19:16
Hey,
also ich habe keine Ahnung was ihr da oben meint, aber ich bin selber ein wenig weiter gekommen.

MfG
brady
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: 20 sich bewegende Kreise erstellen

  Alt 29. Dez 2017, 22:42
Was verstehst Du denn nicht? vielleicht können wir Dir weiter helfen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: 20 sich bewegende Kreise erstellen

  Alt 30. Dez 2017, 00:20
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).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: 20 sich bewegende Kreise erstellen

  Alt 30. Dez 2017, 00:49
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
Wie gesagt sollten sie dies nur mithilfe von arrays tun, d.h. keine records o.Ä. nutzen.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: 20 sich bewegende Kreise erstellen

  Alt 30. Dez 2017, 02:03
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
Wie gesagt sollten sie dies nur mithilfe von arrays tun, d.h. keine records o.Ä. nutzen.
Oh, das hatte ich wohl übersehen 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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 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