Fog of war

Sollten Sie ein Strategie Spiel erstellen, dann ist es wahrscheinlich sinnvoll einen “Fog of War” einzubinden. Dieser Artikel wird Ihnen zeigen, wie man einen solchen Effekt erzeugt, ohne als zu viel Performance zu verschlingen. Sie können sogar das Verhältnis von Qualität und Leistung festlegen, abhängig von den Mindestanforderungen an den PC, für den Sie das Spiel entwickeln.

Wie funktioniert das? Erstellen Sie zunächst eine undurchsichtige Schicht, die die gesamte Map bedeckt. Diese wird aus kleinen Sprites erzeugt. Nur die, die sich dicht an der Spielfigur befinden, werden auf transparent geschaltet.

Sehen Sie all die kleinen rotten Quadrate? Jedes einzelne ist ein Sprite. Wenn Sie glauben, ich hätte jedes einzelne von Hand gesetzt, müssen sie mich schon für eine sehr geduldige Person halten. Aber ich bin nicht geduldig…

starter create_fog_sprites()
{
    while (player == null) {wait (1);}
    var row_index = 0;
    var column_index = 0;
    while (row_index < 32)
    {
       while (column_index < 32)
       {
          column_index += 1;
          temp.x = column_index * 128 - 2000; // -2000 to 2000 on x
          temp.y = row_index * 128 - 2000; // -2000 to 2000 on y
          temp.z = -1000;
          ent_create (fogsprite_tga, temp.x, manage_fog);
       }
       column_index = 0;
       row_index += 1;
    }
}

Der Code wartet zunächst, bis der Player erstellt wurde. Danach werden die Sprites in den beiden verschachtelten „while“ Schleifen auf dem Boden platziert. Der Beispiellevel hat eine Größe von 4000x4000 Quants. Für den Fog wird ein Sprite von 128x128 Pixel verwendet. Daraus ergibt sich, das 32 (4000/128 = 31.25, gerundet auf 32) Spalten und Zeilen mit dem Sprite zu füllen sind. Die zwei Variablen werden jeweils von 0 bis 31, was 32 Schritte ergibt, hochgezählt, und temp.x und temp.y werden auf die Position gesetzt, die sich aus dem Produkt der Variablen mit der Höhe bzw. Breite des Sprites ergibt (in diesem Beispiel sind Höhe und Breite gleich). Temp.z = -1000 platziert das Fog Sprite über den Kopf der Spielfigur (sie dürfen mit diesem Wert ruhig rumspielen). Die nächste Zeile erzeugt das Fog Sprite an der Position temp und weist dem die Action "manage_fog" zu:

function manage_fog()
{
    my.tilt = 90;
    my.alpha = 100;
    my.oriented = on;
    my.transparent = on;
    my.passable = on;
    while (1)
    {
       if (vec_dist(player.x, my.x) < 350)
       {
          my.alpha = 0;
       }
       else
       {
         my.alpha = 100;
       }
       wait (1);
    }
}

Die obige Action legt die Ausrichtung des Sprites fest, macht es passable und setzt den Alphawert abhängig von der Entfernung vom Sprite zur Spielfigur. Probieren Sie ruhig verschiedene Werte, und vergessen Sie nicht, das der Nebel Effekt umso realistischer wirkt, je kleiner die Sprites sind.



Rolltreppe

Benötigen Sie eine Rolltreppe um Ihren Spieler zu bewegen. Dann ist dieses Code-Schnipsel genau das, was Sie brauchen.

Sie brauchen nur diese einfache Action ihrer wmb Rolltreppe zu.

var escalator_speed = 2;

action escalator
{
   while (1)
   {
      my.v += escalator_speed * time;
      wait (1);
   }
}

Die Action ändert einfach nur den “v” Parameter der hölzernen Textur, die der Rolltreppen Entity zugewiesen wurde. Auf diesen Weise wird der Eindruck erweckt, dass sich die Rolltreppe bewegt. Sie können natürlich eine andere (und schönere) Textur verwenden, aber diese „woodflhri“ Textur ist in der Standard.wad vorhanden.

starter trace_below()
{
    var trace_pos;
    while (player == null) {wait (1);}
    while (1)
    {
       vec_set(trace_pos.x, player.x);
       trace_pos.z -= 1000;
       trace_mode = ignore_me + ignore_passable + ignore_models + ignore_sprites + scan_texture;
       trace (player.x, trace_pos.x);
       if (str_cmpi ("woodflhori", tex_name))
       {
          player.y += escalator_speed * time;
          player.z += 0.5 * time; // experimental value
       }
       wait (1);
    }
}

Die obige Funktion wartet bis die Spielfigur erstellt wurde und traced alle 1000 Quants von der Spielfigur nach unten. Trift der Trace Strahl auf die Textur mit dem Namen „woodflhori“, wird der x und der z Wert der Spielfigur erhöht. Bitte beachten Sie, das der Y Wert zusammen mit dem „v“ Parameter der Textur erhöht wird, um die Spielfigur und die Rolltreppe synchron zu halten. Unter Umständen müssen Sie negative Werte für y einsetzten oder die y und die x Achse vertauschen, je nachdem, wie die Rolltreppe ausgerichtet ist. Betrachten Sie das folgende Bild, um zu sehen, was hier gemeint ist.

Die Höhe der Spielfigur (z) wird ebenfalls erhöht. Damit läßt sich die Spielfigur leichter nach oben bewegen. Der Gravitationscode erledigt den Rest, indem die Spielfigur immer nahe an den Boden gezogen wird. Probieren Sie kleine Werte, bis sie mit dem Ergebnis zufrieden sind. Natürlich können sich auch an der escalator_speed variable schrauben.