F: Wie kann ich dem Auto in Aum 10 Motorengeräusche zufügen?
A: Sie müssen einiges hinzufügen und die Funktion player_to_car() ändern:

var engine_handle;

sound engine_snd = <engine.wav>;

function player_to_car()
{
wait (1);
ent_remove (me);
player.shadow = off;
player._MOVEMODE = _MODE_DRIVING;
player._FORCE = 1.5;
player._BANKING = 0.1;
player.__SLOPES = on;
player.__WHEELS = on;
player.__JUMP = off;
player.__STRAFE = off;
player.__TRIGGER = on;
astrength.pan = 1.5;
car_entity.visible = on;
while (key_space == 0) // press space to switch from car to player
{
if (key_force.y != 0)
{
if (snd_playing (engine_handle) == 0)
{
snd_loop (engine_snd, 40, 0);
engine_handle = result;
}
}
else
{
snd_stop (engine_handle);
}
wait (1);
}
temp.x = player.x - 100 * sin(player.pan);
temp.y = player.y + 100 * cos(player.pan);
temp.z = player.z;
ent_create (car_mdl, player.pos, create_car);
vec_set (player.pos, temp);
car_entity.visible = off;
car_to_player();
}
F: Wie erstelle ich ein Panel, welches “Beliebige Taste zum Fortfahren” für jedes geladene Level anzeigt?
A: Benutzen Sie diesen Code:

bmap presskey_pcx = <presskey.pcx>;

panel presskey_pan
{
bmap = presskey_pcx;
layer = 30;
pos_x = 0;
pos_y = 0;
flags = d3d, overlay, refresh;
}

action panel_trigger // place any entity with this action attached to it in every level
{
my.invisible = on;
my.passable = on;
presskey_pan.visible = on;
while (key_any == 0) {wait (1);}
presskey_pan.visible = off;
}

F: Wie lasse ich meinen Spieler verschwinden, wenn er in ein Fahrzeug steigt und wieder auftauchen, wenn er aussteigt?
A: Hier ist der Code aus Aum 10 für eine externe Kamera:

// include this file in your main game file
// attach action my_car to your car model

string car_mdl = <rallycar.mdl>;

function player_to_car();
function car_to_player();
function create_car();

entity car_entity
{
type = <rallycar.mdl>;
layer = 10;
view = camera;
x = 20;
y = 0;
z = -60;
}

action my_car
{
person_3rd = 0.5; // force 3rd person mode
my.enable_impact = on;
my.event = player_to_car;
}

function player_to_car()
{
wait (1);
ent_remove (me);
player.shadow = off;
player.invisible = on;
player._MOVEMODE = _MODE_DRIVING;
player._FORCE = 1.5;
player._BANKING = 0.1;
player.__SLOPES = on;
player.__WHEELS = on; // rotate only when moving
player.__JUMP = off; // the car can't jump
player.__STRAFE = off; // can't strafe
player.__TRIGGER = on;
astrength.pan = 1.5; // decrease rotation speed (pan)
car_entity.visible = on;
while (key_space == 0) // press space to switch from car to player
{
wait (1);
}
temp.x = player.x - 100 * sin(player.pan); // check to see if there is an empty space (near the car door) to deploy the player
temp.y = player.y + 100 * cos(player.pan);
temp.z = player.z;
ent_create (car_mdl, player.pos, create_car);
vec_set (player.pos, temp);
car_entity.visible = off;
car_to_player();
}

function car_to_player()
{
player._MOVEMODE = _MODE_WALKING;
player._FORCE = 0.75;
player._BANKING = -0.1;
player.__SLOPES = off;
player.__WHEELS = off;
player.__JUMP = on;
player.__DUCK = on;
player.__STRAFE = on;
player.__BOB = on;
player.__TRIGGER = on;
player.invisible = off;
astrength.pan = 7; // restore the original value in move.wdl
}
function create_car()
{
wait (1);
vec_set(temp, my.x);
my.pan = player.pan;
temp.z -= 2000; // trace 2000 quants below the car
trace_mode = ignore_me + ignore_passable + ignore_models + ignore_sprites;
my.z -= trace (my.x, temp); // place the car at ground level
my_car(); // start the action again
}

F: Ich benutze den Fahrzeug Code aus Aum 10 und möchte wissen, wie der Spieler in dieselbe Richtung schauen kann wie das Auto, wenn er einsteigt. Im Moment übernimmt das Auto den pan Wert des Spielers und das sieht nicht richtig aus.
A: Ändern Sie die Funktion player_to_car() folgendermaßen:

function player_to_car()
{
wait (1);
player.pan = my.pan;
ent_remove (me);
player.shadow = off;
player._MOVEMODE = _MODE_DRIVING;
player._FORCE = 1.5;
player._BANKING = 0.1;
player.__SLOPES = on;
player.__WHEELS = on; // rotate only when moving
player.__JUMP = off; // the car can't jump
player.__STRAFE = off; // can't strafe
player.__TRIGGER = on;
astrength.pan = 1.5; // decrease rotation speed (pan)
car_entity.visible = on;
while (key_space == 0) // press space to switch from car to player
{
wait (1);
}
temp.x = player.x - 100 * sin(player.pan); // check to see if there is an empty space (near the car door) to deploy the player
temp.y = player.y + 100 * cos(player.pan);
temp.z = player.z;
ent_create (car_mdl, player.pos, create_car);
vec_set (player.pos, temp);
car_entity.visible = off;
car_to_player();
}

F: Wie bekomme ich es hin, dass der Spieler eine Waffe, die er aufsammelt, auch wirklich hält? (Externe Kamera)
A: Animieren Sie die Waffe zusammen mit dem Player Model und speichern Sie sie separat ab. Benutzen Sie dann diesen Code:
string gun_mdl = <gun.mdl>;

function attach_player_gun();

action pick_me_up // attach it to your gun
{
my.passable = on;
while (player == null) {wait (1);}
while (vec_dist (player.x, my.x) < 100) {wait (1);}
ent_remove (me);
ent_create(gun_mdl, nullvector, attach_player_gun); // give the player a gun
}

function attach_player_gun()
{
proc_late();
my.passable = on;
my.metal = on;
while(player != null)
{
vec_set(my.pos,player.pos);
vec_set(my.pan,player.pan);
my.frame = player.frame;
my.next_frame = player.next_frame;
wait(1);
}
ent_remove(my);
}
F: Ich möchte die WASD Tasten für Bewegung nutzen; geht das, wenn ich die Templates verwende?
A: Ersetzen Sie die folgenden Zeilen aus movement.wdl (oder input.wdl, wenn Sie die neueren Templates benutzen)
force.X = strength.X*(KEY_FORCE.Y+JOY_FORCE.Y); // forward/back
force.Y = strength.Y*(KEY_COMMA-KEY_PERIOD); // side to side

durch diese:

force.X = strength.X*(KEY_FORCE.Y+JOY_FORCE.Y+key_w-key_s);
force.Y = strength.Y*(KEY_COMMA-KEY_PERIOD+key_a-key_d);
F: Wie kann ich die Gesundheit oder Rüstung des Spielers weich erhöhen oder senken, statt einen großen Teil auf einmal abzuziehen?
A: Hier ist ein Beispiel:

define damage skill10;

function decrease_health();

action enemy // could be an enemy, an enemy bullet, etc
{
my.damage = 10;
........................
}

action player
{
..................................
my.enable_impact = on;
my.event = decrease_health;
while (1)
{
...........
wait (1);
}
}
function decrease_health()
{
if (event_type == event_impact && you.damage != 0) // it is an enemy, an enemy bullet, etc
{
player.skill48 = player._health;
while (player._health > player.skill48 - you.damage)
{
player._health -= 5 * time;
wait (1);
}
}
}

F: Wie bekomme ich es hin, dass der Spieler, wenn er ein bestimmtes Objekt „benutzt“, in den nächsten Level kommt und wieder volle Gesundheit und Rüstung hat?
A: Hier ist der Code:

function next_level();

bmap use_pcx = <use.pcx>;
string level2_wmb = <level2.wmb>;

panel use_me // shows the usable object on the screen
{
bmap = use_pcx;
layer = 20;
pos_x = 40;
pos_y = 60;
flags = d3d, overlay, refresh, visible;
on_click next_level;
}

function next_level()
{
level_load (level2_wmb);
}
Gesundheit und Rüstung werden automatisch erhöht (setzen Sie die Werte über skill9 und skill10 in den Templates)

F: Ich möchte ein Rennspiel machen; wie kann ich Animationen für Links, Rechts, etc. aufrufen, wenn die jeweiligen Tasten gedrückt werden?
A: Ich nehme an, dass Sie die Pfeiltasten benutzen:

action my_car
{
while (1)
{
...........
// movement code
..........
if (key_cul == 1)
{
ent_cycle("rotateleft", my.skill20); // name your animation frames this way
my.skill20 += 3 * time; // animation speed
my.skill20 %= 100; // loop the animation
}
if (key_cur == 1)
{
ent_cycle("rotateright", my.skill20); // name your animation frames this way
my.skill20 += 3 * time; // animation speed
my.skill20 %= 100; // loop the animation
}
if ((key_cul + key_cur == 0) && (key_cuu + key_cud != 0))
{
ent_cycle("moveforward", my.skill20); // name your animation frames this way
my.skill20 += 3 * time; // animation speed
my.skill20 %= 100; // loop the animation
}
wait (1);
}
}