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
.
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...