F:
Ich möchte die Camera um eine bestimmte Ziel Entity drehen, wenn
ich nach links und rechts drücke. Oben und unten sollen mich näher
oder weiter weg vom Ziel bewegen. Können Sie helfen?
A: Weisen Sie die folgende
Action der Ziel Entity zu.
entity* mytarget;
action my_target // attach it to the target entity
{
mytarget = my;
}
starter chase_target()
{
var distance_to_target = 300; // initial distance to target
var temp_angle = 50; // initial angle
while (mytarget == null) {wait (1);}
while (1)
{
camera.x = mytarget.x + distance_to_target *
cos(temp_angle);
camera.y = mytarget.y + distance_to_target *
sin(temp_angle);
camera.z = mytarget.z;
vec_set (temp, mytarget.x);
vec_sub (temp, camera.x);
vec_to_angle (camera.pan, temp);
if ((key_cuu == on) && (distance_to_target > 100))
{
distance_to_target -= 7 * time;
// come closer to the target
}
if ((key_cud == on) && (distance_to_target < 500))
{
distance_to_target += 7 * time; //
get away from the target
}
if (key_cul == on)
{
temp_angle -= 5 * time;
}
if (key_cur == on)
{
temp_angle += 5 * time;
}
wait (1);
}
}
F: Wie
kann ich Bewegungen wie in dem Spiel Prince of Persia vollbringen? Der Prinz
greift eine Stange, und schwingt sich daran herum. Wie kann man sicher gehen
das die Hand jederzeit perfekt an der Stange anliegt, auch wenn der Abstand,
von dem man zur Stange springt nicht immer der gleiche ist?
A: Sie können mit einer einfachen Methode ein ähnliches
Ergebnis erreichen: berechnen Sie den Abstand zwischen Spieler und Stange
und passen Sie die Sprungstärke und die Animationsframes abhängig
vom Abstand an. Zum Beispiel wenn die Distanz zwischen Spieler und Stange
100 Quants beträgt, bewegen Sie den Spieler mit 10*time und animieren
mit 5*time. Bei 70 Quants bewegen Sie mit 7*time und animieren mit 5*(100/70)*time.
F:
Wenn ich nach einer Box trete, wie kann ich sicher gehen, das diese zur
gegenüberliegenden bewegt wird, ohne die ursprünglichen Pan
und Tilt Winkel zu verlieren.
A: Verwenden sie
den folgenden Code. Rennen Sie in die Box um diese zu
bewegen.
function move_boxes()
{
vec_rotate (vector(2 * (my.x - player.x) * time, 0, 0), player.pan);
vec_add (my.x, vector(2 * (my.x - player.x) * time, 2 * (my.y - player.y)
* time,
0));
}
action my_box
{
while (player == null) {wait (1);}
my.enable_impact = on;
my.enable_entity = on;
my.event = move_boxes;
}
F:
Ich möchte ein Inventar-Panel mit vier Waffen erzeugen. Die PCX
Bilder sollen erst erscheinen, wenn man die entsprechende Waffe aufgenommen
hat. Können Sie helfen?
A: Werfen Sie einen Blick
auf das folgende Beispiel und erweitern Sie es um so viele
Waffen, wie Sie möchten.
bmap
weapon1_pcx = <weapon1.pcx>;
bmap weapon2_pcx = <weapon2.pcx>;
var got_weapon1 = 0;
var got_weapon2 = 0;
panel weapon1_pan
{
bmap = weapon1_pcx;
layer = 20;
pos_x = 0;
pos_y = 0;
flags = overlay, refresh;
}
panel weapon2_pan
{
bmap = weapon2_pcx;
layer = 20;
pos_x = 50;
pos_y = 0;
flags = overlay, refresh;
}
starter check_weapon_status()
{
while (1)
{
if (got_weapon1 == 1) // got weapon1?
{
weapon1_pan.visible = on;
}
else
{
weapon1_pan.visible = off;
}
if (got_weapon2 == 1) // got weapon2?
{
weapon2_pan.visible = on;
}
else
{
weapon2_pan.visible = off;
}
wait (1);
}
}
action weapon_first // attach it to the first weapon
{
my.passable = on;
while (player == null) {wait (1);}
while (vec_dist (player.x, my.x) > 50)
{
my.pan += 5 * time;
wait (1);
}
got_weapon1 = 1;
my.invisible = on;
// put the rest of your weapon code here
}
action weapon_second // attach it to the second weapon
{
my.passable = on;
while (player == null) {wait (1);}
while (vec_dist (player.x, my.x) > 50)
{
my.pan += 5 * time;
wait (1);
}
got_weapon2 = 1;
my.invisible = on;
// put the rest of your weapon code here
}
F:
Wie kann ich einen Splashscreen erstellen, der erscheint, bevor ein Level
geladen wird, und nach Tastendruck verschwindet? Der Code sollte für
mehrere Levels funktionieren.
A: Verwenden Sie den folgenden Code
als Beispiel.
bmap splash_pcx = <splash.pcx>;
panel splash_pan
{
bmap = splash_pcx;
pos_x = 0;
pos_y = 0;
layer = 1;
flags = overlay, refresh;
}
action level1_level2 // attach this action to any entity placed at the end
of the first level
{
while (player == null) {wait (1);}
while (vec_dist (player.x, my.x) > 50) {wait (1);}
while (key_any == on) {wait (1);} // wait until all the keys are
released
my = null;
level_load(level2_wmb);
freeze_mode = 1; // stop all the entities in the level
splash_pan.visible = on;
while (key_any == off) {wait (1);}
splash_pan.visible = off;
freeze_mode = 0; // resume the gameplay
}
action level2_level3 // attach this action to any entity placed at the end
of the second level
{
while (player == null) {wait (1);}
while (vec_dist (player.x, my.x) > 50) {wait (1);}
while (key_any == on) {wait (1);} // wait until all the keys are
released
my = null;
level_load(level3_wmb);
splash_pan.visible = on;
while (key_any == off) {wait (1);}
splash_pan.visible = off;
}
F:
In einigen Spielen dreht sich der Kopf der Spielfigur zu einem Objekt
das aufgenommen oder benutzt werden kann, wenn man in dessen Nähe
kommt. Wie kann man das machen?
F: Kopieren sie den folgenden
Code an das Ende des Hauptskripts.
entity* special;
function rotate_entity (active, passive, panspeed, tiltspeed);
function rotate_entity (active, passive, panspeed, tiltspeed)
{
var target_pan;
my = active;
you = passive;
vec_set (temp, your.x);
vec_sub (temp, my.x);
vec_to_angle (target_pan, temp);
temp.pan = ang (target_pan - my.pan);
target_pan = my.pan + temp.pan;
if( my.pan < target_pan)
{
while(my.pan < target_pan)
{
my.pan += panspeed.pan * time;
if (my.tilt > target_pan.tilt)
{
my.tilt
-= tiltspeed * time;
}
if (my.tilt < target_pan.tilt)
{
my.tilt
+= tiltspeed * time;
}
wait(1);
}
}
else
{
while(my.pan >= target_pan)
{
my.pan -= panspeed.pan * time;
if (my.tilt > target_pan.tilt)
{
my.tilt
-= tiltspeed * time;
}
if (my.tilt < target_pan.tilt)
{
my.tilt
+= tiltspeed * time;
}
wait(1);
}
}
}
action special_object
{
special = my;
while (player == null) {wait (1);}
while (vec_dist (player.x, my.x) > 200) {wait (1);}
while (vec_dist (player.x, my.x) <= 200)
{
rotate_entity (player, special, 0.1, 0);
wait (1);
}
}
Q: Wie
kann man ein Raumschiff bewegen und man in einem 2D Spiel vorwärts bewegen
und drehen kann. Das Schiff muss in die Drehung ‘sliden’ wie
ein Auto, das auf Eis fährt. Wie kann man das machen?
A: Benutzen Sie diesen Schnipsel:
starter set_camera()
{
sleep (1); // wait until the level is loaded
camera.x = 0;
camera.y = 0;
camera.z = 1000;
camera.tilt = -90;
}
action asteroids_ship
{
var ship_speed;
while (1)
{
if (key_cuu == on)
{
if (ship_speed.x < 2)
{
ship_speed.x
+= 0.3 * time;
}
}
else
{
if (ship_speed.x >= 0)
{
ship_speed.x
-= 0.05 * time;
}
}
if (ship_speed.x < 0) {ship_speed.x = 0;}
if (key_cul == on)
{
my.pan += 3 * time;
}
if (key_cur == on)
{
my.pan -= 3 * time;
}
ent_move (ship_speed.x, nullvector);
wait (1);
}
}

F:
Ich verwende den "intelligent music" Schnipsel aus Aum38. Wie
kann ich diese Action mehreren Entities zuweisen, ohne für jede eine
eigene Instanz abzuspielen.
A: Verwenden Sie das folgende
Beispiel: Es spielt “gentle.wav” wenn die Spielfigur
der Entity sich auf 500 qunats nähert, “tense.wav” bei
unter 100 Quants. Bei über 600 Quants wird die Musik ausgeblendet.
action music_trigger
{
// my.invisible = on; // remove the comment when you've chosen the best
position
for the entity
my.passable = on;
while (player == null) {wait (1);}
while (vec_dist (player.x, my.x) > 500) {wait (1);} // play with "500"
music_handle = snd_loop (gentle_wav, 50, 0); // play the "gentle" sound
track
while (vec_dist (player.x, my.x) > 100) {wait (1);} // play with "100"
temp_volume = 50; // put the same value that was used for snd_loop here
while (temp_volume > 5) // decrease the volume slowly
{
snd_tune (music_handle, temp_volume, 0, 0);
temp_volume -= 1 * time;
wait (1);
}
snd_stop (music_handle); // stop "gentle.wav";
music_handle = snd_loop (tense_wav, 50, 0); // play the "tense" sound
track
while (vec_dist (player.x, my.x) < 600) {wait (1);} // play with "600"
temp_volume = 50;
while (temp_volume > 5) // decrease the volume slowly
{
snd_tune (music_handle, temp_volume, 0, 0);
temp_volume -= 1 * time;
wait (1);
}
snd_stop (music_handle); // stop "tense.wav";
}
F: Kann
man einen Tastenklick Sound währen der inkey Eingabe oder muss man dafür
eine eigene Eingabe Funktion schreiben?
A: Alle key_... Funktionen (auch
key_any und on_anykey) sind während er inkey deaktiviert. Mittels
key_pressed und str_cat kann man aber eine eigene simple Eingabe
Funktion schreiben.