Anzeigen, Texte und Knöpfe 
 
Die Anzeigen, Texte und Knöpfe werden von der in A4 / A5 integrierten 2D Engine genutzt, um den 3D Spielen einen gewissen „Touch“ zu geben; unterschätzen Sie das nicht - Sie können komplette 2D Spiele oder vorgetäuschte 3D Spiele mit Hilfe der 2D Engine erstellen. Ich habe ein belangloses Lernspiel, das sehr oft Anzeigen, Texte und Knöpfe benutzt, erstellt, und raten Sie mal... Ich nannte es Guessme...

Die Startfunktion ist wirklich einfach:

function main() 

   D3D_PANELS = ON; 
   LOAD_LEVEL (<guess.wmb>); 
   start_game(); 

Ich habe D3D_PANELS angeschaltet, damit die Anzeigen hardwarebeschleunigt dargestellt werden. Ich lade außerdem ein einfaches Level (nicht notwendig, aber nützlich wenn Sie neue Sachen hinzufügen wollen oder Ihre Hauptanzeige nicht den kompletten Bildschirm überdeckt.

Ich habe einen Hintergrund erstellt, der den kompletten Bildschirm (800x600) bedeckt, und dessen VISIBLE-Flag gesetzt ist, so dass er bei Spielstart sichtbar ist. Ich benutze zwei Knöpfe zum starten und Beenden des Spiels. Falls Sie sich an die Definition der Knöpfe in der Anleitung erinnern: Wenn ich die Maus über einen der Knöpfe bewege, wird dessen Bitmap zu starthi_map oder quithi_map verändert. Sobald ich einen der Knöpfe anklicke, wird die zugehörige Funktion (start_guessing oder quit_game) ausgeführt.

PANEL guessmain_pan 

    BMAP guess800_map; 
    LAYER 10; 
    POS_X 0; 
    POS_Y 0; 
    BUTTON 20, 20, start_map, start_map, starthi_map, start_guessing, NULL, mouse_over; 
    BUTTON 20, 70, quit_map, quit_map, quithi_map, quit_game, NULL, mouse_over; 
    FLAGS OVERLAY, REFRESH, VISIBLE; 

Die Funktion quit_game ist wirklich einfach - Sie stoppt die Engine. Die Funktion start_guessing ist da schon komplexer. Bevor wir weitergehen beachten Sie bitte dass Texte ziemlich ähnlich wie Anzeigen (Panels) funktionieren; Sie verfügen über Layers und können auf dem Bildschirm bewegt werden.

function start_guessing() // vereinfachte Version 

     intro_text.VISIBLE = ON; // Text aus intro_string anzeigen ("Try to guess a number...") 
     WAITT (16); // eine Sekunde warten, dann Text nach oben bewegen 
     WHILE (intro_text.POS_Y > -30) // sicherstellen, dass alle 3 Zeilen den Bildschirmbereich verlassen haben 
     { 
          intro_text.POS_Y -= TIME * 0.05 * (570 - intro_text.POS_Y); // wir verändern POS_Y von intro_text um die Bewegung immer
          schneller werden zu lassen 
          WAIT (1); 
     } 
     intro_text.VISIBLE = OFF; // intro_text ausblenden 
     random_number = int(RANDOM(9)+1); // Zufallszahl zwischen 1 und 9 wählen 
     click_text.VISIBLE = ON; // click_string anzeigen ("Click the keypad...") 
     keypad_pan.VISIBLE = ON; // Tastenfeld anzeigen 
     WHILE (success == 0) // wenn ich die Zahl errate: success = 1 
     { 
          IF (random_number == your_guess) // erraten 
          { 
               smaller_pan.VISIBLE = OFF; // „Pfeil“-Anzeigen ausblenden 
               bigger_pan.VISIBLE = OFF; 
              PLAY_SOUND thanks_snd, 100; // Dankeschön- Sound abspielen 
              success = 1; // While-Schleife beenden 
          } 
          ELSE 
          { 
                 IF (random_number < your_guess) // zu große Zahl gewählt 
                 { 
                      bigger_pan.VISIBLE = OFF; 
                      smaller_pan.VISIBLE = ON; // „Kleiner-Pfeil“ anzeigen 
                 } 
                 ELSE 
                 { 
                     smaller_pan.VISIBLE = OFF; // zu kleine Zahl gewählt 
                     bigger_pan.VISIBLE = ON; // „Größer-Pfeil“ anzeigen 
                 } 
          } 
         WAIT (1); 
    } 
    click_text.VISIBLE = OFF; // "Click the keypad..." Text ausblenden 
    keypad_pan.VISIBLE = OFF; // und alle anderen Anzeigen ausser guessmain 
    smaller_pan.VISIBLE = OFF; 
    bigger_pan.VISIBLE = OFF; 

Schließlich kommt start_game() an die Reihe:

function start_game() // vereinfachte Version 

      MOUSE_MAP = cursor_map; // Wir wählen den Mauszeiger, setzen ihn in die Bildschirmmitte und lassen den Cursor frei beweglich 
      MOUSE_POS.X = SCREEN_SIZE.X / 2; 
      MOUSE_POS.Y = SCREEN_SIZE.Y / 2; 
      MOUSE_MODE = 2; 
     WHILE (1) 
     { 
           MOUSE_POS.X = POINTER.X; // Maus in X- und Y-Richtung bewegen 
           MOUSE_POS.Y = POINTER.Y; 
           IF (MOUSE_LEFT == 1) // Wenn die linke Maustaste gedrückt wird, überprüfen wir ob der Zeiger über keypad_pan war 
           { 
                 IF (MOUSE_POS.X > 650 && MOUSE_POS.X < 700) 
                 { 
                        IF (MOUSE_POS.Y > 0 && MOUSE_POS.Y < 50) 
                        { 
                               your_guess = 1; 
                        } 
                        IF (MOUSE_POS.Y > 50 && MOUSE_POS.Y < 100) 
                        { 
                              your_guess = 4; 
                        } 
                        IF (MOUSE_POS.Y > 100 && MOUSE_POS.Y < 150) 
                        { 
                             your_guess = 7; 
                        } 
               } 
               IF (MOUSE_POS.X > 700 && MOUSE_POS.X < 750) 
               { 
                       IF (MOUSE_POS.Y > 0 && MOUSE_POS.Y < 50) 
                       { 
                             your_guess = 2; 
                       } 
                       IF (MOUSE_POS.Y > 50 && MOUSE_POS.Y < 100) 
                       { 
                             your_guess = 5; 
                       } 
                       IF (MOUSE_POS.Y > 100 && MOUSE_POS.Y < 150) 
                       { 
                             your_guess = 8; 
                       } 
              } 
              IF (MOUSE_POS.X > 750 && MOUSE_POS.X < 800) 
              { 
                      IF (MOUSE_POS.Y > 0 && MOUSE_POS.Y < 50) 
                      { 
                             your_guess = 3; 
                      } 
                      IF (MOUSE_POS.Y > 50 && MOUSE_POS.Y < 100) 
                      { 
                             your_guess = 6; 
                      } 
                      IF (MOUSE_POS.Y > 100 && MOUSE_POS.Y < 150) 
                      { 
                            your_guess = 9; 
                      } 
            } 
       } 
    WAIT (1); 
    } 

Sie werden sich womöglich wundern, warum ich anstatt regulärer Knöpfe diese Methode zum Überprüfen des Tastenfeldes verwendet habe. Einerseits handelt es sich hier um ein Tutorial und Sie müssen so viele Tricks wie möglich lernen, andererseits können Sie einen Knopf in beliebiger Form und Größe erstellen und dieses Skript zum Anklicken benutzen.

Wie Sie sehen können, habe ich das Tastenfeld in der oberen rechten Ecke plaziert:

           IF (MOUSE_LEFT == 1) // Wenn die linke Maustaste gedrückt wird, überprüfen wir ob der Zeiger über keypad_pan war 
           { 
                       IF (MOUSE_POS.X > 650 && MOUSE_POS.X < 700) // Die erste Zeile (1, 4, 7) startet bei 650 und hört bei 700 Pixel 
                                                                                                        (X-Achse) auf 
                       { 
                             IF (MOUSE_POS.Y > 0 && MOUSE_POS.Y < 50) // Die erste Spalte (1, 2, 3) startet bei 0 und hört bei 50 Pixel 
                                                                                                          (Y-Achse) auf 
                             { 
                                    your_guess = 1; // 1 angeklickt 
                             } 
                             IF (MOUSE_POS.Y > 50 && MOUSE_POS.Y < 100) // Die zweite Spalte (4, 5, 6) startet bei 50 und hört bei 100 Pixel 
                                                                                                              (Y-Achse) auf                              
                             { 
                                    your_guess = 4; 
                             } 
                             IF (MOUSE_POS.Y > 100 && MOUSE_POS.Y < 150) // Die dritte Spalte (1, 2, 3) startet bei 100 und hört bei 150 Pixel 
                                                                                                                (Y-Achse) auf                              
                             { 
                                    your_guess = 7; 
                             } 
                      } 
         .............................................. 

Wir brauchen für diese Aktion keine Tastenfeld-Anzeige; keypad_pan wird nur auf dem Bildschirm angezeigt, damit der Spieler weiß, wo er zu klicken hat.
 
 

                                                          Uhren und String-Anweisungen       
 

Ich war überrascht, dass man eine Echtzeituhr so einfach skripten kann. Ich habe zwei Dinge erstellt:

STRING clock_string, "        "; // hh:mm ss = 8 Zeichen für die Zeitanzeige wie z.B. 17:34 56  
STRING temp_string, "  ";  // 2 Zeichen für temporäre Daten die von Zeit zu Zeit zu clock_string addiert werden  
  
Ich benutze clock_text um die Zeit per clock_string auf dem Bildschirm anzuzeigen. Die Funktion start_clock kümmert sich um alles.

function start_clock()  
{  
         WHILE (1)  
         {   
                str_for_num(clock_string, SYS_HOURS);  
                str_cat(clock_string, ":");  
                IF (SYS_MINUTES < 10)   
                {  
                        str_cat(clock_string, "0");  
                }  
                str_for_num(temp_string, SYS_MINUTES);   
                str_cat(clock_string, temp_string);   
                str_cat(clock_string, " ");   
                IF (SYS_SECONDS < 10)   
                {  
                        str_cat(clock_string, "0");  
                }  
                str_for_num(temp_string, SYS_SECONDS);   
                str_cat(clock_string, temp_string);   
                WAIT (1);  
         }  
}  
Untersuchen wir diese Funktion einmal Zeile für Zeile:

str_for_num(clock_string, SYS_HOURS);   
Liest eine Zahl aus SYS_HOURS, konvertiert diese zu einem String und kopiert ihn in clock_string (die ersten zwei Zeichen). 

str_cat(clock_string, ":");   
Fügt einen Doppelpunkt zum String hinzu um eine Uhr zu erstellen, die z.B. wie 12:32 aussieht.

IF (SYS_MINUTES < 10) // füge eine 0 hinzu wenn die Minuten einstellig sind  
{  
       str_cat(clock_string, "0");  
}  
SYS_MINUTES wird 12: 7 anstatt 12:07 anzeigen, falls SYS_MINUTES kleiner 10 ist, daher fügen wir zum richtigen Zeitpunkt eine 0 hinzu.

str_for_num(temp_string, SYS_MINUTES);   
Liest SYS_MINUTES, und konvertiert die Zahl zum String (wir benutzen zuerst temp_string, dieser wird danach an clock_string angefügt).

str_cat(clock_string, temp_string);   
Wir fügen die Minuten zu clock_string hinzu. Die Minuten sollten an Vierter und Fünfter Stelle in clock_string stehen.

str_cat(clock_string, " ");   
An sechster Stelle ein Leerzeichen hinzufügen.

IF (SYS_SECONDS < 10) // füge eine 0 hinzu wenn die Sekunden einstellig sind 
{  
      str_cat(clock_string, "0");  
}  
Wir fügen eine 0 hinzu, falls die Sekunden unter 10 sind.

str_for_num(temp_string, SYS_SECONDS);   
Wir Lesen SYS_MINUTES, und konvertieren die Zahl zum String, das Ergebnis wird in temp_string gespeichert

str_cat(clock_string, temp_string); // Sekunden zu clock_string hinzufügen   
Wir fügen die Sekunden zu clock_string hinzu (siebte und achte Stelle).

Dies alles wird in einer WHILE(1)-Schleife ausgeführt, daher wird die Zeit ständig aktualisiert.