Kann es daran liegen, dass ich die Textur sozusagen manuell [edit]reinlade[/edit]? Ich habe nämlich ein eigenes Dateiformat für die Spritelisten, weil ich Zusatzinformationen speichern muss. Daher kann ich die AdImagelist nicht benutzen.
Ich geb dir mal etwas Code, vielleicht kannst du es damit ja reproduzieren oder mir sagen, welche Funktion ich vergessen habe aufzurufen.
Delphi-Quellcode:
procedure TSgMap.LoadSkinsFromFile(const FileName: string);
var
i: integer;
tmpabmp: tadbitmap;
begin
// Skinliste laden
fskinlist.LoadFromFile(filename);
if assigned(fparent) then
begin
// Temporäres Andorrabitmap erstellen, um die textur zu laden:
tmpabmp := tadbitmap.Create;
for i := 0 to fSkinlist.Count - 1 do
begin
if not assigned(fskinlist[i].sprite) then
fskinlist[i].Sprite := TAdImage.Create(fParent.adDraw);
// fskinlist[i].Image ist ein TBitmap32, das das Sprite enthält (inkl. Alphachannel)
Bitmap32IntoAndorraBitmap(fskinlist[i].Image,tmpabmp);
fSkinList[i].Sprite.Texture.Texture.LoadFromBitmap(tmpabmp,
fParent.adDraw.GetTextureParams(fskinlist[i].Sprite.Texture.BitDepth));
fskinlist[i].Sprite.Restore;
end;
freeandnil(tmpabmp);
end;
end;
// Code teilweise von Andorra-Units abgeschaut:
procedure Bitmap32IntoAndorraBitmap(aBmp32:TBitmap32;aAndorraBmp:TAdBitmap);
var
x,y:integer;
sl1:PColor32;
sl2:pRGBARec;
begin
aAndorraBmp.ReserveMemory(aBmp32.width,aBmp32.height);
sl2 := aAndorraBmp.ScanLine;
sl1 := @(aBmp32.Bits^[0]);
for y := 0 to aBmp32.Height-1 do
begin
for x := 0 to aBmp32.Width - 1 do
begin
tcolor32(sl2^) := sl1^;
inc(sl2);
inc(sl1);
end;
end;
end;
Achja, übrigens Danke für den bug in deiner Engine, denn das genauere Betrachten des Codes hatte den Nebeneffekt, dass ich Codeteile gefunden habe, die völlig sinnlos waren (ältere Versuche) und konnte so den Code auf c.a. 1/3 reduzieren, würde ich sagen. xD