Prinzip: Fog of War

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mudvayne

Betreff: Prinzip: Fog of War

BeitragDi, Aug 19, 2008 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Bie unserem momentanen Echtzeit Strategie-Projekt, sind wir bei der implementierung des Fog of War bzw. Kriegsnebel angelangt. Also diese Schattierung unter dem man nicht sieht (vgl. Age of Empires, Starcraft etc.)

Nun zur eigentlichen Frage:
Wir arbeiten mit einem Tile-Map (ein Tile 32x32 Pixel). Unser Ansatz war über diese Map nochmals eine Map die den Fog darstellt zu zeichnen. Diese zweite "Fogmap" wird nur bis dahin gezeichnet wo keine Einheiten bzw. Gebäude mit deren Sichtradien stehen, dort wo sie nicht gezeichnet wird, wird die normale "Terrain-Map" sichtbar.
Soweit so gut. Allerdings stellten wir bei ersten Tests vor, dass diese Variante sehr zu Lasten der Performance geht (es ruckelt wie gestört). Was ja eigentlich auch klar ist da wird jeweils 2 Maps übereinander zeichnen.
Wenn wir nur jeweils den notwendigen Teil beider Maps (Terrain und Fog) zeichnen, ist das Problem, dass der Sichtradius nicht linear sondern Tile-weise ist. Wir möchten also Pixelgenau die Map aufdecken können.

Ist unser Ansatz grundlegend schlehct/falsch? Habt ihr schon ein ähnliches/gleiches Problem lösen müssen oder in eurem Spiel möglicherweise schon einen FoW implementiert?
Für jegliche Lösungsansätze und Denkanstösse sind wir schon mal im Voraus dankbar.

mfG Mudvayne
 

da_poller

BeitragDi, Aug 19, 2008 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
du könntest die tiles abfragen ob sie sichtbar sind und dann halt einen 2ten frame des terrain laden und keine einheiten machen...

somit bruachst du halt von jedem terrain vllt ein abgedunkelte version

hoffe das war soweit verständlich...

ansonsten viel glück dabei

Smily

BeitragDi, Aug 19, 2008 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

wenn du den Fog Of War pixelgenau haben möchtest, solltest du anders vorgehen:

- Du erstellst dir ein Bild in der größe der gesammten karte, da kommt der Fog rein.
- Diesen Zeichest du über die karte
- Wenn sich was ändert, malst du mit der Maskfarbe direkt in den Imagebuffer rein


cu,
Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

da_poller

BeitragDi, Aug 19, 2008 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
smily ist das so echtzeitfähig? wenn ich da so denke das das bild dann vlla an die 5000x5000 px groß ist.. kommt ja auhc ncoh n ziemlicher speicher zusammen..

Smily

BeitragDi, Aug 19, 2008 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf die Schnelle fällt mir leider nichts besseres ein, was sich schnell umsetzen lässt.

Eine möglichkeit wäre natürlich ein Tileset, in denen man nur die Blöcke, die nicht vollkommen leer oder voll sind, extra hält, alle anderen haben einen standard-flag.
Welche blockgrößen dann am Effizientesten Sind, müsste man ausloten.

Allerdings wäre das ein ziemlicher aufwand, ich glaube kaum, dass es sich bei dem Nutzen lohnt

Ach ja, und natürlich wichtig: Nur die Tiles zeichnen, die angezeigt werden, dann dürfte es auf aktuellen PCs keine probleme geben.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Ava

Gast

BeitragDi, Aug 19, 2008 20:11
Antworten mit Zitat
Smilys Vorschlag ist absolut echtzeitfähig und empfehlenswert. In früheren Projekten hat sich diese Methode für mich immer gut bewährt! Allerdings sollte es schon etwas optimiert werden (nimm beispielsweise kein einzelnes, gigantisches Image für den Fog, sondern verwende mehre, kleinere Bilder ect.).

biggicekey

BeitragDi, Aug 19, 2008 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
du brauchst den fog ja auch nur im sichtfeld der kamera zu zeichnen Wink
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]
 

da_poller

BeitragDi, Aug 19, 2008 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
dachte mir nur da ich in der annahme war das bildmanipulationen nicht sehr schnell sind in bb aber dann muss ich das doch nmal testen da ich selbst auch noch in zukunft das bei deadend einsetzen gedenke
 

Dreamora

BeitragDi, Aug 19, 2008 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
da_poller hat Folgendes geschrieben:
smily ist das so echtzeitfähig? wenn ich da so denke das das bild dann vlla an die 5000x5000 px groß ist.. kommt ja auhc ncoh n ziemlicher speicher zusammen..


Es braucht keinen Buffer der so gross ist wie die Map

Wo kann der Fog sein? Auf dem Bildschirm
Wie gross muss das Bild also höchstens sein? -> Bildschirm Smile

Damit fällt die menge der maximal nötigen änderungen schon erheblich kleiner aus als wenn du das ganze über die map legst.
Für die daten auf der map tut es ein simpler byte array in der grösse der map. von da wird dann das ins bild geschrieben was wirklich nötig ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

da_poller

BeitragDi, Aug 19, 2008 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt daran hab ich ncoh gar nciht gedacht...

shcon wieder ein denkproblem gelöst(naja zumindest der anfang)
 

mudvayne

BeitragMi, Aug 20, 2008 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo und Danke für die vielen Antworten

Wir zeichnen logischerweise immer nur den Kartenausschnitt der auch auf dem Bildschirm ist.

Die Idee mit dem Image und dann direkt Mask-Farbe darauf schreiben gefällt mir.
Soweit ich Dreamora verstanden habe soll ich für jede Bildschirmänderung ein neues Bild zeichnen und auf diesem dann masken. Oder reden wir aneinander vorbei?

mfG mudvayne
 

Dreamora

BeitragMi, Aug 20, 2008 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Du würdest immer wieder in den gleichen imagebuffer rein schreiben für den Fog.

Es liesse sich noch weiter optimieren. Statt immer in 1 grosses bild einzuzeichnen könntest du den fog of war als "tile layer" auslegen, das heisst statt 1 bild das den bildschirm ausfüllt, nimmst du viele bilder die zb 64x64 gross sind.
Warum das: einheiten werden vermutlich einen gross genugen fog of war haben das 1+ tiles sichtbar wären. in dem fall müsste man diese bilder garnicht zeichnen sondern nur die wo auch wirklich fog drin ist.
Damit kann man sich zeit sparen, zum einen beim zeichnen, zum anderen werden auch die änderungen im buffer schneller weil die buffer kleiner sein werden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group