Kugel Code

Wenn Sie die vielen “Marbles” Klone gern gespielt haben, dann haben Sie jetzt die Chance, ihren eigenen zu erstellen. Wir werden Code für eine Kugel schreiben, die mit Hilfe der Pfeiltasten kontrolliert wird und realistisch im Level abprallt. Dabei werde ich die Physik Engine nicht benutzen, der Code funktioniert also mit allen Editionen der Acknex Engine.

function main()
{
fps_max = 60;
level_load (level1_wmb);
wait (3);
while (1)
{
camera.x = ball.x - 200;
camera.y = ball.y;
camera.z = 100;
camera.tilt = -45;
wait (1);
}
}

Jedes Mal, wenn Sie die main() Funktion in einem der Aum Skripte sehen, wissen Sie, dass es sich um ein eigenständiges Projekt ohne die Templates handelt, richtig? Das bedeutet, dass Sie weitere Features zum Code hinzufügen können, falls sie benötigt werden und alles (hoffentlich) trotzdem noch funktioniert. Unsere Funktion begrenzt die Framerate auf 60 Fps, lädt ein simples Level, wartet bis dies geschehen ist und setzt die Kamera an eine geeignete Position. Beachten Sie, dass die Kamera eine feste Höhe von 100 Quants hat und die ganze Zeit 200 Quants hinter der Kugel ist.

action bouncing_ball
{
ball = my;
my.enable_block = on;
my.enable_entity = on;
my.event = reverse_speed;
while (1)
{
if (key_cuu == on)
{
ball_speed.x = 5 * time;
my.tilt -= 8 * time;
}
if (key_cud == on)
{
ball_speed.x = -5 * time;
my.tilt += 8 * time;
}
if ((key_cuu == off) && (key_cud == off))
{
ball_speed.x = 0;
}
if (key_cul == on)
{
ball_speed.y = 5 * time;
my.roll += 8 * time;
}
if (key_cur == on)
{
ball_speed.y = -5 * time;
my.roll -= 8 * time;
}

Wie Sie sehen, habe ich dem Pointer auf die Kugel Entity einen originellen Namen gegeben (ball); die Entity reagiert auf Kollisionen mit Level Blocks und Entities und startet die reverse_speed Funktion, wenn sie an etwas aneckt. Wenn der Spieler die “Pfeil Oben” Taste drückt, dann bewegt sich die Kugel mit einer Geschwindigkeit von 5 * time vorwärts und ändert dabei ihren tilt mit einer Geschwindigkeit von –8 * time, weil wir die Illusion einer rollenden Kugel erzeugen wollen. Das Gleiche gilt für die anderen Pfeiltasten, natürlich mit anderen Richtungen, Geschwindigkeiten und Rotationswinkeln.

if ((key_cuu == off) && (key_cud == off))
{
ball_speed.x = 0;
}
if ((key_cul == off) && (key_cur == off))
{
ball_speed.y = 0;
}
vec_set (temp, my.x);
temp.z -= 10000;
trace_mode = ignore_me + ignore_passable + use_box;
trace_dist = trace(my.x, temp);
if (trace_dist > max_height) // the ball has reached its maximum height?
{
ball_speed.z = -abs(ball_speed.z); // then give the ball a negative speed
}
ent_move (nullvector, ball_speed);
wait(1);
}
}

Wenn der Spieler keine Pfeiltaste drückt, werden ball_speed.x und ball_speed.y zurückgesetzt; die Kugel soll ja anhalten, wenn keine Taste gedrückt ist. Die nächsten Zeilen beinhalten eine “trace” Anweisung, die feststellen soll, wo sich der Boden befindet. Ich habe mich für einen dicken Tracestrahl entschieden (use_box), weil ich nicht wollte, dass die Kugel am Rand einer Rampe oder einer ähnlichen Situation hängen bleibt.

Falls trace_dist größer ist als max_height (am Anfang auf 70 gesetzt), hat die Kugel ihre maximale Höhe erreicht, also müssen wir die Geschwindigkeit ins Negative ändern, weil wir ja wollen, dass sie zu Boden fällt. Ich habe mich für 70 Quants über dem Boden entschieden, aber Sie können jeden anderen Wert wählen.

function reverse_speed()
{
ball_speed.z *= -1;
}

Die Eventfunktion ändert einfach das Vorzeichen der Geschwindigkeit (von negativ zu positiv oder andersherum), wenn die Kugel mit etwas kollidiert.

Zufällige Töne

Viele Spiele benutzen mehrere Soundtracks und spielen diese zufällig ab. Dieser Ausschnitt zeigt Ihnen, wie das geht.

starter random_tunes()
{
var current_track = 0;
randomize();
while (1)
{
current_track = int(random(5)) + 1;
if (current_track == 1)
{
media_play("track1.mid", null, 100);
}
if (current_track == 2)
{
media_play("track2.mid", null, 100);
}
if (current_track == 3)
{
media_play("track3.mid", null, 100);
}
if (current_track == 4)
{
media_play("track4.mid", null, 100);
}
if (current_track == 5)
{
media_play("track5.mid", null, 100);
}
while (snd_playing(media_handle) != 0) {wait (1);}
sleep (1);
}
}

Wir haben eine Starterfunktion, die ihre Arbeit aufnimmt, sobald das Level geladen ist. Wir definieren eine lokale Variable namens current_track und stellen sicher, dass wir jedes Mal, wenn das Skript läuft, andere Zufallszahlen erhalten, indem wir die vorgefertigte “randomize”-Funktion aufrufen. Die erste Codezeile in der Schleife erzeugt eine zufällige Zahl zwischen 1 und 5; wir spielen dann einen der 5 Soundtracks, je nach Wert von “current_track”. Die letzten Codezeilen warten bis der Song aufhört und sorgen für eine Pause von 1 Sekunde. Sie können hier jeden anderen Wert nutzen, auch wait(1), wenn Sie keine Pause wünschen.