Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2D] Auf Textur zugreifen (https://www.delphipraxis.net/90178-%5Bandorra-2d%5D-auf-textur-zugreifen.html)

Bääääär 12. Apr 2007 22:53


[Andorra 2D] Auf Textur zugreifen
 
Hallihallo.

Jetzt habe ich mich hier endlich mal angemeldet, und das habt ihr dem Entwickler von Andorra zu verdanken, denn an den richtet sich meine eigentliche Frage.

Ich habe mir die 2D-Engine Andorra runtergeladen und bin begeistert von der Unkompliziertheit dieser Engine. Leider Fehlt mir definitiv etwas, oder ich finde es nicht.
Ich möchte eine Mischung aus Worms und CS Programmieren. Damit man die Landschaft wegsprengen kann und damit die Kollusion einfacher wird, mochte ich meine Maps wie folgt handhaben:

Es gibt ein Bitmap, welches die Map beinhaltet. Alles was transparent (und ohne Kollusion) sein soll, ist mit clFuchsia eingepinselt. Die Map auf den Screen zeichnen ist kein Problem. Aber Ich muss irgendwie auf die Textur zugreifen können. Ich muss herausfinden können, ob ein Pixel nun clFuchsia ist, sprich: ob er eine Kollision hat. Außerdem muss ich bestimmte bereiche mit clFuchsia einfärben, damit diese Transparent werden und keine Kollusion mehr haben (weil sie jemand weggesprengt hat).

Aber es gibt keine Möglichkeit, auf die Textur zuzugreifen. Die Textur in ein externes Bitmap zu laden, wäre eine andere Alternative. Dann hätte man einmal die Textur und dann dazu die Kollusionsmap im diesem Bitmap. Einziges Problem: jedesmal, wenn jemand etwas von der Map wegsprengt, muss dieses Bitmap verändert UND die Textur aktualisiert werden (sprich: Freigeben und neu Laden). Bei Texturen über 200x200 Pixeln dauert das zu lange und würde den Spielfluss behindern.

Was also kann ich tun?

Vielen Dank,
Johanes

igel457 14. Apr 2007 20:06

Re: [Andorra 2D] Auf Textur zugreifen
 
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

Bääääär 15. Apr 2007 14:32

Re: [Andorra 2D] Auf Textur zugreifen
 
Was wäre denn, wenn ich ein 1-Bit-Bitmap im Speicher halte (und davon die Kollusion errrechne und darauf die einschusslöcher male) und dieses dann als alphamap für die Terrain-Textur nutze?
Ich habe nur noch nicht gefunden, wie ich ein bitmap als alpha-channel in die Textur integriere. Das würde dann jedesmal passieren, wenn man ein Einschussloch macht.

igel457 16. Apr 2007 15:18

Re: [Andorra 2D] Auf Textur zugreifen
 
Hallo Bääääär,
Das könntest du auch machen. Den Alphachannel kannst du folgendermaßen hereinladen:
Delphi-Quellcode:
var
  adbmp:TAdBitmap;
begin
  adbmp := TAdBitmap.Create;
  adbmp.ReserveMemory(Image.Width,Image.Height);
  Image.Texture.Texture.SaveToBitmap(adbmp);

  mask.BitDepth := pf24Bit; //Wird zwar auch automatisch gemacht, ich schreibe es trotzdem nochmal hin
  adbmp.AssignAlphaChannel(mask);
  mask.BitDepth := pf1Bit;

  Image.Texture.Texture.LoadFromBitmap(adbmp);
  adbmp.Free;
end;
So sollte das auch gehen...

Bääääär 16. Apr 2007 15:50

Re: [Andorra 2D] Auf Textur zugreifen
 
Gibt es Auch die Möglichkeit, den beim vorherigen OnIdle beschriebenen Buffer weiter zu nutzen, und nur die Stellen zu aktualisieren, die auch wirklich Aktualisiert werden müssen? Das würde der CPU sehr viel Rechenarbeit abnehmen.

igel457 16. Apr 2007 19:51

Re: [Andorra 2D] Auf Textur zugreifen
 
Auch wenn es eine andere Frage ist...
Nein, dass ist (noch) nicht möglich. Die CPU Auslastung würde aber auch dann bei 100% liegen. Du kannst die CPU-Auslastung auch durch die Benutzung eines Multimediatimers (gibts hier im Forum von CK_CK) auf so ca. 10% herunterkriegen.

Bääääär 16. Apr 2007 20:01

Re: [Andorra 2D] Auf Textur zugreifen
 
Ich wollte ja nicht eine gerungere Auslastung der CPU erreichen, viel Eher eine Bessere Framerate in Großen und komplizierten Maps oder Zeichenvorgängen. Eine solche Funktion fände ich sehr vorteilhaft, vielleicht findest du ja mal Zeit, etwas derartiges zu integrieren. (Rein Technisch sollte es nicht allzu schwer sein).

Bääääär

PS: Ich staune immer wieder über deine Engine (und deine Delphi-Kenntnisse). Großes Lob von mir für diese Entwicklug :!:

igel457 17. Apr 2007 12:50

Re: [Andorra 2D] Auf Textur zugreifen
 
Zitat:

Eine solche Funktion fände ich sehr vorteilhaft, vielleicht findest du ja mal Zeit, etwas derartiges zu integrieren. (Rein Technisch sollte es nicht allzu schwer sein).
Das ist eine sehr gute Idee und ich werde mich darum kümmern. Eigentlich sollte es wirklich nicht so schwer realisierbar sein.

Auch danke für dein Lob,
Igel457


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 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