Code-Schnipsel           
      

                Invaders schlagen wieder zu   

A4 beinhaltet auch ein starkes Engine 2D. Ich habe ein Demo eines einfachen Spieles kreiert, vom Typ Invaders, indem ich dieses 2D Engine benutzt habe. Das ganze Projekt steht zur Verfügung zum downloaden; Kopiert den Folder Invaders in das Innere des Folders in den ihr 3DGS installiert habt.  

PANEL ship_pan  {  
     BMAP ship_map;  
     LAYER 11;  
     POS_X 320;  
     POS_Y 400; // Er wird an der Basis des Bildschirms erscheinen  
     FLAGS OVERLAY, REFRESH;  
}  

Wir definieren ship wie ein panel, wir set-up noch nicht den flag VISIBLE. Auf dieselbe Weise gehen wir vor, wenn wir enemy, rocket (die Kugel des Players) und fractal (die Kugel des Feindes) definieren.

function main()  
{  
      LOAD_LEVEL <invaders.wmb>;  
      WAITT 16;  
      CAMERA.PAN = 0; // Verändert diese Werte um andere Positionen zu erreichen 
      CAMERA.TILT = 285;  
      CAMERA.X = -60;  
      CAMERA.Y = -170;  
      CAMERA.Z = -420;  

      restart (); // Initialisiert das Spiel
      move_ship ();  
      move_enemy ();  
      move_rocket ();  
      move_fractal ();  
      set_collisions ();  
}  

WAITT 16 wartet auf das laden des Niveaus; andernfalls können wir die Position und die Winkel des Raumes nicht set-up. Wir fügen den Himmel hinzu, aus einem einfachen wmb, welcher rotiert, indem wir ent_rotate aus template benutzen.

function move_ship ()  
{  
      WHILE (1)  
      {  
            IF (KEY_CUL == ON && ship_pan.POS_X > 40)  
           {  
                ship_pan.POS_X -= 2;  
           }  
           IF (KEY_CUR == ON && ship_pan.POS_X < 600)  
          {  
                ship_pan.POS_X += 2;   }  
                WAITT 1;  
          }  
}  

Wenn wir den  Pfeil von links drücken und POS_X von ship ist größer als 40, bewegen wir ship nach links; genauso gehen wir vor, wenn wir den Pfeil rechts drücken, und POS_X ist kleiner als 600.
  
function move_enemy ()  
{  
      WHILE (1)  
      {  
            IF (enemy_pan.POS_X > 40 && enemy_flag == 1)  
            {  
                   enemy_pan.POS_X -= 1;  
            }  
            ELSE  
            {  
                   enemy_flag = 0; // Enemy will sich nach rechts bewegen   
                   IF (enemy_pan.POS_X == 40 && enemy_pan.POS_Y < 350)  
                   {  
                           WHILE (counter < 40)  
                           {  
                                   enemy_pan.POS_Y += 1; // enemy kommt dem ship nahe   
                                   counter += 1;  
                                   WAITT 1;  
                            }  
                   counter = 0; // wir wollen ihn auch am Rande rechts gebrauchen  
                   }  
              }  
              IF (enemy_pan.POS_X < 580 && enemy_flag == 0)  
              {  
                     enemy_pan.POS_X += 1; //er bewegt sich nach rechts   
              }  
              ELSE  
              {  
                     enemy_flag = 1; // er will sich nach links bewegen   
                     IF (enemy_pan.POS_X == 580 && enemy_pan.POS_Y < 350)  
                     {  
                            WHILE (counter < 40)  
                            {  
                                       enemy_pan.POS_Y += 1; 
                                       counter += 1;  
                                       WAITT 1;  
                             }  
                     counter = 0; // gesettet für den Rand links   
                     }  
               }  
      WAITT 1;  
      }  
}  

Wenn POS_X des enemy größer als 40 und enemy_flag = 1, wird enemy sich nach links bewegen. Wenn POS_X des enemy egal mit 40, wird enemy sich dem Player nahen indem er die Schleife WHILE (counter <40) benutzt. Indem nun enemy_flag = 0, wird sich enemy nach rechts bewegen. Wenn POS_X des enemy 580 ist, wird enemy sich erneut dem ship nähern; enemy nähert sich ship so lange POS_Y kleiner ist als 350.
  
function move_rocket ()  
{  
       WHILE (1)  
       {  
               IF (KEY_SPACE == ON && ship_pan.VISIBLE == ON)  
               {  
                        rocket_pan.POS_X = ship_pan.POS_X + 18;  
                        rocket_pan.VISIBLE = ON; // Zeige rocket   
                        PLAY_SOUND rocket_snd,100;  
                       WHILE (rocket_pan.POS_Y > 10)  
                        {  
                                 rocket_pan.POS_Y -= 4; // bewege rocket nach oben 
                                WAITT 1;  
                        }  
               rocket_pan.VISIBLE = OFF; // verdecke rocket   
               rocket_pan.POS_Y = 388; // unterbreche die Zusammenstöße wenn ship getroffen ist  
               }  
        WAIT 1;  
       }  
}  

Wenn man die Taste space drückt und ship ist nicht getroffen, bringen wir rocket zum Vorschein und bewegen es nach oben, in die Richtung von enemy. Wir benutzen den Wert 18 = die Breite von ship/ 2 - die Breite von fractal / 2 und 16 = Breite von enemy/ 2 als offset auf x und auf y, weil wir wollen dass fractal aus der Mitte von enemy geschossen wird.
  
function move_fractal ()  
{  
       WHILE (1)  
       {  
              IF (enemy_pan.VISIBLE == ON)  
              {  
                     fractal_pan.POS_X = enemy_pan.POS_X + 10;  
                     fractal_pan.POS_Y = enemy_pan.POS_Y + 16;  
                     PLAY_SOUND fractal_snd,50;  
                    WHILE (fractal_pan.POS_Y < 480)  
                    {  
                            fractal_pan.VISIBLE = ON;  
                            fractal_pan.POS_Y += 4;  
                            WAITT 1;  
                     }  
                     fractal_pan.POS_Y = 72; 
                     fractal_pan.VISIBLE = OFF;  
               }  
               WAIT 1;  
        }  
}  

Die Funktionen für das aufspüren der Zusammenstöße und für den Restart des Spieles sind ziemlich einfach, also lassen wir sie als Übungen.
  
  
  

          Laser-Waffen - wie sehr brauchen wir sie?   
 

ACTION laser_beam // Füge sie jeder Entität bei, sie bleibt unsichtbar  
{  
         MY.PASSABLE = ON;  
         MY.INVISIBLE = ON;  
         WHILE (1)  
         {  
                   // set-up die Entfernung bei 5000 quants am Anfang  
                   laser_temp.X=5000*COS(player.PAN)*COS(CAMERA.TILT)+player.X;  
                   laser_temp.Y=5000*SIN(player.PAN)*COS(CAMERA.TILT)+player.Y;  
                   laser_temp.Z=5000*SIN(CAMERA.TILT)+player.Z;  

                   SHOOT player.POS,laser_temp;  
                    // jetzt laser_temp speichert den Wert von RESULT 
                   ……………….  
  
                   pos1.X = MY.X;  
                   pos1.Y = MY.Y;  
                   pos1.Z = MY.Z + 16;  

                   pos2.X = PLAYER.X;  
                   pos2.Y = PLAYER.Y;  
                   pos2.Z = PLAYER.Z;  

                   laser_particle();  

                   WAIT 1;  
         }  
}  
  
Die Funktion laser_particle ist eine Derivate von  particle_line  in template und wird eine “Linie” von Partikeln  generieren zwischen pos 1 (Ziel) und pos 2 (player).

function particle_start()  
{  
          IF (MY_AGE == 0)  
         {  
               MY_COLOR.RED = 200;  // der rote Laserstrahl 
               MY_COLOR.GREEN = 0; 
               MY_COLOR.BLUE = 0;  
               MY_SIZE = 100;  
               return;  
         }  
         MY_ACTION = NULL;  
}  

In dieser Aktion zerstören wir sofort die Partikel, die wir kreiert haben. MY_SIZE kann verändert werden, je nach der Entfernung, so dass die Partikel, die sich näher am Player befinden, kleiner sind.