SDL - Zeichnung 'negative' Kreise (Nebel des Krieges)

7

Ich habe dieses 800x600 Quadrat, das ich auf den Bildschirm zeichnen möchte. Ich möchte Kreise darin "schneiden" (wo Alpha wäre 0). Im Grunde zeichne ich dieses ganze Rechteck über eine Karte, also zeichne ich in diesen "Kreisen" die Karte, sonst siehst du das graue Quadrat

    
will 30.11.2012, 23:41
quelle

1 Antwort

26

Also, ich nehme an, dass du versuchst, einem von euch Game of Light Krieg hinzuzufügen?

Ich hatte eine kleine Demo, die ich vor ein paar Wochen für eine lokale Universität gemacht habe, um A * Wegfindung zu zeigen, also dachte ich, ich könnte für Sie Nebel des Krieges hinzufügen. Hier sind die Ergebnisse:

Erste Karte

Zuerst beginnen Sie mit einer vollständigen Karte, vollständig sichtbar

Nebel

Dann habe ich eine Oberfläche hinzugefügt, um den gesamten Bildschirm abzudecken (beachte, dass meine Karte kleiner ist als der Bildschirm, also habe ich für diesen Fall nur Nebel des Krieges auf den Bildschirm gelegt, aber wenn du scrollst, vergewissere dich, dass es bedeckt jedes Kartenpixel 1: 1)

%Vor%

Dann müssen Sie es zeichnen ... Ich habe diesen Aufruf nach dem Zeichnen der Spielobjekte und vor dem Zeichnen der Benutzeroberfläche

hinzugefügt %Vor%

Wo

%Vor%

Was Ihnen das folgende Ergebnis geben sollte:

"Lochfläche"

Ich habe dann eine 32 Bits .png erstellt, die so aussieht (Schachbrett zeigt Alpha)

Beim Rendern meines Hauptcharakters habe ich diesen Aufruf hinzugefügt:

%Vor%

Der Versatz ist nur dazu da, um den Schlag mit dem Sprite zu zentrieren, was ich an RemoveFogOfWar übergebe, ist das Zentrum meines Sprites.

Nebel des Krieges entfernen

Jetzt das Fleisch des Nebels des Krieges. Ich habe zwei Versionen gemacht, eine, in der "Nebel des Krieges" permanent entfernt wird und eine, bei der der Nebel des Krieges zurückgesetzt wird. Mein Nebel der Kriegsrückstellung beruht auf meiner punch -Oberfläche, um eine Kontur zu haben, wo das Alpha auf 0 zurückgesetzt wird und die Tatsache, dass sich mein Charakter von weniger Pixeln bewegt, als die Kontur pro Bild enthält, sonst würde ich Rect behalten wo mein Schlag angewendet wurde und ich ihn wieder auffüllen würde, bevor ich den neuen Schlag wieder zeichne.

Da ich mit SDL keine "Multiplikation" -Mischung finden konnte, entschied ich mich, eine einfache Funktion zu schreiben, die auf der Stanzoberfläche iteriert und das Alpha auf dem Nebel der Kriegsoberfläche aktualisiert. Der wichtigste Teil ist, dass Sie innerhalb der Grenzen Ihrer Oberflächen bleiben, so dass es den größten Teil des Codes einnimmt ... vielleicht gibt es einige Crop-Funktionen, aber ich habe nicht nachgesehen:

%Vor%

Das hat mir das auch mit keepFogRemoved = false gegeben, auch nachdem der Charakter sich bewegt hat

Und das mit keepFogRemoved = true

Validierung

Der wichtige Teil besteht darin, sicherzustellen, dass Sie nicht außerhalb Ihres Pixelpuffers schreiben. Achten Sie also auf negative Offsets oder Offsets, die Sie außerhalb der Breite oder Höhe bringen würden. Um meinen Code zu validieren, habe ich einen einfachen Aufruf von RemoveFogOfWar hinzugefügt, als die Maus angeklickt wurde und Ecken und Kanten ausprobiert wurde, um sicherzustellen, dass ich kein "Aus-dem-Eins" -Problem hatte

%Vor%

Hinweise

Sie brauchen natürlich keine 32-Bit-Textur für den "Punch", aber es war der klarste Weg, den ich mir vorstellen konnte, um Ihnen zu zeigen, wie es geht. Es könnte mit nur 1 Bit pro Pixel (ein / aus) getan werden. Sie können auch einen Farbverlauf hinzufügen und das

ändern %Vor%

Zu etwas wie

%Vor%

Um eine glatte Mischung wie folgt zu erhalten:

3 Staatsnebel des Krieges

Ich dachte, ich sollte das hinzufügen ... Ich habe einen Weg hinzugefügt, um einen 3-Zustands-Nebel des Krieges zu erzeugen: visible , seen und fogged .

Um dies zu tun, behalte ich einfach die SDL_Rect , wo ich zuletzt den Nebel des Krieges "gelocht" habe, und wenn das Alpha niedriger als ein bestimmter Wert ist, klemme ich es bei diesem Wert.

Also, einfach

hinzufügen %Vor%

direkt vor der Schleife, wo der Nebel des Krieges "geschlagen" wird, bekomme ich einen Nebel des Krieges ähnlich dem, was Sie in Spielen wie StarCraft haben könnten:

Nun, da der "gesehene" Nebel des Krieges halbtransparent ist, musst du deine Rendering-Methode optimieren, um "Feinde", die im Nebel liegen würden, korrekt zu schneiden, so dass du sie nicht siehst, aber immer noch die Gelände.

Hoffe, das hilft!

    
emartel 01.12.2012, 18:03
quelle

Tags und Links