Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Firemonkey Image3D Rendering Reihenfolge (https://www.delphipraxis.net/179375-firemonkey-image3d-rendering-reihenfolge.html)

Der schöne Günther 4. Mär 2014 14:35

AW: Firemonkey Image3D Rendering Reihenfolge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zur Sortierung noch:

Die Sortierung vom reinen Abstand Kamera-Objekt kann es ja nicht sein. Du musst doch nach der Länge des Lots von Sprite-Position zur Ebene der Kamera nehmen (siehe Abbildung: Grün ist länger als rot, aber blau ist kürzer als rot!).

LexLing 7. Mär 2014 14:29

AW: Firemonkey Image3D Rendering Reihenfolge
 
So, Problem gelöst :-D
Ich habe die TViewport3D Komponente einfach kopiert und angepasst.
Komischerweise wurde die sort-Funktion dort nicht verwendet, was alle Probleme lösen würde.

Eine eigene Prozedur für den neuen Viewport (TGameScene), die die Möglichkeit bietet sich selbst zu aktualisieren, sollte da helfen.
Delphi-Quellcode:
procedure TGameScene.update;
var
  comp: TRenderingComp;
begin
  comp := TRenderingComp.Create;
  try
    FRenderingList.Sort(comp);
  finally
    comp.Free;
  end;

  Self.Repaint;
end;
Delphi-Quellcode:
TRenderingComp = class(TComparer<TControl3D>)
  public
    function Compare(const Left, Right: TControl3D): Integer; override;
end;
Und nun kommt die eigentliche Sortierung.
Delphi-Quellcode:
function TRenderingComp.Compare(const Left, Right: TControl3D): Integer;
begin
  // Zuerst kommen alle Elemente mit kleinerem Tag
  if left.Tag < right.Tag then
  begin
    Result := -1;
    exit;
  end
  else if left.Tag > right.Tag then
  begin
    Result := 1;
    exit;
  end;

  // Haben 2 Elemente den selben Tag, dann entscheidet die Z-Position
  if left.Position.Z > right.Position.Z then
    Result := 1
  else if left.Position.Z < right.Position.Z then
    Result := -1
  else if left.Position.X > right.Position.X then
    Result := 1
  else if left.Position.X < right.Position.X then
    Result := -1
  else
    Result := 0; // gleiche X und Z-Koordinaten
end;
Ich habe hier nach der z-Reihenfolge sortiert, weil in meinem Fall am wichtigsten ist.
Spezielle TImage3D Objekte, wie der "Untergrund" bekommen von mir einen negativen Tag mitgegeben, damit meine Compare-Funktion diese bevorzugt.

Der schöne Günther 7. Mär 2014 19:08

AW: Firemonkey Image3D Rendering Reihenfolge
 
Deinem Bild nach zu urteilen willst du doch so einen Sidescroller mit Parallaxe-Effekt machen, oder? Dann wäre stumpf nach Z zu sortieren ja auch richtig :-)

LexLing 9. Mär 2014 11:15

AW: Firemonkey Image3D Rendering Reihenfolge
 
Beides richtig :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 Uhr.
Seite 2 von 2     12   

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