Auf der Suche nach vielversprechenden Schatten für Roguelike



Sehr geehrte Khabrovchans, ich möchte Sie auf die Fortsetzung der Forschung zum Thema der Suche nach geeigneten Schatten für einen 2D-Bagel aufmerksam machen.

Dieser Beitrag ist eine Fortsetzung der Veröffentlichung , eine Art Arbeit über Fehler und die Weiterentwicklung der Idee.

In ihren Kommentaren stellten angesehene Kritiker zu Recht fest, dass sich die Schatten in geschlossenen Räumen als eckig und etwas unnatürlich herausstellten. Es wurden mehrere Lösungen vorgeschlagen. Ich mochte den Vorschlag, Ray Casting zur Berechnung des Schattens zu verwenden.



Ich stelle klar, ich arbeite nicht mit der Grafikkarte (ich arbeite noch nicht), alle Ergebnisse sind auf der CPU modelliert.

In dieser Arbeit über Reykasting verstehen wir die Methode zur Konstruktion eines Bildes, indem Strahlen eines Beobachters in den Raum geworfen werden, bis sie sich mit einem Hindernis (Bildschirmgrenzen) schneiden und den Ort ihrer Kollision hervorheben.

Hier verwenden wir eine vereinfachte Version von Rakecasting, die auf dem Schnittpunkt einer Kachel mit einem Strahl basiert. Diese Methode ist in pseudo-dreidimensionalen Spielen der Vergangenheit weit verbreitet (z. B. Wolfenstein_3D , Ehrfurcht vor denjenigen, die sich mit dem Thema befassen). Wir passen sie für den zweidimensionalen Raum an.



Der Algorithmus ist sowohl zum Verständnis als auch zur Verkörperung einfach genug. Ich werde meine eigene Implementierung mitbringen:

Pascal
// i,j -  ,  -  // X,Y -    // r -     //   if cos(a)<0 then begin di :=-1; ddi:= 0; end else begin di := 1; ddi:= 1; end; if sin(a)<0 then begin dj :=-1; ddj:= 0; end else begin dj := 1; ddj:= 1; end; //        Y x1 := (i+ddi) * tile_size; y1 := y+ (x1-x) * tan(a); Dx := len(x,y,x1,y1); y1 := (j+ddj) * tile_size; x1 := x+ (y1-y) * cotan(a); Dy := len(x,y,x1,y1); sum_lenX := 0; sum_lenY := 0; //    X  Y   a rX := abs(tile_size / cos(a)); rY := abs(tile_size / sin(a)); //    repeat if sum_lenX+DX < sum_lenY+DY then begin x1 := (i+ddi) * tile_size; y1 := y+ (x1-x) * tan(a); i := i+di; //         key := is_wall(i,j); sum_lenX := sum_lenX + DX; if DX<>rX then DX:=rX; //       if r<sum_lenX then Break; end else begin y1 := (j+ddj) * tile_size; x1 := x+ (y1-y) * cotan(a); j := j+dj; //         key := is_wall(i,j); sum_lenY := sum_lenY + DY; if DY<>rY then DY:=rY; //       if r<sum_lenY then Break; end; until (      ); // x1,y1   

Da der Strahl die Zellen auf jeder Achse im gleichen Abstand kreuzt, können Sie Berechnungen sparen und nur prüfen, ob sich Wände innerhalb der Kachel befinden. Wir brauchen eine Kreuzung mit einem Hindernis und erinnern uns an seine Koordinaten.

In meiner Implementierung habe ich alle Trigonometrie und Unterteilungen für jeden Winkel in einer separaten Tabelle zusammengefasst, was den Algorithmus erheblich beschleunigte.

Nachdem wir die Strahlen mit dem gewünschten Schritt in alle Richtungen gestartet haben, erhalten wir ungefähr das folgende Bild:



Erhöhen Sie die Anzahl der Strahlen auf mehrere Tausend und erhalten Sie das gewünschte Polyeder des Oszilloskops. Es ist natürlich möglich, Strahlen für jedes Pixel des Bildes zu werfen, wie bei 3D-Beschleunigern, aber Sie können hier nicht auf eine Grafikkarte verzichten.



Die weitere Arbeit mit Schichten beginnt.

Geltungsbereich Danach gelangen die Strahlen ein wenig in die Tiefe von Objekten. Eine solche Spielkonvention schafft eine einzigartige Umgebung, die für 2D-Spiele charakteristisch ist.



Generierung von Beleuchtungskarten. Wir generieren statische Lichtquellen im Voraus und zwischenspeichern sie, um die Leistung zu verbessern. Wir wenden dynamische Lichtquellen bei der Anzeige auf dem Bildschirm an.



Alles zusammenbringen. Alles was fehlt sind schreckliche Monster und Schätze ... viele Schätze.



Wände mit einer variablen Krümmung des Eindringens von Licht gingen nicht zu mir, aber vielleicht ist es ein Amateur.



Bei der Erstellung des Prototyps habe ich viele Variationen des Modells ausprobiert, von denen einige besser für Horror geeignet sind:



Ich mochte besonders die Wirkung von Mehrfachreflexionen von Strahlen von den Wänden, aber selbst die naive Umsetzung war so langsam, dass ich sie für die Zukunft verließ, als ich mich mit der Grafikkarte anfreundete.

Vielen Dank für Ihre Aufmerksamkeit.

Link zum Spielen (exe für Windows)

Teil 1 , Teil 3

Source: https://habr.com/ru/post/de431304/


All Articles