Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

Re: [Andorra 2D] Auf Textur zugreifen

  Alt 14. Apr 2007, 21:06
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat