Star Wars text

Wenn Sie, wie ich, ein alter Star Wars Fan sind, waren Sie sicher von dem Text beeindruckt, der am Anfang jeder Episode in der Ferne verschwand. Ich finde diese Idee immer noch so gut, dass ich ein wenig Code geschrieben habe, den Sie für Ihre Intros verwenden können.

Wir verwenden eine “Entitiy” für den Text, der vor uns in die Ferne gleitet. Diese “Entity” benutzt eine Bitmap mit Namen intro.pcx:

entity text_on_screen
{
type = <intro.pcx>;
layer = 1;
alpha = 100;
flags = transparent, visible;
view = camera;
x = 300;
y = 10;
z = -350;
tilt = 60;
}

Die Entity wird auf layer 1 gesetzt, ist transparent und sichtbar. Der Alpha Wert wird auf 100 gesetzt, so dass die Entity leicht milchig wirkt. Außerdem wird sie auf der Kamera erscheinen, unserem eigentlichen “Auge” in der 3D Welt. Wir setzen sie 300 Quants vor die Kamera, 10 Quants nach links und 350 Quants unterhalb des Ursprungs, um sie am Anfang verborgen zu halten. Und schließlich neigen wir den Text, indem wir den Tilt Winkel auf 60 Grad setzen.

Es ist zwar nur sehr wenig Code, aber ich habe ein eigenes Projekt daraus gemacht; auf diese Weise können Sie den Code zu einem Ihrer Projekte hinzufügen und es wird sofort funktionieren. Sehen wir uns die Main Funktion an:

function main()
{
fps_max = 50; // limit the frame rate to 50 fps
level_load (dummy_wmb);
media_loop ("music.wav", null, 100);
while (text_on_screen.x < 2000)
{
text_on_screen.x += 2 * time; // move the text in front of the camera
text_on_screen.z += 0.7 * time; // and a little upwards
if ((text_on_screen.x > 1000) && (text_on_screen.alpha > 5))
{
text_on_screen.alpha -= 0.2 * time;
}
wait (1);
}
}

Ich limitiere die Framerate auf 50 fps, lade ein Dummy Level (ein schwarzer, ausgehöhlter Würfel mit einigen Sternen an der Wand) und spiele die Musik in einer Schleife. Ich habe lange an der Musik gearbeitet, hören Sie also gut zu!

Der Text wird scrollen, bis seine x Position von 300 auf 2000 angewachsen ist. Innerhalb der Schleife erhöhe ich zugleich x und z Wert. Wenn der Text mehr als 1000 Quants in x –Richtung entfernt ist, mache ich ihn immer transparenter, ehe er komplett verblaßt ist (alpha < 5).

Das war es auch schon!

Vertex - basierende Effekte

Dieser Special Effect sieht so cool aus! Sie können Ihn für Teleports, seltsam aussehende Monster, etc. verwenden. Die Idee ist ganz einfach: jeder Vertex eines Models wird zum Partikelgenerator.

Die Action, die dem Model zugeordnet ist, muß eine Funktion aufrufen, die den Code initialisiert. Ich habe den Vertex Effekt für das Model benutzt, welches die patrol_path Action in der Office Demo hat und hier ist die relevante Änderung in patrol_path:

action patrol_path
{
actor_init();
init_vertex(); // new line
// attach next path
temp.pan = 360;
temp.tilt = 180;
temp.z = 1000;
result = scan_path(my.x,temp);
if (result == 0) { my._MOVEMODE = 0; } // no path found
...................
}

Wie Sie sehen ist die einzige Änderung im Code die rote Zeile, die init_vertex() aufruft. Ich habe die geänderte actors.wdl Datei beigefügt, stellen Sie aber sicher, dass Sie Ihre eigene actors.wdl Datei sichern, bevor sie mit meiner überschrieben wird. Wenn dieser Artikel herauskommt, dürften die neuen Templates da sein und Sie könnten durch das Überschreiben Funktionen verlieren.

Schreiben Sie einfach die rote Zeile in jede Ihrer Actions, die zu einem Model gehört, wenn Sie den Effekt wollen und alles sollte funktionieren. Schauen wir uns die Funktion init_vertex einmal an:

function init_vertex()
{
var vertices; // local var
my.invisible = on;
while (1)
{
vertices = ent_vertices (my);
while (vertices > 0)
{
vec_for_vertex (temp, my, vertices);
effect (attach_flares, 1, temp, normal);
vertices -= 1; /
}
wait (1);
}
}

Wir definieren eine lokale Variable namens “vertices” und verstecken das Model. Natürlich könnten Sie das Model auch sichtbar lassen, aber ich finde den Effekt gelungener, wenn man es nicht sieht. Wir lesen die Anzahl der Vertizes des Models und holen uns dann jede Koordinate in einer While Schleife ohne wait(1), weil diese Schleife die Koordinaten so schnell wie möglich updaten muß. In derselben Schleife erstellen wir einen flare Effekt und gehen zum nächsten Vertex (wir zählen abwärts).

Die Funktion attach_flares ist eine Standard Partikelfunktion:

function attach_flares()
{
my.bmap = flare_pcx;
my.flare = on;
my.bright = on;
my.size = 10;
my.function = remove_flares;
}

function remove_flares()
{
my.lifespan = 0; // remove the flare particle
}

Die Partikel verwenden flare_pcx als Bilddatei mit den flare und bright Flags gesetzt; die Größe ist 10. Die Funktion, welche die Partikel bewegt (remove_flares) entfernt sie sofort; nun gut, Sie haben mich erwischt, die Partikel leben immerhin 1 Frame. Sie können eine größere Zahl für lifespan verwenden, wenn Sie Motion Trail Effekte möchten, aber falls Sie das tun, behalten Sie den Partikelzähler auf dem Debugpanel im Auge.