Raumschiff Schild Flare

7

Ich versuche ein System zu implementieren, bei dem eine "Schildfackel" angezeigt wird, wenn ein Projektil auf den Schild trifft. Der Schild selbst ähnelt einem in Star Wars, wo er eher einer Haut um das Raumschiff ähnelt als einer einfachen Blase.

Das Problem, das ich habe, ist zu bestimmen, wie ein einfacher Flare-Effekt gezeichnet werden soll, bei dem das Projektil auf den Schild auftrifft. Ich kann den Vector2-Punkt bestimmen, an dem der Schild getroffen wurde. Im Moment kann ich den gesamten Schild zeigen, wenn er gut getroffen wird.

Das Problem, wie ich es sehe, ist, dass ich den Schild irgendwie ausblenden muss, bis auf ein paar Pixel um den Aufprallpunkt. Entweder das, oder ich gehe das völlig falsch an.

Was ich bisher tun kann, ist den ganzen Schild zu ziehen:

Schiff mit ganzem Schild

Was ich brauche, ist in der Lage zu sein, ein Stück des Schildes am Aufprallpunkt zu zeichnen:

Schild mit Stück Schild

Jede Hilfe wäre dankbar.

Jack
quelle
Es wäre schön, wenn Sie ein Bild von Ihrem Ziel hinzufügen würden - ist es ein 2D-Spiel?
Wondra
1
Wäre es nicht einfacher, am Aufprallpunkt einen Partikeleffekt zu erzeugen? Ein Bild von dem, was Sie erreichen wollen, könnte tatsächlich helfen.
Felsir

Antworten:

4

Sie können dies über die Maskierung der CPU tun, wenn Sie noch keine Shader verwenden möchten.

Sie benötigen diese Ressourcen:

  • Raumschiff Textur (kein Schild sichtbar, links )
  • Schildstruktur (nur der Schild sichtbar, muss zum Schiff passen, Mitte )
  • Leere bearbeitbare Textur (Pixmap), auf die Sie zeichnen können (gleiche Größe wie Schildtextur, rechts )
  • Einschlagspunkt

Sie können Ihr Schiff wie gewohnt zeichnen. Nachdem Sie das Schiff gezeichnet haben, müssen Sie die Pixel der Schildtexturen, die sich in einem bestimmten Abstand (einige Pixel, möglicherweise 3 oder 4) vom Aufprallpunkt befinden, in Ihre leere Textur kopieren und diese bearbeitete Textur über Ihrer rendern Schiff. Sie sollten das Kopieren für jeden Aufprallpunkt wiederholen. Kopieren Sie einfach alles in dieselbe Textur.

Dieses Bild zeigt die Texturen von links nach rechts in der gleichen Reihenfolge wie in meiner Liste. (Die roten Teile dienen nur zur Visualisierung von Rändern und anderen Dingen.)

Beschreibung

Wenn Sie möchten, dass es auch schnell ist, müssen Sie es mit einem benutzerdefinierten Pixel-Masking-Shader rendern. Es sollte genauso einfach sein wie dieser Prozess, wenn Sie wissen, wie man Shader verwendet, aber ich weiß nicht, wie ich Ihnen dort helfen kann .

Bearbeiten: Eine einfache Möglichkeit, dies näherungsweise zum Laufen zu bringen, besteht darin, nur einen Partikeleffekt an der Stelle des Aufpralls zu zeichnen, wie von Felsir vorgeschlagen, der ebenfalls in Richtung Schiffsmitte (oder nur zur Mitte der Textur) gedreht wird. Sie werden wahrscheinlich keinen großen Unterschied zwischen dieser und einer maskierten Schildstruktur sehen, es wird auch viel schneller sein.

VaTTeRGeR
quelle
3

Sie können dies mit einem Multiplikations-Mischzustand zeichnen.

BlendState multiplyblend = new BlendState();
multiplyblend.ColorBlendFunction = BlendFunction.Add;
multiplyblend.ColorSourceBlend = Blend.DestinationColor;
multiplyblend.ColorDestinationBlend = Blend.Zero;

Erstellen Sie eine Bitmap eines weißen Kreises auf einem schwarzen Hintergrund (Maske). Das Weiß ist der Teil des Schildes, der sichtbar sein sollte. Da Sie den Aufprallpunkt kennen, wissen Sie, wo Sie den Mittelpunkt des Kreises platzieren müssen. Zeichnen Sie den Schild, multiplizieren Sie die Grafik mit dem weißen Kreis (zeichnen Sie effektiv alles andere schwarz). Fügen Sie dann das Raumschiff-Sprite im normalen Mischmodus hinzu.

Denken Sie daran, dass SpriteSortMode.Immediatedies erforderlich ist .

Wenn Sie viele Schilde / Schiffe haben, bereiten Sie alle weißen Kreise auf einer bildschirmgroßen Textur vor und lassen Sie den Effekt einmal zeichnen. Die Maske sollte sich dazu auf einem transparenten Hintergrund befinden, da das Masken-Rendertarget schwarz gefärbt wird:

  1. Zeichne alle Schilde auf den Bildschirm
  2. Löschen Sie das Masken-Rendertarget mit Schwarz
  3. Zeichnen Sie alle weißen Kreise, in denen Schilde auf dem Rendertarget sichtbar sein sollen (erstellen Sie effektiv eine Maske in Bildschirmgröße).
  4. Multiplizieren Sie den Bildschirm und das Masken-Renderziel.
  5. Zeichne den Rest der Spieleinheiten.
Felsir
quelle