Animiertes HUD

Erinnerst Sie sich noch an die guten alten Spiele, in denen der Spieler ein kleines Bild als HUD-Element hatte? Dieses Bild zeigte ein rampuniertes Spielergesicht, wenn sich die Gesundheit Null näherte, und ein glückliches, gesundes Gesicht, wenn die Gesundheit Richtung 100 anwuchs. Dass ist genau, was dieses Stückchen Code macht. 

panel player_panel // displays player's health
{
     pos_x = 0;
     pos_y = 0;
     digits = 160, 70, 3, health_font, 1, player._health;
     flags = d3d, refresh, visible;
}

panel health1_panel // displays the 1st picture
{
     bmap = health1_pcx;
     pos_x = 0;
     pos_y = 0;
     flags = d3d, refresh;
}

panel health2_panel // displays the 2nd picture
{
     bmap = health2_pcx;
     pos_x = 0;
     pos_y = 0;
     flags = d3d, refresh;
}

panel health3_panel // displays the 3rd picture
{
     bmap = health3_pcx;
     pos_x = 0;
     pos_y = 0;
     flags = d3d, refresh;
}

panel health4_panel // displays the 4th picture
{
     bmap = health4_pcx;
     pos_x = 0;
     pos_y = 0;
     flags = d3d, refresh;
}

panel health5_panel // displays the 5th picture
{
     bmap = health5_pcx;
     pos_x = 0;
     pos_y = 0;
     flags = d3d, refresh;
}

Wie Sie sehen, benutze ich ein einfaches Panel, ohne jeglicher bmap, um die Gesundheit des Spielers anzuzeigen; Man braucht ein Panel, da ein "Digit" verwendet wird, um die Gesundheit darzustellen. Die anderen 5 Panels sind nichts anderes als Bilder, die auf dem Panel dargestellt werden.

Vielleicht ist es jetzt ein guter Zeitpunkt, um Ihnen zu sagen, dass, wenn Sie die Templates verwenden, die Spieler-Gesundheit in player._health gespeichert ist - das ist, was das "Digit" anzeigt. Ich brauchte etwas, um die Gesundheit des Spielers zu verringern, also machte ich diese Action:

action player_killer
{
     while (player == null) {wait (1);}
     while (1)
     {
          if (vec_dist(my.x, player.x) < 50 && player._health > 0)
          {
               player._health -= 0.5 * time;
          }

          if (player._health > 80)
          {
               health1_panel.visible = on;
          }
          else
          {
               if (player._health > 60)
               {
                    health2_panel.visible = on;
               }
               else
               {
                    if (player._health > 40)
                    {
                         health3_panel.visible = on;
                    }
                    else
                    {
                         if (player._health > 20)
                         {
                              health4_panel.visible = on;
                         }
                         else
                         {
                              health5_panel.visible = on;
                         }
                    }
               }
          }
          wait (1);
     }
}

Diese Action wird dem guard.mdl Model gegeben, welches in meinem Beispiel-Level nahe beim Spieler platziert wird. Natürlich können Sie diesen Code auch als Laser-Schranke etc. benutzen. Wir können nicht sagen, ob die Action player_killer läuft, bevor die Action player_walk_fight dem Spieler zugeordnet wird. Wenn player_killer zuerst läuft, wird der Spieler nicht erstellt, also macht player._health in der 3. Zeile keinen Sinn. Die erste Zeile in der Action behebt das Problem; player_killer wird erst starten, nachdem der Spieler erstellt wurde.

Wenn der Spieler näher als 50 Quants kommt und er noch am Leben ist, wird seine Gesundheit mit im Abstand von 0.5 * time verringert. Hier ist, was passiert:
- if player._health > 80 we display the health1 panel;
- if player._health = 60...80 we display health2;
- if player._health = 40...60 we display health3;
- if player._health = 20...40 we display health4;
- if player._health = 0...20 we display health5;

Die Action ist ein bißchen schwieriger; laden Sie sich AUM12.zip runter, und Sie werden sehen, dass wir die panels unsichtbar machen müssen, welche nicht auf dem Bildschirm erscheinen sollen. Der Code in diesen Artiklen ist nur für Lernzwecke geeignet; die voll funktionsfähigen Versionen sind in Aumxx.zip gepackt.
 

 
Time demo

Die neue time_factor-Variable hat es uns um einiges leichter gemacht, die Geschwindigkeit in unseren Spiele zu kontrollieren. Möchten Sie auch alle diese zeitabhängigen Spezialeffekte wie in Max Payne erstellen? Dann aufgepasst!

Zuert einmal müssen wir ein Panel mit einem Slider, der die Spielgeschwindigkeit einstellen kann. Sehen Sie, wie einfach das geht?

panel speed_factor
{
     bmap = slider_pcx;
     layer = 20;
     pos_x = 10;
     pos_y = 25;
     hslider = 10, -12, 200, cursor_pcx, 0, 10, time_factor;
     flags = d3d, overlay, refresh, visible;
}

Time_factor wird seinen Wert zwischen 0 und 10 verändern, wenn Sie den Slider bewegst. Ich habe eine Waffe im Level platziert; schauen Sie sich die Geschwindigkeit der Raketen mit time_factor = 0 und time_factor = 10 an.

Aber wie kriegen wir solche Geschwindigkeitsvariations-Effekte? Ich stelle hier mal zwei Beispiele:

function init_timedemo()
{
     while (1)
     {
          if (key_q == 1)
          {
               while (key_q == 1) {wait (1);} // wait for the key release
               time_factor = 1; // reset it
               while (time_factor > 0.01)
               {
                    time_factor -= 0.05 * time;
                    wait (1);
               }
          }
          if (key_a == 1)
         {
             while (key_a == 1) {wait (1);} // wait for the key release
             time_factor = 1; // reset it
             while (time_factor < 10)
             {
                    time_factor += 0.2 * time;
                    wait (1);
              }
         }
        wait (1);
    }
}

Wenn wir "Q" drücken, wird der Wert von time_factor von 1 bis 0.01 verringert; Sie sehen, wie die Actions immer langsamer laufen. Wenn Sie "A" drücken, wird time_factor ziemlich schnell auf 10 anwachsen und alle Actions im Level werden schneller laufen, als Sie sie jemals zuvor gesehen haben.