Ich sah diese Kameras das erste mal in Duke Nukem im Jahr 1997 – finden Sie die wahre Kameras in diesem Artikel!
Ich will “reale” Überwachungskameras haben, daher wechsle ich zwischen der Standardview (camera) und meiner neuen View, surv_camera.
Die Funktion init_surveillance() wird in main aufgerufen. Sie erstellt eine View mit der selben Größe und Position wie die originale Camera View.
view surv_camera {}
function init_surveillance()
{
surv_camera.size_x = screen_size.x;
surv_camera.size_y = screen_size.y;
surv_camera.pos_x = 0;
surv_camera.pos_y = 0;
}
Jede Überwachungskamera (fish.mdl) hat folgende Aktion angehängt:
action surveillance_camera
{
if (my.skill1 + my.skill2 + my.skill3 + my.skill4 + my.skill5 + my.skill6
== 0) {beep; beep; return;}
while (1)
{
my.skill10 = abs(ang(player.pan) - ang(my.pan));
if ((vec_dist(player.x, my.x) < 100) && (my.skill10 > 150) &&
(my.skill10 < 210))
{
camera.visible = off;
surv_camera.x = my.skill1;
surv_camera.y = my.skill2;
surv_camera.z = my.skill3;
surv_camera.pan = my.skill4;
surv_camera.tilt = my.skill5;
surv_camera.roll = my.skill6;
surv_camera.visible = on;
my.skill11 = 0;
}
else
{
if (my.skill11 == 0)
{
surv_camera.visible = off;
camera.visible = on;
my.skill11 += 1;
}
}
wait (1);
}
}
Falls wir vergessen,
mindestens einen dieser Skill1 ... Skill6 Werte auszufüllen, ertönen
zwei Pieptöne und das Kamera Model wird entfernt. Wir speichern den
Entfernungswinkel zwischen fish.mdl (Auslöser der Kamera) und dem
Spieler in Skill10. Falls der Spieler sich auch 100 Quants nähert
und der in Skill10 gespeicherte Winkel ist zwischen 150 und 210 Grad, blickt
der Spieler auf die Kamera und die entsprechende Überwachungskamera
wird eingeschaltet.
Sobald eine der Überwachungskameras eingeschalten wird, wird camera ausgeblendet und surv_camera sichtbar gemacht. Die Koordinaten für surv_camera werden aus Skill1...6 (x, y, z, pan, tilt, roll) gelesen, daher sollten Sie diese Werte in WED eintragen. Um die Überwachungskamera zu deaktivieren, drehen sie Einfach den Spieler oder bewegen Sie sich rückwärts.
Falls Sie dieses
Kameraskript verbessern wollen, können Sie ein Panel hinzufügen,
das wie ein Fernsehrahmen aussieht, wenn Sie sich im Überwachungsmodus
befinden, ein paar Töne abspielen, usw.
Pfeil und Bogen
Diesmal
werde ich Sie durch alle Schritte führen, die benötigt werden,
um einen Code für Pfeil und Bogen zu erstellen. Beachten Sie bitte,
dass dieses Skript benutzt werden kann, um (fast) jede Waffe und ihre Geschosse
zu erstellen.
Als erstes definieren wir ein Entity, das uns als Bogen dienen soll:
entity bow_entity
{
type = <bow.mdl>;
layer = 10;
view = camera;
x = 30;
y = 8;
z = -10;
}
Der Bogen dreht sich, solange er nicht aufgehoben wurde. Sobald der Spieler den Bogen berührt, wird dieser entfernt und bow_entity wird eingeblendet. Bow_entity.frame = 2 wird die zweite Animationsphase, die Pfeil und Bogen enthält, zeigen.
action bow
{
my.enable_impact = me;
my.event = get_bow;
while (my != null) // or while (my)
{
my.pan += 3 * time;
wait (1);
}
}
function get_bow()
{
wait (1);
ent_remove (me);
bow_entity.frame = 2;
bow_entity.visible = on;
}
Wir rufen die Funktion init_bowarrow() in main auf:
function init_bowarrow()
{
while (1)
{
if ((mouse_left == 1 || key_ctrl == 1) && bow_entity.frame <
7)
{
bow_entity.frame += 2 * time;
}
else
{
if (bow_entity.frame >= 7 && arrow_fired == 0)
{
while (mouse_left == 1 || key_ctrl == 1) {wait (1);}
vec_set (temp, player.pos);
temp.z += 20;
ent_create (arrow_mdl, temp, move_arrow);
arrow_fired = 1; // a single arrow
}
else // the player isn't shooting
{
arrow_fired = 0; // enable firing
bow_entity.frame = 2;
}
}
wait (1);
}
}
Sobald wir die linke Maustaste oder STRG drücken, animieren wir bow_entity durch verändern des frame-Parameters. Sobald bow_entity.frame >= 7, warten wir, bis die Linke Maustaste oder STRG losgelassen wird (damit unterbinden wir Dauerfeuer) und erstellen dann einen Pfeil 20 Quants über dem Mittelpunkt des Spielers. Ich habe diesen Wert gewählt, weil er bei meiner Spieler- und Pfeil- Kombination real aussah. Sie werden andere Werte probieren müssen, falls Sie andere Modelle benutzen. Wenn der Spieler nicht mehr schießt, aktivieren wir den Schießmodus und setzen bow_entity.frame wieder auf 2.
Dem Pfeil wurde folgende Funktion zugewiesen:
function move_arrow()
{
wait (1);
my.enable_entity = on;
my.enable_block = on;
my.event = hurt_you;
my.passable = on;
my.pan = camera.pan;
my.tilt = camera.tilt;
my.skill12 = 50; // skill12, 13, 14 act like a var
my.skill13 = 0;
my.skill14 = 0;
my.skill12 *= time;
while (my.skill12 != 0) // moves until it hits something
{
if (vec_dist (my.x, player.x) < 100) {my.passable = on;}
// don't collide with the player
else {my.passable = off;}
ent_move (my.skill12, nullvector);
wait (1);
}
}
Der Pfeil reagiert auf Entities und Levelblöcke, falls er einen Block trifft, wird er in ihm stecken bleiben, falls er auf ein Entity trifft, wird er verschwinden. Ich benutze Skill12, 13 und 14 als wären sie eine Variable namens Skill12. Stellen Sie sicher, dass der erste Skill durch 3 teilbar ist (beginnen Sie mit Skill3, 6, 9, 12, 15, usw.). Solange der Abstand zwischen dem Spieler und dem Pfeil weniger als 100 Quants beträgt, ist der Pfeil passabel, um eine Kollision mit dem Erzeuger auszuschließen.
Dies ist die letzte Funktion:
function hurt_you()
{
wait (1);
if (event_type == event_entity)
{
my.skill12 = 0; // stop moving
you._HEALTH -= 80; // damage = 80;
ent_remove (me);
}
if (event_type == event_block)
{
my.skill12 = 0; // stop the arrow
my.passable = on; // it shouldn't stand in our way
}
}
Falls der Pfeil eine Entity trifft, wird er 80 Schadenspunkte verursachen. Wenn das Entity ein Baum Sprite ist, wird dies nichts ausmachen, aber falls es sich um einen Gegner handelt (in meinem Beispiel robot2), werden Sie ihn nach dem ersten Treffer weglaufen sehen.
Ich habe das gleiche Modell für bow_entity und den Bogen, der im WED plaziert wird, verwendet, obwohl es die ganze Zeit einen Pfeil und eine Hand angefügt hat. Sie wollen die Hand und den Pfeil beim Aufsammeln natürlich nicht sehen, aber die Modelle benötigen in jeder Animationsphase die gleiche Anzahl an Polygone. Daher habe ich mich entschlossen, die Hand und den Pfeil im Bogen zu verstecken (viel kleiner natürlich, aber sie sind da). Ich benutze die erste Animationsphase von bow.mdl, bevor der Bogen aufgehoben wird und die Phasen 2...7 für den animierten Bogen mit Pfeil und Hand.
“Was ist mit diesen Schreien, über die Sie gesprochen haben?”
Nun, ich habe
nur Spass gemacht, aber Sie können diese mit einer einfachen ent_playsound
Anweisung, welche in das Templateskript von robot2 eingefügt wird,
hinzufügen.