Auf der Suche nach vielversprechenden Schatten für Roguelike

Published on November 27, 2018

Auf der Suche nach vielversprechenden Schatten für Roguelike



    Lieber Habrovchane, ich präsentiere Ihrer Aufmerksamkeit die Fortsetzung der Forschung auf der Suche nach geeigneten Schatten für einen 2D-Bagel.

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

    In ihren Kommentaren wiesen angesehene Kritiker zu Recht darauf hin, dass sich die Schatten auf engstem Raum als eckig und etwas unnatürlich herausstellten. Es wurden mehrere Lösungen vorgeschlagen. Mir gefiel der Vorschlag, den Schatten mithilfe von Strahlenwurf zu berechnen.



    Ich stelle klar, dass ich nicht mit einer Grafikkarte arbeite (ich arbeite noch nicht). Alle Ergebnisse sind der CPU nachempfunden.

    In dieser Arbeit über Reykastingom wurde die Methode zur Konstruktion eines Bildes verstanden, indem Strahlen des Betrachters vor dem Überqueren eines Hindernisses (Bildschirmgrenzen) in den Raum geworfen und der Ort ihrer Kollision hervorgehoben wurden.

    Hier verwenden wir eine vereinfachte Version von Reykasting, die auf dem Schnittpunkt des Strahlgitters basiert. Diese Methode war in den pseudo-dreidimensionalen Spielen der Vergangenheit weit verbreitet (zum BeispielWolfenstein_3D , Respekt vor denen, die in dem Thema sind), passen wir es für den zweidimensionalen Raum an.



    Der Algorithmus ist sowohl für das Verständnis als auch für die Implementierung einfach genug. Ich werde eine eigene Implementierung geben:

    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 entlang jeder Achse im gleichen Abstand kreuzt, können Sie Berechnungen speichern und nur prüfen, ob sich innerhalb der Grenzen der Kachel keine Wände befinden. Wir brauchen eine Kreuzung mit einem Hindernis und merken uns dessen Koordinaten.

    In meiner Implementierung habe ich alle Trigonometrien und Divisionen für jeden Winkel in einer separaten Tabelle durchgeführt, wodurch der Algorithmus erheblich beschleunigt wurde.

    Wenn wir die Strahlen mit dem erforderlichen Schritt in alle Richtungen richten, erhalten wir ungefähr das folgende Bild: Wenn wir



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



    Die weitere Arbeit mit Ebenen beginnt.

    Geltungsbereich. Hiernach dringen die Strahlen leicht in die Objekte ein. Diese Spielekonvention schafft eine einzigartige Umgebung, die typisch für das 2D-Spiel ist.



    Lightmap-Generierung Wir generieren statische Lichtquellen im Voraus und zwischenspeichern sie, um die Geschwindigkeit zu verbessern, und legen dynamische während der Ausgabe auf dem Bildschirm fest.



    Alles zusammen. Was fehlt, sind die gruseligen Monster und Schätze ... eine Menge Schätze.



    Die Wände mit einer variablen Krümmung des Lichteinfalls haben mich nicht betreten, aber vielleicht ist dies ein Amateur.



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



    Besonders gut hat mir der Effekt der mehrfachen Reflexion von Strahlen an den Wänden gefallen, aber selbst die naive Umsetzung hat sich so sehr verlangsamt, dass ich sie für die Zukunft belassen habe, als ich mich mit einer Grafikkarte angefreundet habe.

    Vielen Dank für Ihre Aufmerksamkeit.

    Link zum Spielen (exe für Windows)

    Teil 1 , Teil 3