Jedes Mal, wenn man ein neues Half-Life (HL von jetzt an) Spiel startet, kann man das Intro nicht überspringen. An einem bestimmten Moment ist da ein Tor auf der linke Seite; Wenn sich dieses vertikale Tor öffnet, sieht man „Licht” aus der Tür kommen – und das ist, was wir hier machen werden.
Ich denke, dass dieser Effekt für Zwischensequenzen oder für Stellen die nicht vom Spieler erreicht werden können verwendet werden sollte. Ich kann dich fragen hören "Warum?". Tja... weil alles „gefaked“ werden muss, so wie sie es in HL getan haben.
HL
verwendet ein Sprite für das Licht; wir werden ein Modell verwenden,
da es ein 3D-Objekt ist und viel besser aussieht, wenn man eine gute Textur
für das Skin verwendet. Ich habe eine flache weiße Textur verwendet,
aber ich bin kein Modeller.
Die Idee ist einfach: Wenn das Tor sich nach oben bewegt, werden wir das Lichtmodell nach rechts bewegen; Wenn das Tor sich senkt, bewegen wir das Lichtmodell nach links. Werfen wir zuerst ein Blick auf die Aktion die dem Lichtmodell zugewiesen ist:
entity* light_ptr;
action
light_model
{
light_ptr = me;
my.skill1 = my.y;
my.transparent = on;
my.passable = on;
my.alpha = 30;
}
Ich habe ein Zeiger auf das Lichtmodell erstellt; so kann ich das Lichtmodell in jeder anderen Aktion oder Funktion verwenden. Das Modell bewegt sich auf der y-Achse in meinem Testlevel; Wir können nicht sicher sein, dass das Model zu seiner Ursprungsposition zurückkehrt, wenn es mehrere Male vor und zurück bewegt wird , also speichern wir sie in skill1. Das Model ist transparent und passable. Der Transparenzfaktor ist auf 30 gesetzt.
Die
Tür erledigt den Rest der Arbeit – schauen wir uns den Code an:
action
hl_gate
{
my.skill1 = my.z;
while (light_ptr == null) {wait (1);}
while (player == null) {wait (1);}
while (1)
{
while (vec_dist (player.x, my.x) > 600) {wait (1);}
while (my.z < my.skill1 + 200)
{
my.z += 3 * time;
light_ptr.y -= 4 * time;
wait (1);
}
while (vec_dist (player.x, my.x) < 700) {wait (1);}
while (my.z > my.skill1)
{
my.z -= 5 * time;
light_ptr.y += 7.5 * time;
wait (1);
}
my.z = my.skill1; // correct the displacement
light_ptr.y = light_ptr.skill1;
wait (1);
}
}
Wir speichern die z-Koordinate für die Tür in skill1, da wir sie jedes Mal auf die richtige Position setzen müssen. Wir warten darauf, dass das Lichtmodell und das Spielermodell geladen ist und dann treten wir in eine While (1) Schleife – eine Schleife die für immer läuft.
Solange der Abstand des Spielers zum Tor mehr als 600 quants beträgt, macht das Tor gar Nichts. Wenn der Spieler näher kommt, wird sich das Tor 200 quants hinaufbewegen. Zur selben Zeit bewegt sich das Lichtmodell auf den Spieler zu, mit einer Geschwindigkeit von 4 * time; experimentiere mit 4 bis du die besten Ergebnisse hast. Das Tor hat sich geöffnet, das Lichtmodell ist erschienen, und jetzt? Solange der Spieler näher als 700 quants zum Tor steht, passiert gar nichts. Sobald der Spieler sich vom Tor fortbewegt, wird dieses gesenkt bis seine Höhe nahe der Startposition ist. Zur selben Zeit wird das Lichtmodell vom Spieler wegbewegt mit einer Geschwindigkeit von 7.5 * time.
Die letzte Zeile korrigiert die Verschiebung für das Tor und für das Lichtmodell. Wenn das Tor mehrere Male von, sagen wir 200 zu 400 bewegt wird, kann es auf 199.2 statt 200 quants runtergehen. Diese Zeilen setzen das die Modelle auf ihre Ursprungspositionen.
Dieser
Effekt sieht bei Nacht sehr gut aus! Warum kann ich ihn nicht für
alle Türen in meinem Level verwenden? Was passiert wenn der Spieler
durch die Türen läuft?
Es
würde nicht gut aussehen, wenn der Spieler durch das Lichtmodell läuft.
Die ganzen Dreiecke, die das Lichtmodell bilden, müssen 100% sichtbar
sein um gerendert zu werden. Mein Modell besteht nur aus wenigen Dreiecken,
aber wenn du diesen Effekt wirklich verwenden willst, hier einige getestete
Ideen:
-
Teile das Lichtmodell I so viele faces wie möglich: Öffne Med,
wähle triangle mode, wähle ein face - drücke "subdivide".
So wirst du viel kleinere Dreiecke bekommen;
-
Mache das Lichtmodell transparenter wenn du dich ihm näherst;
-
Verwende weißen Nebel für die Innenwände und erhöhe
camera.fog je nach Abstand des Spielers zum Modell.
Pianissimo
Pianissimo ist ein kleines stereo piano das mit der Maus gespielt werden kann; es verwendet einige richtige Sound - Beispiele von meinem Yamaha Synthesizer. Verwende es um deine Musikinstrumente einzustellen (Gitarren, etc) oder um deine Nachbarn zu beeindrucken.
Dieses Projekt ist unabhängig – schauen wir uns die main-funktion an:
function
main()
{
level_load (dummy_wmb);
wait (2);
mouse_map = mouse_pcx;
mouse_mode = 2;
while (1)
{
mouse_pos.x = pointer.x;
mouse_pos.y = pointer.y;
wait (1);
}
}
Wir laden ein Dummy-Level, Wir setzen das Bild für den Mauszeiger, wir machen den Cursor sichtbar und wir erlauben die Mausbewegung in einer Whileschleife.
Das Piano ist ein Panel mit verschiedenen Knöpfen:
panel
main_pan // main panel
{
bmap = main_pcx;
pos_x = 190; // close to the center of the screen
pos_y = 120; // on x and y
layer = 10;
button = 24, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null, null;
button = 45, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null, null;
button = 67, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null, null;
button = 89, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null, null;
button = 110, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null,
null;
button = 132, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null,
null;
button = 154, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null,
null;
button = 175, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null,
null;
button = 197, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null,
null;
button = 219, 54, keypressed_pcx, key_pcx, key_pcx, key_pressed, null,
null;
flags = refresh, d3d, visible;
}
Das Panel wird nahe der Mitte den Bildschirms platziert und hat 10 Knöpfe - die 10 Tasten auf dem Keyboard. Wenn an eine der Tasten mit der Maus anklickt, wird function key_pressed gestartet:
function
key_pressed(key_number)
{
if (key_number == 1)
{
snd_play(do_wav, 70, -100);
}
if (key_number == 2)
{
snd_play(re_wav, 70, -70);
}
...........................................
if (key_number == 10)
{
snd_play(mi2_wav, 70, 100);
}
}
Wenn
wir einen der Knöpfe auf dem Panel drücken, wird key_number auf
einen bestimmten Wert gesetzt: 1 für den ersten Knopf, 2 für
den zweiten und so weiter. So können wir eine einzige Funktion für
alle Knöpfe (alle Tasten auf dem Keyboard) verwenden. Wenn wir einen
dieser Knöpfe drücken wird eine einzige Note gespielt indem ein
simpler snd_play Befehl gestartet wird. Der Stereo Effekt wird dadurch
erreicht, dass man verschiedene Balance-Werte für die Tasten setzt,
angefangen mit -100 für die erste Taste und steigend auf 100 für
die letzte Taste.