Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   [Andorra 2D] Masken bei Texturen - Seltsamer Bug (https://www.delphipraxis.net/176813-%5Bandorra-2d%5D-masken-bei-texturen-seltsamer-bug.html)

Acuaplano 28. Sep 2013 02:12


[Andorra 2D] Masken bei Texturen - Seltsamer Bug
 
Liste der Anhänge anzeigen (Anzahl: 1)
Heyho Community,

ich hoffe es gibt hier noch ein paar Leute, die sich zumindest etwas mit Andorra 2D beschäftigt haben, weil ich nämlich an einer Stelle hängen bleibe.
Ich baue grad' nen Mapeditor und möchte die Übergänge von den Texturen bzw. Tiles mit Hilfe von Masken erstellen, damit ich sozusagen für mehrere Übergänge nur eine andere Textur (Gras, Erde) drunter legen muss. Mit etwas Recherche ( Thread ) und etwas rumprobieren hab ich's dann auch geschafft. Als ich das ganze dann für mehr als 1 Objekt machen wollte, hat's angefangen zu spinnen und jedes mal, wenn ich bei einem Tile, die Textur (im Sinne von Texturübergang ) geändert habe ( Prozedur unten ), haben alle anderen Tiles genau die selbe Textur angenommen. Dabei gehören die Variablen/Objekte, die benutzt werden, eigentlich alle zu jeweils einem Tile :?:

Delphi-Quellcode:
TTile = class(TImageSprite)
  private
    ImageBmp, Mask: TAdBitmap;
    MaskObject: TImageSprite;
    function GetTransitionNumber: integer;
  public
    FCaption: string;
    FRasterX, FRasterY: integer;
    constructor Create(AParent: TSprite); override;
    procedure SetCaption(TerrainName: string);
    procedure SetCoordinates(rX, rY: integer; rZ: integer = 10);
    procedure UpdateTransitions;
  published
    property Caption: string read FCaption write SetCaption;
    property RasterX: integer read FRasterX write FRasterX;
    property RasterY: integer read FRasterY write FRasterY;
  end;
Delphi-Quellcode:
procedure TTile.SetCaption(TerrainName: string);
var
  TransitionValue: integer;
  TestBmp: TAdBitmap;
begin
    FCaption := TerrainName;
    raster[FRasterX, FRasterY] := TerrainName;
    Image := AdImageList1.Find(TerrainName);
    if FCaption = 'grass' then
    begin
      TransitionValue := GetTransitionNumber;
      Image := TextureImageList.Find(TerrainName + '_' + IntToStr(TransitionValue));
        { Lädt zuerst rohe Maske mit Hilfe eines Sprites und speichert
          sie in Mask
          -> Rohe Grastextur wird in ImageBmp gespeichert
            -> Alpha-Kanal wird von der Maske auf die Grastextur übertragen
              -> alte Tile-Textur wird durch Neue ersetzt
          }
      Image := TextureImageList.Find(FCaption + '_15');
      MaskObject.Image := TextureImageList.Find('mask_grass_' +
        IntToStr(TransitionValue));
      MaskObject.Image.Texture.SaveToGraphic(Mask);
      Image.Texture.SaveToGraphic(ImageBmp);
      Mask.AssignAlphaChannel(ImageBmp);
      Image.Texture.Texture.LoadFromBitmap(ImageBmp, ad32bit);

      if RasterY - 1 >= 0 then
        TileMap[RasterX, RasterY - 1].UpdateTransitions;
      if RasterY + 1 <= 63 then
        TileMap[RasterX, RasterY + 1].UpdateTransitions;
      if RasterX - 1 >= 0 then
        TileMap[RasterX - 1, RasterY].UpdateTransitions;
      if RasterX + 1 <= 63 then
        TileMap[RasterX + 1, RasterY].UpdateTransitions;

    end;
end;
"UpdateTransitions" führt im Grunde das gleiche aus, nur ohne "UpdateTransitions". Ich will ja keine Endlosschleifen :-D.
Aber irgendwas muss ich da doch noch übersehen haben...


Edit:
Ich hab nochmal ein Bild davon angehängt, vielleicht wird es damit etwas klarer.
Auf dem Bild kann man die Veränderung sehen, wenn ich Gras auf eine Stelle der Karte setze. Für das neue Quadrat ist die Textur richtig, aber warum ändert der das bei den anderen Quadraten auch? Aus irgendeinen Grund müssen dann doch alle Tiles fälschlicherweise auf die selbe Variable zugreifen...

Acuaplano 30. Sep 2013 16:57

AW: [Andorra 2D] Masken bei Texturen - Seltsamer Bug
 
*push*

Hat niemand ne Idee?

Acuaplano 14. Okt 2013 14:23

AW: [Andorra 2D] Masken bei Texturen - Seltsamer Bug
 
Auch wenn hier bis jetzt niemand geantwortet hat, ich schreib hier mal trotzdem hin, was ich rausbekommen hab. Könnte ja mal interessant für andere werden...
Der (Denk-)Fehler lag schon ganz am Anfang bei der Erstellung des Objekts.
Delphi-Quellcode:
With TestTile do
    begin
      Image := AdImageList1.Find('EmptyTile');  // <-----
      X := 200;
      Y := 200;
      Z := 50004;
    end;
Hier wird nämlich keine Kopie, sondern nur ein Zeiger weitergegeben, weshalb man die Textur aller Objekte gleich mitverändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.

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