Einzelnen Beitrag anzeigen

Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Canvas: Änderungen/Bewegungen zeichnen

  Alt 27. Aug 2018, 10:04
Hallo,

das klingt nach einem interessanten Projekt

Da Du ja Wert auf strukturierten und Testbaren Code Wert legst würde ich den folgenden
Ansatz verfolgen:

Vorgaben: (So wie ich es verstanden habe)

Darstellung Zoom und Verschiebbar
Selektion einzelner Bereiche und eventuell zusätzlicher Informationen
Animation der Objekte (Flugzeuge) also Bewegung, Höhe etc...

Mein Ansatz wäre:

Definieren der Klassen ohne! Darstellungs-Optionen

Also etwa:
// Pseudo Code nur so hingetipt
Delphi-Quellcode:
type

TBaseAirplane = class

 public
   property Position : Tposition3d;
   property Speed : Double;
   property Direction : TDirection3d;
   property LastUpdateTime : TUpdateTime;
 
end;

TPlaneCalculator = class
  public
  // Bestimmt die aktuelle Position etc anhand der Zeit, Route etc
   function CalcNewPos(aBaseAirplane : TBaseAirPlane; actualTime : tUpdateTime) : boolean;
end;


TSimulator = class
  private
    fAirPlanes : Tlist<TBaseAirplane>;
    fCalculator : TPlaneCalculator;
  public
    // funcs zum verwalten der AirPlanes also add, delete, etc...
  
   
   // Von aussen z.b über einen Timer anstossen
   procedure UpdatePositions(actualTime : TUpdateTime);
   begin
     for plane in fAirPlanes do fCalculator(plane, actualPlane);
   end;
   
end;
Auf dieser Basis ist es erstmal möglich Tests für das verhalten zu erzeugen.


Zeichnen:

Dein Ansatz über ein Interface ist nicht schlecht.
Ich würde aber weitergehen und das Komplett abstrahieren. Also nicht über den TCanvas sondern
einen Eigenen Virtuellen Zeichenbereich.
Aktuell willst Du nur auf den Bildschirm, nächste Woche aber bestimmt auch auf einen Drucker,
als SVG zu ner WebPage, als Dokument in Pdf etc..........

Der Vorteil beim Abstrahieren ist, Deine Klassen müssen nicht wissen wie sie gezeichnet werden.
Alle Daten innerhalb Deiner Klassen arbeiten in World-Koordinaten.
Nur für den Canvas ist es wichtig zu wissen wie skaliert etc.. wird.

So etwa:

Delphi-Quellcode:
IRadarCanvas = interface
  procedure DrawPlane(aPlane : TBaseAirPlane);
end;

IRadarDrawable = interface
  procedure Draw(const Canvas: IRadarCanvas);
end;
So kannst Du es in eine "grosse" Drawklasse packen oder
halt dann ableiten von TBaseAirplane

also

Delphi-Quellcode:
class TAirplaneDrawer = class(TbaseAirplane, IRadarDrawable)
 procedure Draw(const Canvas: IRadarCanvas);
end;

Beim Zeichnen auf den Bildschirm würde ich das ganze in "Layer" verpacken.

Also einen Layer für den statischen Hintergrund (Das RadarBild).
Layer für das animierte Radar (Dieser Rotierende Linie).
Layer für die Aktuell vorhandenen Flugzeuge.
Layer für die Zusatzinformationen.


Wenn wir mal Threads aussen vor lassen,
benötigst Du mindestens 1 Timer.

Dieser löst immer eine Neubestimmung der aktuellen Positionen aus, ruft also
TSimulator.UpdatePositions auf.
Anschliesend wird ein "fertiges" Bitmap für die Darstellung aus den Layern erzeugt und ein Invalidate auf Deine Paintbox.


Im Paint Event wird dann immer nur das "fertige Bitmap gezeichnet"

Es wurden ja auch schon einige Möglichkeiten genannt für Graphic Bibliotheken
hier aber noch eine:
https://github.com/graphics32/graphics32

Hat Alpha und Layer. Schaue es Dir an
Fritz Westermann
  Mit Zitat antworten Zitat