Timer

Wenn Sie ein ein Rennspiel erstellen wollen, brauchen Sie mit Sicherheit einen guten Timer. Die Funktion start_counter() startet, sobald Sie das Level aufrufen; sehen wir uns den Code an:

string temp_str;
string counter_str;

function start_counter()
{
str_cpy (counter_str, "0.000"); // show this string at start
while (1)
{
if (start == 1)
{
current_ticks = total_ticks - temp_ticks;
seconds = (current_ticks / 16) % 1000;
miliseconds = (current_ticks * 1000 / 16) % 1000;
str_for_num (temp_str, seconds);
str_cpy (counter_str, temp_str);
str_cat (counter_str, ".");
str_for_num (temp_str, miliseconds);
str_trunc (counter_str, 1);
}
else
{
temp_ticks = total_ticks;
}
wait (1);
}
}

function toggle_counter()
{
start = (start == 0);
}

on_s = toggle_counter;

Als erstes kopieren wir "0.000" in den String, der benutzt wird, um die Zeit anzuzeigen; es ist immer gut, so etwas anzuzeigen, bevor das Rennen losgeht. Die Variable Start wollte vom Spiel auf 1 gesetzt werden, sobald das Rennen beginnt, aber ich habe eine kleine Funktion (toggle_counter) geschrieben, die Start von 0 auf 1 bzw. zurücksetzt, wenn die "S"-Taste gedrückt wird.

Wir werden current_ticks verwenden, um die Anzahl der Frames (Ticks) zu speichern, die vom Moment des Startens verstrichen sind. Ich werde einige Zahlenbeispiele bringen, um das Verständnis zu erleichtern.

Sagen wir, das Spiel startete vor 10 Sekunden bei einer Framerate von 60 fps. Das bedeutet, total_ticks ist 10 Sekunden * 60 fps = 600, denn total_ticks zählt die Frames, die seit dem Spielstart verstrichen sind. Temp_ticks ist am Anfang 0, also ist current_ticks 600. Wir berechnen die Anzahl der Sekunden und Millisekunden, konvertieren sie in Strings und speichern sie in counter_str im Format: Sekunden.Millisekunden. Wenn wir erneut "S" drücken, dann ist start = 0 und der else Teil läuft ab. Zu diesem Zeitpunkt ist total_ticks = 600, also setzen wir temp_ticks auch auf 600.

Total_ticks zählt immer weider, selbst wenn wir das Spiel pausieren, laden speichern etc. - wir können es nicht anhalten! Wenn "S" erneut gedrückt wird, um den Timer zu starten, dann ist current_ticks = total_ticks - temp_ticks = 0, denn der "else" Teil kopiert total_ticks in temp_ticks wenn der Timer stoppt. Auf diese Weise startet die Uhr jedesmal bei 0, wenn wir sie resetten.

Mit einer einfachen Text-Definition wird die Zeit auf dem Bildschirm angezeigt:

text counter_pan
{
layer = 20;
pos_x = 0;
pos_y = 0;
font = speed_font;
string = counter_str;
flags = visible;
}

Vertikale Spiegel

Wenn Sie die professionelle A5 Version besitzen, dann kennen Sie den horizontalen Spiegel im Boden des Officelevels. Der Code für einen vertikalen Spiegel ist ähnlich, hier jedoch einige Hinweise:
1) Der Spiegel sollte im Level nicht rotiert werden. Wenn Sie einen Spiegel an der Wand haben möchten, der nach Süden weist, sollten Sie ihn horizontal plazieren.

2) Der Spiegelcode ändert sich, je nach Orientierung des Spiegels. Hier ist der Code aus meinem Beispiel:

function init_mirror()
{
camera.portal = mirror;
mirror.noshadow = on; // suppress shadows in the mirror
mirror.noparticle = on; // suppress particles in the mirror
mirror.portalclip = on; // clip at portal plane
while (1)
{
proc_late(); // place it at the end of the function list
mirror.genius = camera.genius;
mirror.aspect = camera.aspect;
mirror.arc = -camera.arc;
mirror.fog = camera.fog;
mirror.x = camera.x;
mirror.y = camera.portal_y - (abs(camera.portal_y - camera.y));
mirror.z = camera.z;
mirror.pan = -camera.pan;
mirror.tilt = camera.tilt;
mirror.roll = camera.roll;
wait(1);
}
}

Wenn der Spiegel an die westliche Wand soll, sollte er wie folgt modifiziert werden:

function init_mirror()
{
camera.portal = mirror;
mirror.noshadow = on; // suppress shadows in the mirror
mirror.noparticle = on; // suppress particles in the mirror
mirror.portalclip = on; // clip at portal plane
while (1)
{
proc_late(); // place it at the end of the function list
mirror.genius = camera.genius;
mirror.aspect = camera.aspect;
mirror.arc = -camera.arc;
mirror.fog = camera.fog;
mirror.x = camera.portal_x - (abs(camera.portal_x - camera.x));
mirror.y = camera.y;
mirror.z = camera.z;
mirror.pan = -camera.pan;
mirror.tilt = camera.tilt;
mirror.roll = camera.roll;
wait(1);
}
}

3) Wenn Sie die Mirrorentity erstellen, setzen Sie die Oberflächen auf "flat", die nicht von Interesse sind und "mirror" für die Fläche, die als Spiegel fungieren soll.

4) Hinter dem Spiegel sollte genug Platz sein, denn was im Spiegel zu sehen ist wird auf der anderen Seite der Wand "erzeugt", durch das Loch mit Hilfe einer imaginären "Kamera".

5) Es könnte eine gute Idee sein, einen unsichtbaren Block vor den Spiegel zu stellen, damit der Spieler nicht hinkommt; wenn der Spieler in den Spiegel hineinläuft, sieht man den Spiegel nicht mehr. Ich habe das in meinem Beispiel so gemacht.

6) Vergessen Sie nicht, jede Oberfläche im Level, die den Spiegel umgibt, auf "none" zu setzen.

Ich habe ein Verzeichnis mit einem Beispiel erstellt; kopieren Sie den \mirrors Ordner in Ihr Gamestudio Verzeichnis, öffnen "mirrors.wmp" (nicht mirror.wmp!), build und run.

Frohes Spiegeln!