Hallo,
Es gibt schon möglichkeiten auf die Textur zuzugreifen:
Delphi-Quellcode:
Image.Texture.Texture.SaveToBitmap(Abmp:TAdBitmap);
Image.Texture.Texture.LoadFromBitmap(Abmp:TAdBitma;BitDepth:byte);
Allerdings ist auch diese Methode besonders bei großen Bildern äußerst langsam, weshalb ich sie nicht jedes mal, wenn du eine Kollsionsabfrage machen möchtest, aufrufen würde.
Da ich die Engine geschrieben habe um
mein Spiel, welches (du errätst es schon) eine Mischung aus Worms und CS ist, ein wenig auf Vordermann zu bringen, gibt es für das Problem nätürlich eine Lösung. Die erste wäre einmal, dass du die Landschaft in viele kleine Bildchen (am besten mit der Größe 128x128 o. 256x256) zerstückelst. Für die Kollsionen würde ich aber trotzdem ein 1-Bit Bitmap im Systemspeicher halten - das geht einfach viel schneller und belegt bei einer 5000x2000 großen Map gerade mal ein bisschen mehr als 1MB. So viel solltest du noch übrig haben.
Du könntest also folgendes tun (mask ist die Kollisionsmap):
Delphi-Quellcode:
procedure TTerrainTile.MakeExplosionHole(X,Y,Size:integer);
var
adbmp:TAdBitmap;
bitbuf:TBitmap;
begin
//Ein temporäres TBitmap erzeugen
bitbuf := TBitmap.Create;
adbmp := TAdBitmap.Create;
adbmp.ReserveMemory(Image.Width,Image.Height);
//Die Textur in das TAdBitmap kopieren
image.Texture.Texture.SaveToBitmap(adbmp);
//Den Inhalt des TAdBitmaps in das Temporäre Bitmap kopieren
adbmp.AssignToBitmap(bitbuf);
adbmp.Free;
//Ein Explosionsloch oder was-auch-immer auf den Bitbuf zeichnen
with bitbuf.Canvas do
begin
Brush.Color := clFuchsia;
Pen.Color := clFuchsia;
Ellipse(X-Size,Y-Size,X+Size,Y+Size);
end;
//Die Kollisionsmap aktualisieren
mask.Assign(bitbuf);
mask.Mask(clFuchsia);
mask.Monochrome:=true;
mask.PixelFormat:=pf1Bit;
//Das neue Bitmap in den Texturspeicher kopieren
adbmp := TAdBitmap.Create;
adbmp.AssignBitmap(bitbuf);
image.Texture.Texture.LoadFromBitmap(adbmp,16);
adbmp.Free;
image.Restore;
bitbuf.Free;
end;
Das ist meiner Meinung nach die einfachste und schnellste Lösung. Manchmal muss man halt etwas Speicher opfern, um die Performance aufrecht zu erhalten.
Ich hoffe dir damit geholfen zu haben,
Igel457