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);
}
}