Prinzip: Fog of War
Übersicht

mudvayneBetreff: Prinzip: Fog of War |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
AvaGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
du brauchst den fog ja auch nur im sichtfeld der kamera zu zeichnen ![]() |
||
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller Nothing more to register - you've cleaned us out![/size] |
da_poller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
stimmt daran hab ich ncoh gar nciht gedacht...
shcon wieder ein denkproblem gelöst(naja zumindest der anfang) |
||
mudvayne |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group