AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [Andorra 2D] Auf Textur zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

[Andorra 2D] Auf Textur zugreifen

Ein Thema von Bääääär · begonnen am 12. Apr 2007 · letzter Beitrag vom 17. Apr 2007
Antwort Antwort
Bääääär

Registriert seit: 12. Apr 2007
Ort: Thüringen
28 Beiträge
 
Delphi 2005 Personal
 
#1

[Andorra 2D] Auf Textur zugreifen

  Alt 12. Apr 2007, 23:53
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
  Mit Zitat antworten Zitat
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
Bääääär

Registriert seit: 12. Apr 2007
Ort: Thüringen
28 Beiträge
 
Delphi 2005 Personal
 
#3

Re: [Andorra 2D] Auf Textur zugreifen

  Alt 15. Apr 2007, 15:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

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

Re: [Andorra 2D] Auf Textur zugreifen

  Alt 16. Apr 2007, 16:18
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...
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
Bääääär

Registriert seit: 12. Apr 2007
Ort: Thüringen
28 Beiträge
 
Delphi 2005 Personal
 
#5

Re: [Andorra 2D] Auf Textur zugreifen

  Alt 16. Apr 2007, 16:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

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

Re: [Andorra 2D] Auf Textur zugreifen

  Alt 16. Apr 2007, 20:51
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.
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
Bääääär

Registriert seit: 12. Apr 2007
Ort: Thüringen
28 Beiträge
 
Delphi 2005 Personal
 
#7

Re: [Andorra 2D] Auf Textur zugreifen

  Alt 16. Apr 2007, 21:01
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

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

Re: [Andorra 2D] Auf Textur zugreifen

  Alt 17. Apr 2007, 13:50
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
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz