Fragen aus dem Forum

Top  Previous  Next

F. Wie erreiche ich, dass eine Entity sich einer anderen zuwendet, wenn diese in den c_scan Sichtkegel kommt?

A: So geht es.

 

function rotate_now()

{

       vec_set(temp,your.x);

       vec_sub(temp,my.x);

       vec_to_angle(my.pan,temp);

}

 

action towards_player // attach this action to the entities that need to be rotated towards the player

{

       my.ENABLE_SCAN = on;

       my.event = rotate_now;

}

 

action players_code

{

       var anim_percentage;

       var movement_speed;

       var distance_to_ground;

       player = my;

       while (1)

       {

               c_scan(my.x, my.pan, vector(360, 0, 300), SCAN_ENTS | SCAN_LIMIT | IGNORE_ME); // perform the scanning

               camera.x = player.x - 250 * cos(player.pan);

               camera.y = player.y - 250 * sin(player.pan);

               camera.z = player.z + 150;

               camera.pan = player.pan;

               camera.tilt = -20;

               my.pan += 6 * (key_a - key_d) * time_step;

               vec_set (temp, my.x);

               temp.z -= 5000;

               distance_to_ground = c_trace (my.x, temp.x, ignore_me | use_box);

               movement_speed.x = 5 * (key_w - key_s) * time_step;

               movement_speed.y = 0;

               movement_speed.z = - (distance_to_ground - 17); // 17 = experimental value

               movement_speed.z = max (-35 * time_step, movement_speed.z); // 35 = falling speed

               c_move (my, movement_speed.x, nullvector, glide);

               if ((key_w == off) && (key_s == off))

               {

                       ent_animate(my, "stand", anim_percentage, anm_cycle);

               }

               else

               {

                       ent_animate(my, "walk", anim_percentage, anm_cycle);

               }

               anim_percentage += 5 * time_step;

               wait (1);

       }

}

 

 

F: Wie kann ich ein Hintergrundbild aus Panels erstellen, das sich über die Breite des Bildschirms wiederholt?

A: Das nächste Engine Update wird genau dies ermöglichen; stellen Sie einfach enstprechende Werte für size_x und size_y ein.

 

PANEL test_pan =

{

       bmap = "art05.bmp";

       pos_x = 0;

       pos_y = 344;

       size_x = 800; // the game is running at a resolution of 800x600 pixels

       flags =  VISIBLE;

}

 

aum64_faq1

 

 

F: Ich habe versucht, eine Lichtquelle zu erstellen, die langsam ihre Stärke ändert, aber verschiedene Lightrange Werte funktionierten nicht gut. Gibt es eine andere Methode?

A: Sie könnten die RGB-Werte ändern; hier ist ein Beispiel mit einem Slider.

 

var my_value;

 

PANEL light_pan =

{

       bmap = "light.pcx";

       pos_x = 0;    

       pos_y = 0;   

       vslider (16, 71, 90, "slider.pcx", 0, 255, my_value);

       digits (15, 50, 3, _a4font, 1, my_value);

       flags = OVERLAY | VISIBLE;

}

 

action dynamic_light // place an entity in the level and attach it this action

{

       my.lightrange = 400; // use your own value here

       while (1)

       {

               my.red = my_value;

               my.green = my_value;

               my.blue = my_value;

               wait (1);

       }

}

 

 

F: Ich möchte ein Model für 10 Sekunden mit "walk" animieren, dann 10 Sekunden "jump" und wieder 10 Sekunden "walk" und so weiter. Wie geht das?

A: Verwenden Sie das folgende Beispiel.

 

action two_animations()

{

       var anim_speed;

       while (1)

       {

               my.skill88 = 0;

               while (my.skill88 < 10) // play this animation for 10 seconds

               {

                       my.skill88 += time_step / 16;

                       anim_speed += 2 * time_step; // 2 = walk animation speed

                       ent_animate(my, "walk", anim_speed, ANM_CYCLE);

                       wait (1);

               }

               my.skill88 = 0;

               while (my.skill88 < 10) // play this animation for 10 seconds

               {

                       my.skill88 += time_step / 16;

                       anim_speed += 3 * time_step; // 3 = jump animation speed

                       ent_animate(my, "jump", anim_speed, ANM_CYCLE);

                       wait (1);

               }

               wait (1);

       }

}

 

 

F: Ich hätte gern einen zufälligen Soundtrack in meinem Spiel.

A: Nutzen Sie das folgende Beispiel als Grundlage.

 

var track_number;

var track_handle;

 

function random_tracks_startup()

{

       while (1)

       {

               track_number = 1 + total_frames % 5; // use 5 sound tracks in this example

               if (track_number == 1)

               {

                       track_handle = media_play("track1.wav", NULL, 50);

               }

               if (track_number == 2)

               {

                       track_handle = media_play("track2.wav", NULL, 50);

               }

               if (track_number == 3)

               {

                       track_handle = media_play("track3.wav", NULL, 50);

               }

               if (track_number == 4)

               {

                       track_handle = media_play("track4.wav", NULL, 50);

               }

               if (track_number == 5)

               {

                       track_handle = media_play("track5.wav", NULL, 50);

               }

               while (media_playing (track_handle)) {wait (1);} // wait until the current track has ended

       }

}

 

 

F: Ich habe einen Geschützturm auf einem Fahrzeug. Der Turm muss sich mit dem Fahrzeug bewegen, aber andere Objekte anvisieren, wenn ich die Maus bewege. Wie kann ich das erreichen?

A: Hier ist ein Beispiel.

 

var weapon_offset;

 

STRING weapon_mdl = "weapon.mdl";

 

function attach_weapon()

{

       proc_late(); // prevent shaking

       my.passable = on;

       while(you)

       {

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

               {

                       weapon_offset -= 2 * mouse_force.x * time_step;

               }

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

               {

                       weapon_offset += 2 * mouse_force.y * time_step;

               }

               vec_set(my.x, you.x);

               my.pan = you.pan + weapon_offset;

                 my.frame = you.frame;

                 my.next_frame = you.next_frame;

                 wait(1);

       }

       ent_remove(my);

}

 

action players_vehicle

{

       player = my;

       ent_create(weapon_mdl, NULLVECTOR, attach_weapon);

       while (1)

       {

               // put your car movement code here

               wait (1);

       }

}

 

 

F: Ich habe eine Kiste und möchte sie auf realistische Weise über eine Kante schieben. Ist das möglich?

A: Hier ist ein Beispiel mit dem Template Code für den Spieler und einer Physik-Engine animierten Kiste - realistischer geht es nicht!

 

var kick_speed;

 

action physics_box

{

       ph_setgravity (vector(0, 0, -386));

       my.shadow = on;

       phent_settype (my, ph_rigid, ph_box);

       phent_setmass (my, 20, ph_box);

       phent_setfriction (my, 50);

       phent_setdamping (my, 50, 50);

       phent_setelasticity (my, 30, 30);

       while (!plBiped01_entity) {wait (1);} // make sure to use your own player pointer name everywhere in this action

       while (1)

       {

               kick_speed.x = 25; // kick speed

               kick_speed.y = 0;

               kick_speed.z = 5; // make it jump up a bit as well

               vec_rotate(kick_speed, plBiped01_entity.pan); // kick it depending on player's angle

               if (vec_dist (plBiped01_entity.x, my.x) < 70) // 70 is the distance that triggers the kicking

               {

                       phent_addvelcentral(my, kick_speed); // kick the box

               }

               wait (1);

       }

}

 

 

F: Ist es möglich, mehrere Linien von der momentanen Mausposition zu einem bestimmten Punkt zu ziehen, solange die linke Maustaste gedrückt ist?

A: Sicher! Verwenden Sie den folgenden Code, drücken Sie die linke Maustaste und halten Sie diese gedrückt, während Sie die Maus bewegen.

 

function draw_lines(x1, y1, x2, y2)

{

       while(1)

       {

               draw_line(vector(x1, y1, 0), NULL, 100);

               draw_line(vector(x2, y2, 0), vector(250, 250, 250), 100);

               wait(1);

       }

}

 

function draw_startup()

{

       var mouse_temp;

       while(1)

       {

               mouse_temp.x = mouse_pos.x;

               mouse_temp.y = mouse_pos.y;

               while (mouse_left)

               {

                       draw_lines(mouse_temp.x, mouse_temp.y, mouse_pos.x, mouse_pos.y);

                       wait (1);

               }

               wait (1);

       }

}

 

aum64_faq2

 

 

F: Wenn ixch versuche, das Level mit level_load zu wechseln, erhalte ich die Fehlermeldung "Can't save/load in same frame". Kann mir jemand helfen?

A: Sie benutzen level_load in einer Schleife oder die Anweisung wird mehrfach ausgelöst, z.B. durch eine Eventfunktion.

 

function old_loading()

{

       .................

       level_load ("newlevel.wmb");

       .................

}

 

Versuchen Sie Folgendes, um dem Problem Herr zu werden:

 

var just_once = 0;

 

function new_loading() // use this function

{

       .................

       if (just_once == 0)

       {

               just_once = 1;

               level_load ("newlevel.wmb");

       }

       .................

}

 

 

F: Ich muss feststellen, welche meiner Feinde dem Spieler am nächsten sind.

A: Der folgende Ausschnitt nutzt c_scan, um ein Sprite über dem Kopf des nächsten Feindes zu plazieren.

 

function entity_marker()

{

       my.PASSABLE = on;

       wait (1);

       ent_remove (my);

}

 

function player_scanning()

{

       while (1)

       {

               c_scan(my.x, my.pan, vector(360, 0, 500), SCAN_ENTS | SCAN_LIMIT | IGNORE_ME);

               if (you)

               {

                       ent_create ("marker.pcx", vector (you.x, you.y, you.z + 60), entity_marker);

               }

               wait (1);

       }

}

 

function beeper()

{

       wait (1); // this would be your enemies' event function

}

 

action sensitive_enemies // attach this action to your enemies

{

       my.ENABLE_SCAN = on;

       my.event = beeper;

       // the rest of the code for your enemies goes here

}

 

action players_code // sample player code, just call player_scanning(); from within your player's action

{

       player_scanning(); // this is how you would call the function that does the scanning

       var anim_percentage;

       var movement_speed;

       var distance_to_ground;

       player = my;

       while (1)

       {

               camera.x = player.x - 250 * cos(player.pan);

               camera.y = player.y - 250 * sin(player.pan);

               camera.z = player.z + 150;

               camera.pan = player.pan;

               camera.tilt = -20;

               my.pan += 6 * (key_a - key_d) * time_step;

               vec_set (temp, my.x);

               temp.z -= 5000;

               distance_to_ground = c_trace (my.x, temp.x, ignore_me | use_box);

               movement_speed.x = 5 * (key_w - key_s) * time_step;

               movement_speed.y = 0;

               movement_speed.z = - (distance_to_ground - 17); // 17 = experimental value

               movement_speed.z = max (-35 * time_step, movement_speed.z); // 35 = falling speed

               c_move (my, movement_speed.x, nullvector, glide);

               if ((key_w == off) && (key_s == off))

               {

                       ent_animate(my, "stand", anim_percentage, anm_cycle);

               }

               else // the player is moving?

               {

                       ent_animate(my, "walk", anim_percentage, anm_cycle);

               }

               anim_percentage += 5 * time_step; // 5 = animation speed

               wait (1);

       }

}