Feature des Monats: aspect

Acknex hat eine Menge guter Features, die viel zu wenig Beachtung finden; diesen Monat möchte ich Ihnen zeigen, was man mit "aspect" tun kann.

Praktischer Nutzen: stellen Sie den Bildschirm auf den Kopf (nützlich für Weltraumspiele), kreieren Sie beeindruckende Zaubereffekte und mehr!

Die Variable "aspect" bestimmt das Verhältnis von horizontaler zu vertikaler Bildschirmgröße. Mit anderen Worten: wenn Sie ein Quadrat auf dem Schirm plazieren und den "aspect" ändern, sieht es wie ein Rechteck aus. Ich habe zwei simple Funktionen erstellt, die dieses Feature nutzen:

function flip_level()
{
while (camera.aspect > -1)
{
camera.aspect -= 0.1 * time;
wait (1);
}
}

function grow_level()
{
while (camera.aspect < 5)
{
camera.aspect += 0.2 * time;
wait (1);
}
}

on_f = flip_level;
on_g = grow_level;

Die erste Funktion läuft, wenn die "F" Taste gedrückt wird; sie setzt den aspect von 1 (default) auf -1. Dadurch wird das Bild umgedreht.

Die zweite Funktion läuft, wenn die "G" Taste gedrückt wird; sie erhöht den camera.aspect von 1 auf 5: jeder Pixel in x Richtung entspricht 5 Pixeln in y Richtung. Sehen Sie, wie interessant die Steine aussehen, wenn der aspect auf 5 steht! Dieser Effekt wäre gut für einen magischen Trank etc.

Landminen

Stellen wir uns folgende Situation vor: Sie werden von viel zu vielen Gegner verfolgt. Ihre Gesundheit ist niedrig und jede Kugel bringt Sie dem unehrenhaften Tod näher. Und dieser Korridor sieht aus, als würde er niemals enden! (Obwohl Sie verletzt sind, können Sie nicht aufhören daran zu denken, dass Acknex eine solch geniale Engine ist...) Die Gegner sind direkt hinter Ihnen, doch halt! Da ist eine Tür! Sie öffnen die Tür und hören zwei kurze Pieptöne. Ein spektakulärer Sprung rettet Ihr Leben, die Mine explodiert, ohne Sie zu verletzen. Aber Ihre Gegner haben nicht solches Glück...

Wenn sich das für Sie vielversprechend anhörte, so können Sie sich freuen: dieser Artikel wird Ihnen beibringen, wie man Landminen erstellt, die Sie und Ihre Gegner verletzen können. Sie können Ihre Gegner hinter sich herlocken und wenn Sie zu nahe an die Minen kommen, sterben sie.

Der Code ist überhaupt nicht kompliziert:

action landmine
{
my.skill1 = 0;
my.enable_detect = on;
my.event = hurt_them;

Wir setzen skill1 auf 0; dieser Wert wird auf 0 bleiben, solange die Mine keine Entity gespürt hat. Wir setzen enable_detect auf on; auf diese Weise wird die Mine auf alle Entities reagieren, die enable_scan gesetzt haben: der Spieler und die "normalen" Feinde (actor_ai_one zum Beispiel). Wenn eine dieser Entities der Mine zu nahe kommt, wird die Funktion hurt_them laufen.

while (my.skill1 == 0)
{
temp.pan = 360;
temp.tilt = 180;
temp.z = 200;
scan_entity(my.x, temp);
if ((result > 0) && (result < 200))
{
my.ambient = 100;
ent_playsound (my, beephigh_wav, 500);
sleep (0.3);
my.ambient = 0;
sleep (0.3);
my.ambient = 100;
ent_playsound (my, beephigh_wav, 500);
my.skill1 = 1; // get out of the while loop
}
sleep (0.2); // scan 5 times a second
}

Solange skill1 auf 0 ist, scannen wir alles um die Mine so wie im Bild und zwar fünf Mal in der Sekunde.

Nichts kann unserem Scan entkommen; mehr noch, wir könnten einfach temp.z erhöhen, um die Reichweite zu verändern. Wenn die Mine eine Entity bemerkt hat, erhöht sie ihren Ambient, spielt einen Sound und wartet für 0,3 Sekunden. Der Ambient wird zurück auf 0 gesetzt, wir warten wieder 0,3 Sekunden und die Sequenz wiederholt sich. Sobald der zweite Ton verklungen ist, wird skill1 auf 1 gesetzt, damit wir aus der Schleife herauskommen. Sleep(0.2); sorgt fünfmal in der Sekunde für einen Scan; wenn Sie denken, dass die Feinde schneller sind (in einem Weltraumspiel z.B.), können Sie diesen Wert verringern.

Wir haben bisher noch niemanden verletzt; der Code, der dies tut ist in der Funktion hurt_them:

function hurt_them()
{
sleep (1);
you._health -= 200;
}

Wir warten eine Sekunde; die Entity ist bereits tot, aber wir geben ihr die Illusion, entkommen zu können. Das kann nicht geschehen, denn die nächste Zeile nimmt 200 Health Punkte weg. Eine Landmine sollte jeden töten, oder?