![]() |
[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 |
Re: [Andorra 2D] Auf Textur zugreifen
Hallo,
Es gibt schon möglichkeiten auf die Textur zuzugreifen:
Delphi-Quellcode:
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.
Image.Texture.Texture.SaveToBitmap(Abmp:TAdBitmap);
Image.Texture.Texture.LoadFromBitmap(Abmp:TAdBitma;BitDepth:byte); Da ich die Engine geschrieben habe um ![]() Du könntest also folgendes tun (mask ist die Kollisionsmap):
Delphi-Quellcode:
Das ist meiner Meinung nach die einfachste und schnellste Lösung. Manchmal muss man halt etwas Speicher opfern, um die Performance aufrecht zu erhalten.
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; Ich hoffe dir damit geholfen zu haben, Igel457 |
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. |
Re: [Andorra 2D] Auf Textur zugreifen
Hallo Bääääär,
Das könntest du auch machen. Den Alphachannel kannst du folgendermaßen hereinladen:
Delphi-Quellcode:
So sollte das auch gehen...
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; |
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.
|
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. |
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 :!: |
Re: [Andorra 2D] Auf Textur zugreifen
Zitat:
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