F: Die Panzer aus AUM 21 reagieren nicht auf Schwerkraft und wenn sie einmal in der Luft sind, fallen sie nicht mehr herunter. Der Code wurde für A5 geschrieben und ich versuche es jetzt mit A6, können Sie helfen?
A: Benutzen Sie dieses Projekt aus der FAQ von AUM 36 als Grundlage; es beinhaltet Gravitation ebenso wie eine Anpassung des Fahrzeugs an Schrägen. Das modifizierte Projekt kann hier heruntergeladen werden.

  

F: Ich habe mich gefragt, ob Sie mir zeigen können wie man eine rotierende Kamera programmiert? Angenommen man ist in einem Raum und drückt “s”, um die Rotation der Kamera zu starten und wenn erneut “s” gedrückt wird, stoppt sie.
A: Nutzen Sie den Code unten:

var camera_mode = 0;
var rotation_speed = 1.5;

view rotating_camera{}

starter set_camera()
{
   sleep (1); // wait a bit more
   rotating_camera.pos_x = 0;
   rotating_camera.pos_y = 0;
   rotating_camera.size_x = screen_size.x;
   rotating_camera.size_y = screen_size.y;
}

function switch_cameras()
{
   if (player == null) {return;}
   camera_mode += 1;
   if (camera_mode %2 == 1) // rotating camera?
   {
      rotating_camera.x = player.x;
      rotating_camera.y = player.y;
      rotating_camera.z = player.z;
      rotating_camera.pan = player.pan;
      rotating_camera.tilt = player.tilt;
      rotating_camera.roll = player.roll;
      rotating_camera.visible = on;
      camera.visible = off;
      while (camera_mode % 2 == 1)
      {
         rotating_camera.pan += rotation_speed * time;
         wait (1);
      }
   }
   else
  {
     rotating_camera.visible = off;
     camera.visible = on;
   }
}

on_s = switch_cameras;

 

F: Ich brauche einen Trampolincode. Ich habe Entities im Level plaziert und wenn der Spieler darüber läuft, möchte ich, dass er einige Quants nach oben beschleunigt wird. Dabei sollte auch ein Geräusch ertönen.
A: Klicken Sie hier, um den Code für mein altes “Maniac Miner”-Projekt für AUM 3 herunterzuladen, das nun auch Trampoline beinhaltet.

 

F: Ich möchte exakt herausfinden, wo eine Kugel eine Entity getroffen hat. Wie bestimme ich den nächsten Vertex des Models?
A: Mit diesem Code:

action enemy // attach this action to your enemy model
{
my.enable_impact = on;
my.enable_shoot = on;
my.enable_entity = on;
my.event = compute_shot_pos;
}

function compute_shot_pos()
{
   var temp_vertex = 0;
   var hit_vertex = 0;
   var index = 1;
   var temp_dist = 0;
   var min_dist = 10000; // set to a big value on purpose
   vec_set(bullet_pos, you.pos); // store bullet's coords before they get lost (before the bullet disappears)
   my.event = null; // don't react to other bullets from now on
   wait (1); // now we can wait for a frame
   while (index < ent_vertices(my)) // get the number of vertices
   {
      vec_for_vertex (temp_vertex, my, index); // store the coordinates of the current vertex in temp_vertex
      temp_dist = vec_dist(bullet_pos.x, temp_vertex.x); // compute the distance from the vertex to the impact coordinates
      if (temp_dist < min_dist) // if we have got a tiny value
      {
         min_dist = temp_dist; // then this will be the closest vertex, at least for now
         hit_vertex = index; // and we store the index
      }
      index += 1; // check the next vertex
   }
   my.event = compute_shot_pos; // the loop has ended, start reacting to other bullets from now on
   // hit_vertex contains the closest vertex number now
}

 

F: Ich hätte gern ein Panel, das durch Klick auf ein kleines “x” in der oberen rechte Ecke ausgeblendet wird. Ist das möglich?
A: Sicher. Mit diesem Code:

bmap mypanel_pcx = <mypanel.pcx>;

function close_panel;

panel mypanel_pan
{
   bmap = mypanel_pcx;
   layer = 20;
   pos_x = 250;
   pos_y = 50;
   flags = overlay, refresh, visible;
   on_click = close_panel;
}

function close_panel()
{
   if ((pointer.x > mypanel_pan.pos_x + bmap_width(mypanel_pcx) - 10) && (pointer.y < mypanel_pan.pos_y + 10)) // the "X" has 10x10 pixels
   {
      mypanel_pan.visible = off;
   }
}

 


F: Wie kann ich einen Kegel aus Partikeln erzeugen?
A: Nutzen Sie diesen Code:

bmap effect_tga = <effect.tga>;

function particle_cone();
function fade_particles();

action cone
{
   my.invisible = on;
   my.passable = on;
   while(1)
   {
      effect(particle_cone, 20 * time, my.x, nullvector);
      wait(1);
   }
}

function particle_cone()
{
   temp.x = random(10) - 5;
   temp.y = random(10) - 5;
   temp.z = random(5) + 5;
   vec_set(my.vel_x,temp);
   my.bmap = effect_tga;
   my.size = 2.5;
   my.flare = on;
   my.bright = on;
   my.move = on;
   my.streak = on; // if your engine version supports it
   my.alpha = 80;
   my.lifespan = 50;
   my.function = fade_particles;
}

function fade_particles()
{
   my.alpha -= 2 * time;
   if(my.alpha < 0) // not really needed
   {
      my.lifespan = 0;
   }
}

 

F: Wie kann ich eine View weich in eine andere überblenden?
A: Hier ist der Code:

view second_camera{}

action set_second_camera // place any entity in the level and set its proper position and orientation
{
   my.invisible = on;
   my.passable = on;
   wait (3);
   second_camera.pos_x = 0;
   second_camera.pos_y = 0;
   second_camera.size_x = screen_size.x;
   second_camera.size_y = screen_size.y;
   second_camera.alpha = 0;
   second_camera.transparent = on;
   camera.alpha = 100;
   camera.transparent = on;
   second_camera.x = my.x;
   second_camera.y = my.y;
   second_camera.z = my.z;
   second_camera.pan = my.pan;
   second_camera.tilt = my.tilt;
   second_camera.roll = my.roll;
}

function toggle_cameras()
{
   second_camera.visible = on;
   while (second_camera.alpha < 99)
   {
      second_camera.alpha += 2 * time;
      camera.alpha -= 2 * time;
      wait (1);
   }
   camera.visible = off;
   second_camera.transparent = off;
}

on_t = toggle_cameras;

 

F: Wie kann ich alle Vorkommnisse des Zeichens “a” in einem String durch “b” ersetzen?
A: Hier ist ein Beispiel:

var number_of_characters;
var string_index;

string initial_str;
string replaced_str;
string backup_str;

text tester_txt
{
   layer = 200;
   string = replaced_str;
   flags = visible;
}

function replace_characters()
{
   str_cpy(initial_str, "Mary is an awesome painter");
   number_of_characters = str_len(initial_str);
   string_index = 0;
   str_cpy(replaced_str, "");
   while (string_index < number_of_characters)
   {
      str_cpy (backup_str, initial_str);
      str_clip(backup_str, string_index);
      str_trunc(backup_str, number_of_characters - string_index - 1);
      if (str_cmpi(backup_str, "a") == 1) // found an "a"?
      {
         str_cat(replaced_str, "b"); // replace it with a "b"
      }
      else
      {
         str_cat(replaced_str, backup_str); // keep the current letter
      }
      string_index += 1;
   }
}

on_r = replace_characters;



F: Ich wäre gern in der Lage, Objekte (Bäume) zur Laufzeit zu erzeugen und sie vor dem Spieler zu plazieren. Wie kann ich das tun?
A: Nutzen Sie dieses Beispiel:

string tree_mdl = <tree.mdl>;

function create_tree()
{
   wait (1);
   vec_set (temp.x, my.x);
   temp.z -= 10000;
   trace_mode = ignore_me + ignore_sprites + ignore_models + use_box;
   my.z -= trace (my.pos, temp) + 20;
}

function place_trees()
{
   temp.x = 200; // place the trees 200 quants in front of the player
   temp.y = 0;
   temp.z = 0;
   vec_rotate (temp, player.pan);
   vec_add (temp, player.x);
   ent_create(tree_mdl, temp.x, create_tree); // create the tree
}

on_p = place_trees;