F:
Ich brauche einen Code für eine Kamera, welche mir erlaubt frei
durch das Level zu fliegen, jedoch aber Kollisionserkennung hat.
A: Weisen Sie Ihrem Player
die folgende Aktion zu; mit der Maus können Sie sich drehen,
drücken und halten eines Mausbuttons bewegt die Kamera.
action free_camera
{
my.invisible = on;
mouse_mode = 0;
while (1)
{
camera.x = my.x;
camera.y = my.y;
camera.z = my.z;
camera.pan = my.pan;
camera.tilt = my.tilt;
my.pan -= 10 * mouse_force.x * time;
my.tilt += 10 * mouse_force.y * time;
if (mouse_left == 1)
{
move_mode = ignore_passable
+ glide;
result = ent_move (vector
(10 * time, 0, 0), nullvector); // 10 = speed
}
if (mouse_right == 1)
{
move_mode = ignore_passable
+ glide;
result = ent_move (vector
(-10 * time, 0, 0), nullvector); // -10 = speed
}
wait (1);
}
}
F: Könnten
Sie mir bitte beschreiben, wie ich meine Models mit „Ressource“ schützen
kann?
A: Folgen Sie diesen einfachen Schritten, allerdings
benötigen Sie dafür A5 oder A6 Professional Edition:
- Erstellen Sie ein kurzes Script das wie dieses aussieht und nennen Sie es „Ressource.wdl“.
bind <guard.mdl>;
bind <warlock.mdl>; // "bind" as many models as you need
- Starten Sie WED, platzieren Sie einen einfachen Block im Level und fügen Sie dem Level die „ressource.wdl“ hinzu (File -> Map Properties).
- Benutzen Sie File-> Ressource und WED wird ein Ressource File, eine „*wrs“ Datei, im aktuellen Spiel-Ordner erstellen.
- Benutzen Sie auf diesem Weg Ressource Dateien in Ihrem Script.
resource "resources.wrs"; // open the "resources.wdl" file
string guard_mdl = "guard.mdl"; // retrieve the guard model from "resources.wrs"
starter create_guard_resource
{
sleep (1); // wait until the level is loaded
ent_create(guard_mdl, vector(100, 50, 200), null); // create the
guard.mdl model at x = 100, y = 50, z = 200 quants
}
F:
Gibt es eine einfach Methode um die FPS in meinem Spiel zu berechnen
und anzuzeigen, da ich den Standard Debugpanel nicht verwenden kann?
A: Benutzen Sie den
folgenden Code:
var fpsec;
var init_frames;
starter compute_fpsec()
{
while (1)
{
init_frames = total_frames; // store the initial
total_frames value
sleep (1); // wait for a second
fpsec = total_frames - init_frames; // get the
new total_frames value and subtract init_frames from it
}
}
panel debug_panel
{
layer = 20;
pos_x = 50;
pos_y = 50;
digits = 10, 10, 3, _a4font, 1, fpsec;
flags = overlay, refresh, visible;
}
F:
Ich möchte in der Lage sein, 200 verschiedene Actors in meinem Strategie-Spiel
zu kontrollieren, aber ich kann mich mit der Idee von 200 Pointern nicht
recht anfreunden… Gibt es eine Lösung?
A: Ja, benutzen Sie stattdessen
ein „handle“:
entity* my_actor;
var index = 0;
var actors[200]; // store 200 handles in this array
action my_actors
{
actors[index] = handle(my); // store the handle inside the array
index += 1; // move to the next actor
// put the rest of the code for your actors here
}
function move_actors_upwards(actor_number)
{
my_actor = ptr_for_handle(actors[actor_number]);
my_actor.z += 100;
}
function
increase_height() // a simple test function
{
move_actors_upwards(2); // increase the z of the 2nd actor by 100
quants
move_actors_upwards(32); // increase the z of the 32nd actor by
100 quants
move_actors_upwards(85); // increase the z of the 85th actor by
100 quants
}
on_i = increase_height;
F:
Ich muss viele Meiner Bäume an bestimmten Positionen auf meinem
Terrain platzieren, aber das setzen per WED dauert zu lange. Gibt es
eine Alternative?
A: Plazieren Sie die Bäume nahe
bei ihren endgültigen Positionen und fügen sie den folgenden
Code ein. Geben Sie Ihren Bäumen die Action „dummy_tree“,
Im Spiel gehen Sie mit der Maus über die einzelnen Bäume und
benutzen „A“, „Z“, „S“, „X“, „D“ und „C“ um
die Bäume auf ihre korrekte Position zu setzen. Schreiben Sie sich
dann die 3 Koordinaten, welche am Bildschirm angezeigt werden, raus und
geben Sie dem entsprechenden Baum in WED. Wiederholen Sie diese Schritte
bis alle Bäume richtig positioniert sind. Und vergessen Sie nicht
F2 (Quicksave) und F3 (Quickload) um die aktuelle Position der Bäume
zu speichern, wenn möchten.
bmap arrow_pcx = <arrow.pcx>;
panel entity_pan
{
pos_x = 0;
pos_y = 0;
digits = 50, 10, 5, _a4font, 1, mouse_ent.x;
digits = 50, 22, 5, _a4font, 1, mouse_ent.y;
digits = 50, 34, 5, _a4font, 1, mouse_ent.z;
flags = refresh, visible;
}
starter set_tree_coords()
{
mouse_mode = 2;
mouse_map = arrow_pcx;
while (1)
{
mouse_pos.x = pointer.x;
mouse_pos.y = pointer.y;
if (mouse_ent != null) // entity detected?
{
if (key_a == on) {mouse_ent.x
+= 1 * time;}
if (key_z == on) {mouse_ent.x
-= 1 * time;}
if (key_s == on) {mouse_ent.y
+= 1 * time;}
if (key_x == on) {mouse_ent.y
-= 1 * time;}
if (key_d == on) {mouse_ent.z
+= 1 * time;}
if (key_c == on)
{mouse_ent.z -= 1 * time;}
}
wait (1);
}
}
action dummy_tree // attach this action to all the tree models
{
my.invisible = off; // put something (anything!) here
}

F:
Ich möchte ein „Warnung!“ Panel in meinem HUD anzeigen,
wenn ein Gegner des Player’s gesehen werden kann. Wie kann ich
das bewerkstelligen?
A: Fügen Sie folgenden
Code in die „while“ Schleife Ihrer Gegner, welche
diese bewegt:
bmap alert_pcx = <alert.pcx>;
panel alert_pan
{
bmap = alert_pcx;
layer = 10;
pos_x = 10;
pos_y = 5;
flags = overlay, refresh;
}
action
my_enemy
{
my.skill1 = 100; // health = 100
// other code outside the "while" loop
.................
while (my.skill1 > 0) // as long as I'm alive
{
if(vec_to_screen(my.x, camera.x)) // if the camera
can see me
{
alert_pan.visible = on; //
show the "Alert!" panel
}
else // otherwise
{
alert_pan.visible = off; //
hide the panel
}
// the rest of the code that runs inside the "while" loop
goes here
...................
wait (1);
}
}

F: Gibt
es eine einfach Möglichkeit um einen „heißen“ Boden
zu erstellen, welcher dem Player Leben abzieht, ähnlich wie Lava?
A: Fügen Sie den folgenden Code
am Ende Ihres Scripts ein:
starter hot_floor()
{
while (player == null) {wait (1);}
while (1)
{
vec_set (temp, player.x);
temp.z -= 5000;
trace_mode = ignore_me + ignore_passable + ignore_sprites
+ ignore_models + scan_texture;
trace(player.x, temp);
if (str_cmpi (tex_name, "lava")) // use
a texture named "lava" (without
the quotes) for the hot areas in your level
{
player._health -= 3 * time; // "3" gives the health decreasing speed
}
wait(1);
}
}
F:
Wäre es möglich, Lichter, welche nahe dem Player sind, automatisch
anzuschalten auch wieder aus, wenn der Player wieder von den Lichtern weg
geht?
A: Kopieren Sie den folgenden
Code ans Ende ihres Scripts und geben Sie den Lichtern die Action „nice_lights“.
action nice_light
{
while (player == null) {wait (1);}
my.lightred = 200;
my.lightgreen = 220;
my.lightblue = 100;
my.light = on;
while (1)
{
if (vec_dist (player.x, my.x) < 500) // play with
500
{
my.lightrange = 300;
my.ambient = 100;
}
else
{
my.lightrange = 0;
my.ambient = -100;
}
wait (1);
}
}
F: Wie
kann ich einen Feuerring erstellen, welcher dem Player immer folgt?
A: Benutzen Sie den folgenden
Code:
bmap effect_tga = <effect.tga>;
function fade_them()
{
my.alpha -= 5 * time; // play with 5
if(my.alpha < 0) {my.lifespan = 0;}
}
function particle_init()
{
temp.x = random(2) - 1;
temp.y = random(2) - 1;
temp.z = random(2) - 1;
vec_set(my.vel_x, temp);
my.move = on;
my.bmap = fire_tga;
my.flare = on;
my.bright = on;
my.alpha = 100;
my.lifespan = 100;
my.size = 15;
my.function = fade_them;
}
starter player_ring()
{
var temp_var = 0;
var particle_start;
var ring_diameter = 50;
while (player == null) {wait (1);}
while(1)
{
particle_start.x = player.x + (ring_diameter
* sin(temp_var));
particle_start.y = player.y + (ring_diameter
* cos(temp_var));
particle_start.z = player.z;
effect(particle_init, 5, particle_start.x, nullvector);
temp_var += 50 * time; // play with 50
wait (1);
}
}
