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.
|