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
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
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!