Waffen - Teil 4

Top  Previous  Next

In diesem Monat geht es um Code für Nahkampfwaffen. In meinem Beispiel ist es ein Schwert, aber der gleiche Code kann auch für Messer oder sogar für waffenlosen Kampf (Schläge und Tritte in einem Prügelspiel, etc.) verwendet werden. Um zu beginnen, laden Sie work36.wmp und starten Sie das Level mit dem work36.wdl Skript; Sie sehen das folgende Bild.

 

aum61_workshop1

 

Gehen Sie ruhig näher heran; diese Monster sind Dummy Gegner, sie können unserem Ninja nichts anhaben. Gehen Sie auf sie zu (WASD) und benutzen Sie Ihr Schwert mit der linken Maustaste. Schauen wir uns das Skript an.

 

aum61_workshop2

 

Noch nichts Besonderes. Beachten Sie, dass ich die Gesundheit in skill99 sichere.

 

aum61_workshop3

 

Dies ist der gesamte Code für den Spieler und die Kamera. Wir beginnen mit der Definition einiger lokaler Variablen, in denen die zurückgelegte Distanz, die Animationsphasen und die Koordinaten der Schwertspitze und des Schwertgriffes gespeichert werden.

 

Die ersten Codezeilen der “while”-Schleife plazieren die Kamera 230 Quants hinter dem Spieler und 150 Quants darüber. Die Kamera hat denselben Pan wie der Spieler und zeigt ihn von oben, weil der Tilt auf 20 gesetzt ist. Wir haben die vec_rotate Anweisung schon einige Male in den Workshops benutzt (z.B. in AUM 54), das ist also nichts Neues mehr für Sie.

 

Die folgenden Codezeilen erlauben dem Spieler die Bewegung mit Hilfe der WASD-Tasten und der Maus. Falls sich der Spieler mit “W” oder “S” bewegt, zeigt das Model die “walk” Animation, die mit einer Geschwindigkeit von 3 * time_step abgespielt wird. Sind diese Tasten nicht gedrückt, kommt die “stand” Animation zum Einsatz, die eine Geschwindigkeit von 2 * time_step hat.

 

Schauen wir uns nun den kurzen, aber effektiven Schwertcode genauer an.

 

if (mouse_left == 1) // if we press the left mouse button

{

       attack_percentage = 0; // reset the "attack" animation frames

       while (attack_percentage < 100)

       {

               vec_for_vertex (sword_tip, my, 315); // sword tip vertex - get the value in Med

               vec_for_vertex (sword_base, my, 293); // sword base vertex - get the value in Med        

               if (c_trace (sword_base, sword_tip, ignore_me | ignore_passable) > 0) // the player has hit something?

               {

                       ent_playsound (my, sword_wav, 50); // sword sound

                       if (you != null)

                       {

                               you.healthpoints -= 10 * time_step; // if the player has hit an entity, decrease its health

                       }

               }

               ent_animate(my, "attack_sword_up", attack_percentage, null);

               attack_percentage += 6 * time_step;

               wait (1);

       }

}

 

Wenn der Spieler die linke Maustaste drückt, setzen wir “attack_percentage” auf 0 zurück und lassen die Schleife dann laufen, bis diese Variable die 100 erreicht hat (also bis die gesamte “attack_sword_up” Animation gezeigt wurde).

 

Der Code in der Schleife bestimmt in jedem Frame die Koordinaten der Schwertspitze und des Schwertgriffes. Schauen wir uns das Ninjamodel im MED an.

 

aum61_workshop4

 

Sie erkennen die Positionen der entsprechenden Vertizes und die imaginäre, rot gestrichelte Linie, entlang der mit c_trace nach Entities gesucht wird. Wir tracen vom Griff zur Spitze und ignorieren dabei passierbare Entities und auch die “me” Entity, also das Ninjamodel und das Schwert. Wenn etwas getroffen wird, ertönt “sword.wav”; darüber hinaus werden, falls “you” nicht “null” ist (wenn also eine Entity getroffen wurde und kein Level Block) die Lebenspunkte der getroffenen Entity um 10 * time_step verringert. Die letzten Codezeilen animieren den Spieler mit der “attack_sword_up” Animation in einer Geschwindigkeit von 6 * time_step.

 

Mehr müssen Sie nicht wissen, um Nahkampfwaffen zu programmieren! Wenn Sie ein Karatespiel schreiben, würden Sie den c_trace vom Ellbogen des Spielers bis zu den Fingerspitzen laufen lassen, wodurch seine Schläge dem Gegner Schmerzen bereiten. Dazu müssen Sie nur die Vertizes des Schwertes durch die für Ellbogen und Finger ersetzen.

 

Kurz vor Schluss zeige ich Ihnen noch den Code für die Dummy Gegner.

 

aum61_workshop5

 

Wir legen die Anfangsgesundheit auf 50 fest und starten dann eine Schleife, die dafür sorgt, dass die Gegner den Spieler ansehen (mit vec_to_angle) bis sie sterben. Wenn dies geschieht, werden ihre Leichen passierbar gemacht, ein Geräusch ertönt (dead.wav) und wir lassen sie einmal ihre “death” Animation durchlaufen. Sobald sie zu Boden gefallen sind, machen wir die Gegner transparent, setzen ihren Alphawert auf 100 und verringern diesen dann, wodurch sie immer transparenter werden. Schließlich entfernen wir sie aus dem Level, wenn sie ganz unsichtbar sind.

 

Dieser Abschnitt beendet die Workshopserie über Waffen. Ich hätte noch über andere Arten von Waffen schreiben können, aber ich denke, dass Sie nun genug Informationen haben, Ihre eigenen zu erstellen. Zeit, sich etwas anderem zu widmen. Wir sehen uns nächsten Monat im nächsten aufregenden Workshop!