Scharfschützengewehr

Dieser Abschnitt wird Ihnen helfen einen einfachen Scharfschützen-Effekt, der mit jeder anderen Waffe benutzt werden kann, zu erstellen.

Die Haupidee, die hinter diesem Stück Code steckt, ist „camera.arc” zu verringern um nahe heranzuzoomen, sobald wir „S” drücken (=der Anfangsbuchstabe von „sniper” bzw Scharfschütze). Als erstes definieren wir 3 panels:

panel sniper640_pan
{
    bmap = sniper640_map;
    layer = 20;
    pos_x = 0;
    pos_y = 0;
    flags = overlay, refresh, d3d;
}

panel sniper800_pan
{
    bmap = sniper800_map;
    layer = 20;
    pos_x = 0;
    pos_y = 0;
    flags = overlay, refresh, d3d;
}

panel sniper1024_pan
{
    bmap = sniper1024_map;
    layer = 20;
    pos_x = 0;
    pos_y = 0;
    flags = overlay, refresh, d3d;
}

Ich brauche 3 panels, da ich in der Lage sein will, diesen Scharfschützen-Effekt bei allen Auflösungen (640x480, 800x600, 1024x768) zu benutzen. Wenn sie weitere Auflösungen in Ihrem Spiel benutzen wollen, müssen sie mehrere panels wie diese hinzufügen. Die folgende Funktion muss in der main-Funktion aufgerufen werden:

function init_sniper()
{
    on_mouse_right = null;
    while (1)
    {
        if (key_s == 1)
        {
            if (video_mode == 6)
            {
                sniper640_pan.visible = on;
            }
            if (video_mode == 7)
            {
                sniper800_pan.visible = on;
            }
            if (video_mode == 8)
            {
                sniper1024_pan.visible = on;
            }
            while (camera.arc > 10)
            {
                camera.arc -= 5 * time; // speed
                wait (1);
            }
       }
      else
      {
            camera.arc = 60;
            sniper640_pan.visible = off;
            sniper800_pan.visible = off;
            sniper1024_pan.visible = off;
       }
      wait (1);
   }
}

On_mouse_right = null; stellt sicher, dass die default mouse-pointer Aktion” deaktiviert ist. Die "while"-Schleife kontrolliert, ob wir "S" drücken. Sobald dies der Fall ist, wird der passende panel angezeigt, abhängig von der Auflösung (video_mode = 6 bedeutet 640x480, video_mode = 7 bedeutet 800x600 usw.). Die Kamera zoomt (camera.arc verringert sich) mit der Geschwindigkeit, die von „5 * time” bestimmt wird; verändern sie diesen Wert, um verschiedene Zoomgeschwindigkeiten zu erreichen. Sobald der Spieler die „S” Taste loslässt, gehen wir zum  "else"-Abschnitt: camera.arc wird auf den Standardwert = 60 gesetzt und die panels werden unsichtbar gemacht. Ich weiss, dass nur einer dieser panels sichtbar ist, abhängig von der Auflösung, aber es wird niemandem schaden, wenn wir alle auf einmal unsichtbar machen.

Bitte beachten sie, dass die panels nur im Zentrum transparent (RGB = 000) sind.
 

Zeitbombe

Kennen Sie das kleine Haus in der office.wmp? Was, wenn an einer der Wände eine Zeitbombe hängt, die gespannt darauf wartet, mit dem Mauszeiger angeklickt zu werden? Begierigt darauf, alles im Umfeld zu zerstören? Was? Sie haben mein office.wmp level schon geladen und die Bombe schon getestet? Das ist Betrug!

Die Aktion, die dem timer.mdl zugewiesen ist, ist recht einfach:

action timer
{
     my.skin = 2;
     my._DAMAGE = 200; // set different damage values for different timers
     my.enable_click = on;
     my.event = start_timer;
}

Sie sehen, dass ich ein Modell mit 2 Skins verwende; der Schaden ist auf 200 gesetzt (Ich werde Einiges aus den Template verwenden). Der Zünder reagiert auf das Klicken; sobald dies geschieht, wird seine start_timer Funktion ausgeführt:

function start_timer()
{
     wait (1);
     second_counter = 10; // explodes after 10 seconds
     while (my != null)
     {
          second_counter -= 1;
          my.skin = 2;
          ent_playsound (my, timer_snd, 300);
          waitt (14);
          my.skin = 1;
          waitt (2);
          if (second_counter < 1)
          {
               range = my._DAMAGE * 2;
               damage = my._DAMAGE;
               temp.pan = 360;
               temp.tilt = 180;
               temp.z = range;
               indicator = _EXPLODE; // not a friendly scan
               scan_entity (my.x, temp);
               morph (explo_sprite, me);
               my.oriented = on;
               my.pan = 0;
               while (my.frame < 7)
               {
                    my.frame += 3 * time;
                    wait (1);
               }
               actor_explode(); // remove the explosion sprite
          }
     }
}

Second_counter beinhaltet die Anzahl der Sekunden bis zum Start der Explosion. In meinem Beispiel sind es 10 Sekunden. Solange der Zünder nicht explodiert ist (my != null), wird er einen Sound abspielen und jede Sekunde (waitt (14) + waitt (2) = waitt (16) = 1 second) zwischen seinen skins (1 and 2) wechseln. Sobald der second_counter sich auf 0 verringert hat, wird der Zünder explodieren und sich in ein ”oriented” Sprite verändern , da der Spieler eine tolle Explosion sehen soll. Das Sprite für die Explosion wechselt durch seine animations-frames, dann wird es entfernt.

Sie können diesen Zünder-Code verbessern, indem sie dem Spieler erlauben die Anzahl der Sekunden auf einem panel auszuwählen, Zeitbomben wie diese als Munition für Schusswaffen zu erstellen usw.