Fragen aus dem Forum

Top  Previous  Next

F: Ich verwende den Tür-Code aus AUM 33 und er funktioniert auch wunderbar. Was muss ich ändern, damit die Tür sich nach oben bewegt?

A: Hier ist eine verbesserte Verion:

 

//////////////////////////////////////////////////////////////////////////////////

// place dialsmall.pcx in your level and attach it the "dial_small" action

// place a door in your level and attach it the "new_door" action

//////////////////////////////////////////////////////////////////////////////////

 

bmap dialpad_pcx = <dialpad.pcx>;

 

bmap one_pcx = <one.pcx>;

bmap two_pcx = <two.pcx>;

bmap three_pcx = <three.pcx>;

bmap four_pcx = <four.pcx>;

bmap five_pcx = <five.pcx>;

bmap six_pcx = <six.pcx>;

bmap seven_pcx = <seven.pcx>;

bmap eight_pcx = <eight.pcx>;

bmap nine_pcx = <nine.pcx>;

bmap zero_pcx = <zero.pcx>;

bmap asterisk_pcx = <asterisk.pcx>;

 

var number_of_digits;

 

string password_str = "6239"; // our password

string guess_str = "    ";

string temp_str;

 

entity* locked_door;

 

sound dial_wav = <dial.wav>;

sound error_wav = <error.wav>;

sound success_wav = <success.wav>;

 

function check_code(button);

function show_dialpad();

 

panel dialpad_pan

{

       bmap = dialpad_pcx;

       pos_x = 0;

       pos_y = 0;

       layer = 10;

       button = 143, 8, one_pcx, one_pcx, one_pcx, check_code, null, null;

       button = 270, 8, two_pcx, two_pcx, two_pcx, check_code, null, null;

       button = 398, 8, three_pcx, three_pcx, three_pcx, check_code, null, null;

       button = 143, 128, four_pcx, four_pcx, four_pcx, check_code, null, null;

       button = 272, 128, five_pcx, five_pcx, five_pcx, check_code, null, null;

       button = 397, 129, six_pcx, six_pcx, six_pcx, check_code, null, null;

       button = 144, 248, seven_pcx, seven_pcx, seven_pcx, check_code, null, null;

       button = 273, 249, eight_pcx, eight_pcx, eight_pcx, check_code, null, null;

       button = 397, 250, nine_pcx, nine_pcx, nine_pcx, check_code, null, null;

       button = 146, 368, zero_pcx, zero_pcx, zero_pcx, check_code, null, null;

       button = 272, 370, asterisk_pcx, asterisk_pcx, asterisk_pcx, check_code, null, null;

       flags = overlay, refresh;

}

 

action dial_small

{

       my.ambient = -40;

       my.oriented = on;

       my.passable = on;

       my.enable_click = on;

       my.event = show_dialpad;

}

 

function show_dialpad()

{

       number_of_digits = 0;

       str_cpy (guess_str, ""); // reset the string

       dialpad_pan.visible = on;

}

 

action new_door

{

       locked_door = me;

}

 

function check_code(button)

{

       number_of_digits += 1;

       snd_play (dial_wav, 30, 0);

       if (button <= 10) // pressed one of the 1...0 buttons?

       {

               str_for_num(temp_str, button); // convert the button number to a string

               if (str_len(temp_str) == 2) // the player has pressed 0 (10, in fact)

               {

                       str_clip(temp_str, 1); // so we remove the first character ("10" turns into "0")

               }

               str_cat(guess_str, temp_str); // add the resulting string to guess_str

       }

       if ((button == 11) || (number_of_digits > 4))

       {

               while (mouse_left == 1) {wait (1);}

               sleep (0.5);

               snd_play (error_wav, 70, 0);

               dialpad_pan.visible = off;

       }

}

 

starter compare_strings()

{

       while (1)

       {

               if (str_cmp (password_str, guess_str) == 1)

               {

                       str_cpy (guess_str, ""); // reset the string, don't allow the "if" branch to run several times

                       snd_play (success_wav, 20, 0);

                       dialpad_pan.visible = off;

                       while (locked_door.z < 150) // play with 150

                       {        

                            locked_door.z += 2 * time; // 2 = speed

                               wait (1);

                       }

                       locked_door.z = 150; // play with 150

               }

               wait (1);

       }

}

 

 

F: Ich möchte die “Exequte”-Funktion aus AUM 37 einer anklickbaren Entity zuweisen. Wie mache ich das?

A: Hier ist ein Beispiel:

 

var success = 0;

 

dllfunction Exequte(x);

 

function buy_now();

 

text error_txt

{

       pos_x = 200;

       pos_y = 200;

       layer = 30;

       font = _a4font;

       string = "Error while trying to run the command!";

}

 

function buy_now()

{

       success = Exequte("C:\\Program Files\\Internet Explorer\\iexplore.exe www.randombyte.com");

       if (success <= 31) // WinExec failed?

       {

               error_txt.visible = on; // show an error message

       }

       dll_close (dll_handle);

}

 

action clickable_entity

{

   my.enable_click = on; // the entity is sensitive to clicking

   my.event = buy_now;

}

 

 

F: Ich benutze Ihren Kameracode aus den Fragen aus AUM 2. Wenn sich der Spieler dreht, kommt die Kamera mit der gleichen Geschwindigkeit hinterher, ich möchte diese aber verlangsamen. Können Sie helfen?

A: Hier ist ein Beispiel:

 

var camera_dist = 300; // play with this value

 

view topview // set for 800x600 pixels

{

       pos_x = 0;

       pos_y = 0;

       size_x = 800;

       size_y = 600;

       layer = 25;

       flags = visible;

}

 

starter top_view

{

       camera.visible = off; // disable the default view

       while (player == null) {wait (1);}

       topview.tilt = -90; // look down

       while (1)

       {

               vec_set (topview.x, player.x);

               topview.z += camera_dist;

               topview.pan -= ang(topview.pan - player.pan) * 0.1 * time; // 0.1 = turning speed

               wait (1);

       }

}

 

 

F: Wenn ich mein Spiel starten möchte, bleibt der Splashscreen sichtbar und das Spiel startet nicht.

A: In Ihrem Skript ist ein Fehler, der verhindert, dass es weitergeht. Deaktivieren Sie den Splashscreen vorübergehend (kommentieren Sie die Zeile “splashscreen_panel.visible = on;” einfach aus) bis Sie den Fehler finden und beheben können.

 

 

F: Das “Serious Grass” Skript aus AUM 50 ist großartig, aber ist es auch möglich, es als Action einer Entity zuzuordnen? Ich möchte diese Entity die Grasmodels zufällig erstellen lassen, wenn der Spieler in die Nähe kommt.

A: Benutzen Sie diesen Code:

 

// make sure to have a big nexus value set (nexus > 50 for 500 grass models, and so on)

var number_of_bushes = 0; // counts the number of grass models that are placed in the level

 

string grass1_mdl = <grass1.mdl>;

string grass2_mdl = <grass2.mdl>;

 

function place_grass();

 

action grass_generator

{

       while (player == null) {wait (1);} // wait until the player is created

       while (vec_dist (player.x, my.x) > 500) {wait (1);} // wait until the player has come closer than 500 quants

       while (number_of_bushes < 500) // create 500 models around the grass_generator entity

       {

               vec_set (temp.x, my.x);

               temp.x += 500 - random(1000);

               vec_set (temp.y, my.y);

               temp.y += 500 - random(1000);

               temp.z = my.z + 200;

               if (random(1) > 0.1)

               {

                       ent_create (grass1_mdl, temp.x, place_grass);

               }

               else

               {

                       ent_create (grass2_mdl, temp.x, place_grass);

               }

               number_of_bushes += 1;

       }

}

 

function place_grass()

{

       my.passable = on;

       my.transparent = on;

       my.pan = random(360);

       vec_set (temp, my.pos);

       temp.z -= 3000;

       trace_mode = ignore_me + ignore_sprites + ignore_models + use_box;

       my.z -= trace (my.pos, temp); // place the grass model on the ground

}

 

 

F: Ich habe eine Frage zum Spiel “Thanks” aus AUM 21. Wie kann ich eine Rakete schießen, obwohl schon eine im Level ist?

A: Ich habe das Skript modifiziert:

 

var video_mode = 7; // 800x600

var video_depth = 16; // 16 bit mode

var rocket_coords;

var player_speed;

var erocket_speed; // rocket speed -> enemy rocket

var turret_offset;

var barrel_offset;

var enemy_speed;

var fall_speed = 0.9;

var engine_handle = 0; // sound handle for the tank

var turret_handle = 0; // sound handle for the turret

 

sound tank_snd = <tankrun.wav>;

sound tankexplo_snd = <tankexplo.wav>;

sound turret_snd = <turret.wav>;

sound tankrocket_snd = <tankrocket.wav>;

sound beep_sound = <beep.wav>;

 

bmap tanksmoke_pcx = <tanksmoke.pcx>;

 

string level1_wmb = <level1.wmb>;

string challenger_turret = <chturret.mdl>;

string challenger_barrel = <chbarrel.mdl>;

string tank_rocket = <tankrock.mdl>;

string explosion_pcx = <explo+6.pcx>;

 

define shield skill20;

 

function attach_player_barrel();

function attach_player_turret();

function player_rocket();

function explode_rocket();

function tank_damaged();

function animate_explosion();

function tank_smoke();

function fade_smoke();

function enemy_rocket();

 

function main()

{

       clip_size = 0; // show all the triangles for all the models

       on_d = null; // disable the standard "debug" key

       level_load (level1_wmb);

}        

 

function attach_player_barrel()

{

       proc_late(); // prevent shaking

       my.passable = on;

       my.metal = on;

       while(you) // as long as the creator exists

       {

               vec_set(my.x,you.x);

               my.pan = you.pan + turret_offset;

               my.tilt = you.tilt + barrel_offset;

                 my.frame = you.frame;

                 my.next_frame = you.next_frame;

               vec_for_vertex(rocket_coords, my, 33); // vertex for player's rocket

               if (mouse_left == on && player.shield > 0)

               // if we press the LMB and the tank isn't destroyed

               {

                       while (mouse_left == on) {wait (1);}

                       ent_create (tank_rocket, rocket_coords, player_rocket);

                       snd_play (tankrocket_snd, 100, 0);

               }

                 wait(1);

       }

       ent_remove(my);

}

 

function attach_player_turret()

{

       proc_late(); // prevent shaking

       my.passable = on;

       my.metal = on;

       while(you) // as long as the creator exists

       {

               vec_set(my.x, you.x);

               my.pan = you.pan + turret_offset;

                 my.frame = you.frame;

                 my.next_frame = you.next_frame;

                 wait(1);

       }

       ent_remove(my);

}

 

action player_tank

{

       player = me;

       my.enable_impact = on;

       my.enable_entity = on;

       my.event = tank_damaged;

       ent_create(challenger_turret, nullvector, attach_player_turret);

       ent_create(challenger_barrel, nullvector, attach_player_barrel);

       my.shield = 250; // 250 shield points for player's tank

       while (my.shield > 0) // the 10th hit will destroy player's tank

       {

               camera.pan = my.pan;

               camera.x = my.x - 500 * cos (my.pan); // the camera is placed 500 quants behind the tank

               camera.y = my.y - 500 * sin (my.pan);

               camera.z = my.z + 300; // and 300 quants above the tank

               camera.tilt = -20; // the camera looks down

               if (mouse_force.x != 0) // if we move the mouse on x

               {

                       if (turret_handle == 0)

                       {

                               turret_handle = snd_play (turret_snd, 70, 0);        

                       }

                       turret_offset -= 2 * mouse_force.x * time;

               }

               else

               {

                       turret_handle = 0;

               }

               if (mouse_force.y != 0) // if we move the mouse on y

               {

                       barrel_offset += 2 * mouse_force.y * time;

               }

               if (player_speed.x != 0) // if we are moving the tank

               {

                       my.pan -= 0.1 * (key_d - key_a) * player_speed.x * time;

                       if (engine_handle == 0) // if the engine sound isn't playing

                       {

                               engine_handle = snd_loop (tank_snd, 50, 0);

                               snd_tune (engine_handle, 25, 100, 0); // play the sound at its original frequency (100%)

                               my.skill10 = 100;

                       }

               }

               else

               {

                       my.skill10 -= 5 * time; // decrease the frequency

                       snd_tune (engine_handle, 25, my.skill10, 0); // using snd_tune

                       if (my.skill10 < 20) // if we go below 20% of the original frequency

                       {

                               snd_stop (engine_handle); // stop the engine sound

                               engine_handle = 0;

                       }

               }

               player_speed.x = 1.5 * (key_w - key_s) * time + max (1 - time * 0.15, 0) * player_speed.x;

               player_speed.y = 0;

               player_speed.z = 0;

               move_mode = ignore_you + ignore_passable;        

               ent_move(player_speed, nullvector);

               wait (1);

       }

}        

       

function player_rocket()

{

       var procket_speed; // rocket speed -> player's rocket

       wait (1);

       my.skill40 = 1; // it is a rocket

       my.pan = you.pan;

       my.tilt = you.tilt;

       my.enable_impact = on;

       my.enable_block = on;

       my.enable_entity = on;

       my.event = explode_rocket;

       my.skill5 = 0; // used for vertical movement

       procket_speed.x = 100;

       procket_speed.y = 0;

       procket_speed.z = 0;

       procket_speed *= time;

       while (my != null)

       {

               my.skill5 += time;

               if (my.skill5 > 20)

               {

                       procket_speed.z -= fall_speed * time;

               }

               move_mode = ignore_you + ignore_passable; // ignores the barrel -> can't collide with it

               ent_move (procket_speed, nullvector);

               wait (1);

       }

}

 

function explode_rocket()

{

       wait (1);

       exclusive_global;

       // the following piece of code replaces A5's ent_playsound with a linear function

       my.skill10 = vec_dist (player.x, my.x);

       if (my.skill10 < 1000) {my.skill10 = 1000;} // all sounds below 1000 quants will be played with maximal volume

       my.skill10 = 100000 / my.skill10; // bigger distance -> lower volume;

       snd_play (tankexplo_snd, my.skill10, 0);

       vec_set (temp, my.pos);

       temp.z += 50; // create the explosion sprite a little higher

       ent_create(explosion_pcx, temp, animate_explosion);

       ent_remove (me);

}

 

function animate_explosion()

{

       wait (1);

       my.passable = on;

       my.ambient = 100;

       while (my.frame < 7)

       {

               my.frame += 1 * time;

               wait (1);

       }

       ent_remove (me);

}

 

function tank_damaged()

{

       if (you.skill40 != 1) {return;} // it wasn't hit by a rocket (maybe the 2 tanks collided)

       wait (1);

       my.shield -= 25;

       if (my.shield <= 0) // player's tank was hit 10 times or the enemy tank was hit twice

       {

               while (1)

               {

                       effect (tank_smoke, 5, my.pos, normal);

                       sleep (0.2);

               }

       }

}

 

function tank_smoke()

{

       temp.x = random(2) - 1;

       temp.y = random(2) - 1;

       temp.z = random(2) + 1;

       vec_add (my.vel_x, temp);

       my.alpha = 30 + random(30);

       my.bmap = tanksmoke_pcx;

       my.size = 100;        

       my.flare = on;

       my.move = on;

       my.lifespan = 100;

       my.function = fade_smoke;

}

 

function fade_smoke()

{

       my.alpha -= 0.5 * time;

       if (my.alpha < 0)

       {

               my.lifespan = 0;

       }

}

 

// enemy - related stuff from here on

action enemy_tank

{

       while (player == null) {wait (1);}

       my.ambient -= 30; // make the skin darker - it is too bright imho

       my.enable_impact = on;

       my.enable_entity = on;

       my.event = tank_damaged;

       my.shield = 50; // 2 rockets will destroy the enemy tank

       while (my.shield > 0)

       {

               vec_set (temp.x, player.x);

               vec_sub (temp.x, my.x);

               vec_to_angle (my.skill4, temp); // turn towards the player        

               my.skill5 = 0; // tilt = 0

               if (abs(my.skill4 - my.pan) < 1)

               {

                       vec_for_vertex(my.skill1, my, 41); // vertex for the enemy rocket

                       ent_create (tank_rocket, my.skill1, enemy_rocket);

                       sleep (3);

               }

               else

               {

                       my.pan += ang(my.skill4 - my.pan) * 0.03 * time; // smooth rotation code

                       enemy_speed.x = 5 * time;

                       enemy_speed.y = 0;

                       enemy_speed.z = 0;

                       move_mode = ignore_you + ignore_passable;        

                       ent_move(enemy_speed, nullvector);

               }                

               wait (1);

       }

}

 

function enemy_rocket()

{

       wait (1);

       my.skill40 = 1; // it is a rocket

       my.pan = you.pan;

       my.tilt = you.tilt;

       my.enable_impact = on;

       my.enable_block = on;

       my.enable_entity = on;

       my.event = explode_rocket;

       erocket_speed.x = 100;

       erocket_speed.y = 0;

       erocket_speed.z = 0;

       erocket_speed *= time;

       while (my != null)

       {

               move_mode = ignore_you + ignore_passable; // ignores the barrel -> can't collide with it

               ent_move (erocket_speed, nullvector);

               wait (1);

       }

}

 

 

F: Ich habe eine große Skybox, weil ich gern detailreich arbeite, aber habe festgestellt, dass diese viel Speicher benötigt. Wie kann ich einen detaillierten Horizont haben und das Spiel dennoch spielbar gestalten?

A: Tga Dateien benötigen x * y * 3 Bytes Speicher, wo x die Breite und y die Höhe des Bildes ist. Wenn Ihr Horizont zum Beispiel 3072 x 512 Pixel misst, wird es 3072 x 512 x 3 = 4,5 MB Videospeicher belegen. Wenn Sie bmp oder pcx Dateien benutzen, brauchen Sie nur x * y * 2 Bytes, so dass der gleiche Horizont nur noch 3 MB benötigt.

 

 

F: Kann ich die Bewegung einer Entity auf einem Panel anzeigen?

A: Hier ist eine verbesserte Version des Radars aus AUM 9; lesen Sie bitte den Artikel, bevor Sie den Code verwenden:

 

var level_minx = -1800; // get these values in wed (level boundaries in quants)

var level_maxx = 1800;

var level_miny = -1500;

var level_maxy = 1500;

var scalex = 0.035; // play with these values until you get a good map coverage for the player

var scaley = 0.036;

var scanning_range = 0;

 

function appear_on_radar();

 

bmap radar_map = <radarpan.pcx>;

 

panel radar_pan

{

       bmap = radar_map;

       layer = 20;        

       pos_x = 0;

       pos_y = 0;

       flags = overlay, refresh, d3d, visible;

}

 

starter start_scanning

{

       while (player == null) {wait (1);}

       scanning_range.x = 360; // pan

       scanning_range.y = 180; // tilt

       scanning_range.z = 5000; // radar's range

       while (1)

       {

               scan_entity (player.x, scanning_range.x);

               wait (1);

       }

}

 

action test_entity // this action will be attached to your enemies

{

       my.enable_scan = on;

       my.event = appear_on_radar;

       // put the rest of the code for your enemies here, remove the test loop from below

       while (1)

       {

               my.x += 3 - random(6); // show some activity on the radar

               my.y += 3 - random(6); // to be used only during the test phase

               wait (1);

       }

}

 

function appear_on_radar()

{

       if (event_type == event_scan)

       {

               draw_text( "*", scalex * (abs(my.x - level_maxx)), scaley * (abs(my.y - level_miny)), vector(0, 0, 255));

       }

}

 

 

F: Wie kann ich mit “bounce” ein abprallendes Objekt ausrichten?

A: Sehen Sie sich mein winziges Beispiel an:

 

function ball_event()

{

       vec_to_angle (my.pan, bounce);

}

 

action bouncing_ball

{

       randomize();

       my.pan = random(360);

       my.enable_block = on;

       my.enable_impact = on;

       my.enable_entity = on;

       my.event = ball_event;

       while(1)

       {

               c_move (my, vector(10 * time, 0, 0), nullvector, ignore_passable);

               wait(1);

       }

}

 

 

F: Hat jemand ein Code für Schiebetüren, die ich in meiner Nicht-Template WDL nutzen kann? Ich möchte verschiedene Türen mit der Leertaste öffnen können.

A: Hier ist ein Beispiel:

 

action sliding_door

{

       while (player == null) {wait (1);} // wait until the player is created

       while (1)

       {

               if (vec_dist (player.x, my.x) < 100) // the player has come close to the door

               {

                       // if the player presses "space" and the door hasn't been opened yet

                       if ((key_space == on) && (my.skill2 == 0))

                       {

                               my.skill2 = 1;

                               while (my.z < 200) // play with this value

                               {

                                       my.z += 5 * time;

                                       wait (1);

                               }

                               break;

                       }

               }

               wait (1);

       }

}