Autor Thema: [AGS - Fortgeschritten] Telefoninterface-Tutorial  (Gelesen 2691 mal)

Timer

  • volljähriger Tentakel
  • *****
  • Beiträge: 763
  • Geschlecht: Männlich
    • ICQ Messenger - 275798409
    • AOL Instant Messenger - commandertimer
    • Profil anzeigen
    • Meine Seite
    • E-Mail
[AGS - Fortgeschritten] Telefoninterface-Tutorial
« am: 29. September 2010, 19:00:43 »
Um eigene Telefonwähltasten (bzw. eine Codeeingabe, ein Zahlenschloss o.ä.) in AGS umzusetzen, gibt es viele Methoden.
Ich fange mal mit einer einfachen an, die sich beliebig modifizieren lässt, später kommen dann noch ein paar andere Umsetzungsmöglichkeiten hinzu. :)

Methode 1: Mit Hotspots (bzw. Objekten) in einem Raum

(Für AGS 3.x)

Den Spieler für die Eingabe des Codes in einen extra Raum zu schicken, ist wahrscheinlich die übersichtlichste Lösung. Das ganze Zahlenscript ist dann vollkommen abgetrennt vom Rest eures Spieles und ihr werdet nirgendwo mit komischen Codes verwirrt. ;)
Außerdem lassen sich bei dieser Methode die Zifferntasten wunderbar einzeln als anklickbare Bereiche im Raum definieren (als Hotspots oder als einzelne Objekte), somit hat man einen genauen Überblick darüber, was bei jeder einzelnen Taste passiert.

Also: Zu Beginn brauchen wir einen neuen Raum.
Nehmt ihr Hotspots für die Tasten, dann braucht ihr ein passendes Hintergrundbild, ansonsten eben passende Objekte für die einzelnen Tasten.
Für was ihr euch schließlich entscheidet, ist relativ egal. Das meiste wird hier sowieso im Room-Script ablaufen.
...Und am Ende sieht euer Raum in jeden Fall etwa so aus:


Ja, dieses Bild ist als Hintergrund für den Coderaum wunderbar geeignet. Nehmt es.

Das ist schon mal ein guter Anfang, aber...

Wie läuft jetzt der Wählvorgang ab?

Damit jetzt etwas passiert, wenn der Spieler auf die Tasten drückt, müssen wir uns ans Scripten machen.

Dafür brauchen wir eine allgemeine Wählfunktion, die bei jedem Tastendruck (sprich: jedem klick auf einen Tasten-Hotspot/-Objekt) aufgerufen wird und dann:
  • Die gewählte Ziffer zu den (eventuell) bereits vorher gewählten Ziffern hinzufügt
  • Diese neu erhaltene Nummer mit der richtigen, gesuchten Nummer vergleicht
  • ...und anschließend das ausführt, was im jeweiligen Fall passieren soll (z.B. ein Zurücksetzen der Nummer bei einem Fehlschlag.)

Also denn.
Schritt für Schritt:

1. Die gewählte Ziffer zur vorhandenen Nummer hinzufügen:

Damit unsere Funktion die gewählten Ziffern an die bisher vorhandene Nummer anhängen kann, brauchen wir einen Ort, an dem diese "bisher vorhandene Nummer" gespeichert ist. (Vergleichbar mit einem Merkzettel)
Ohne den geht es nicht. (Das wäre, als würde man versuchen, die Zahlen auf den Zettel zu schreiben, obwohl keiner da ist...)

Darum kommt als allererstes diese Zeile ins Roomscript (möglichst weit oben und außerhalb jeder Raumfunktion):

String sNummer;
Somit haben wir einen String (namens "sNummer") erstellt, in dem immer die aktuell gewählte Nummer gespeichert ist.
(Theoretisch könnte man statt einem String auch ein Integer nehmen, aber die String-Methode ist am unkompliziertesten.)

An diese Zahl kann man aber leider immer noch nichts anhängen, weil sie bisher noch überhaupt keinen Inhalt hat.
Darum folgt gleich der nächste Schritt: Wir müssen, wenn der Raum betreten wird, dem String einen Wert geben. Da aber, wenn wir in den Raum kommen, im Normalfall noch keine Nummer gewählt wurde, geben wir "sNummer" beim betreten des Raumes (also in der "Player enters room (before fadein)"-Funktion) einfach einen leeren Wert. Das sieht dann so aus:

function room_Load()
{
  sNummer = "";
}

Jetzt können wir uns an die eigentliche Funktion machen: Wir brauchen eine Funktion, die zur bereits gewählten Nummer (also "sNummer") eine neue Ziffer hinzufügt - und zwar am besten die, die wir gewählt haben.
Die Funktion muss auch direkt ins Raumscript geschrieben werden, damit sie im ganzen Raum verfügbar ist. Am besten schreibt ihr also direkt unter dem sNummer-String:

function NewNumber (String Ziffer)
{
  sNummer = sNummer.Append (Ziffer);
}

Jetzt müssen wir diese Funktion nur noch bei jeder Taste aufrufen. Also erstellen wir für jede Taste ein "Any click on"-Event, bei der die jeweilige Ziffer angehängt wird. Beim Hotspot für die Zahl 1 sähe das dann z.B. so aus:

function h1_AnyClick()
{
  NewNumber ("1");
}

Jetzt wird immer, wenn die Taste 1 angeklickt wird, "1" an "sNummer", also an die bereits gewählten Ziffern angehängt.
Das gleiche passiert bei den anderen Zahlen, wenn die Funktion richtig gesetzt ist... ;)

Das funktioniert jetzt zwar schon wunderbar (wenn ihr keinen Fehler gemacht habt), aber bisher kann man nur leider noch überhaupt nichts sehen.
Es werden zwar immer Zahlen an die Nummer angehängt, sie wird länger und länger... aber sie ist eben nicht sichtbar.

Darum richten wir jetzt gleich einmal ein Overlay ein, auf dem sNummer angezeigt wird und wir somit unseren Wählvorgang wunderbar betrachten können.
Im Prinzip geht das so ähnlich wie bei sNummer:

Diese Zeile muss ganz an den Anfang des Room-Scripts:

Overlay* oAnzeige;
Damit ist das Overlay (Namens oAnzeige) grundsätzlich erschaffen - aber (- wie auch dem String -) es muss auch diesem erst ein Anfangswert zugewiesen werden, bevor wir sinnvoll damit umgehen können. Und zwar am besten auch beim betreten des Raumes. Somit steht in der "Player enters room (before fadein)"-Funktion:

function room_Load()
{
  sNummer = "";
  oAnzeige = Overlay.CreateTextual (115, 120, 200, eFontFont0, 50, "");
}

...und damit in dieser Anzeige auch tatsächlich die bisher gewählte Nummer angezeigt wird, müssen wir noch die Wählfunktion erweitern:

function NewNumber (String Ziffer)
{
  sNummer = sNummer.Append (Ziffer);
  oAnzeige.SetText (200, eFontFont1, 50, sNummer);
}

Somit haben wir bisher ungefähr folgendes Script:

String sNummer;
Overlay* oAnzeige;

function NewNumber (String Ziffer)
{
  sNummer = sNummer.Append (Ziffer);
  oAnzeige.SetText (200, eFontFont1, 50, sNummer);
}

function room_Load()
{
  sNummer = "";
  oAnzeige = Overlay.CreateTextual (115, 120, 200, eFontFont0, 50, "");
}


function h1_AnyClick()
{
  NewNumber ("1");
}

... usw...

2. Die erhaltene Nummer mit der (oder den) "richtigen" vergleichen:

Bis jetzt kann die Funktion nicht wirklich mehr als Nummernfolgen zu produzieren - bis in alle Ewigkeit.
Das bringt uns aber relativ wenig, wenn unsere gesuchte Nummer eigentlich nur 5 Stellen hat. Darum müssen wir mal einen Stopp-Punkt setzen... bzw. zu handeln anfangen, wenn unsere gewählte Nummer die gewünschte Länge erreicht hat.
Und wie das geht? Ganz einfach - mit einer if-Klammer:

function NewNumber (String Ziffer)
{
  sNummer = sNummer.Append (Ziffer);
  oAnzeige.SetText (200, eFontFont1, 50, sNummer);

  if (sNummer.Length == 5)
  {

    // *

  }
}

*: Sobald unsere gewählte Nummer 5 Stellen erreicht, geht es in der Funktion hier weiter.
Und zwar können wir nun prüfen, ob vielleicht die gewählte Nummer eine der Richtigen ist...

Das geht auch wieder ganz einfach mit einer weiteren if-Abfrage:

function NewNumber (String Ziffer)
{
  sNummer = sNummer.Append (Ziffer);
  oAnzeige.SetText (200, eFontFont1, 50, sNummer);

  if (sNummer.Length == 5)
  {
    if (sNummer == "15276")   // Das ist eine richtige Nummer
    {

    }
    else if (sNummer == "00097")     // Das ist auch eine richtige Nummer
    {

    }
    else           // Wenn keine richtige (also eine falsche) Nummer gewählt wurde
    {
      player.Say ("Das war wohl die falsche Nummer.");
    }
  }
}

3. Das Ausführen der ganzen Folgen bei richtigen/falschen Nummern:

Zwischen die geschweiften Klammern könnt ihr nun alles schreiben, was dann bei der richtigen (oder der falschen) Eingabe passieren soll...

Und ihr dürft nicht vergessen, die Zahl danach wieder zurückzusetzen. Sonst wird einfach fröhlich weiterhin an die bestehende Zahl angehängt und ihr bekommt doch wieder eine kilometerlange "sNummer".

function NewNumber (String Ziffer)
{
  sNummer = sNummer.Append (Ziffer);
  oAnzeige.SetText (200, eFontFont1, 50, sNummer);

  if (sNummer.Length == 5)
  {
    if (sNummer == "15276")   // Das ist eine richtige Nummer
    {

    }
    else if (sNummer == "00097")     // Das ist auch eine richtige Nummer
    {

    }
    else           // Wenn keine richtige (also eine falsche) Nummer gewählt wurde
    {
      player.Say ("Das war wohl die falsche Nummer.");
    }
    sNummer = "";
    oAnzeige.SetText (200, eFontFont1, 50, sNummer);
  }
}

Und wenn ihr den Raum verlasst, solltet ihr noch das erschaffene Overlay wieder löschen. Sonst bleibt es noch für den Rest des Spiels sichtbar...
Also schreibt in die "Leave-Room"-Function:

function room_Leave()
{
  oAnzeige.Remove ();
}

Das war eigentlich schon alles Wichtige... ;D
Aus optischen Gründen ist es letzten Endes aber noch schön, wenn das Interface während der Ziffernwahl abgeschaltet ist - das muss man halt noch beim Betreten des Raumes ausmachen (und beim Verlassen des Raumes wieder an...).

So. Alles in allem müsste euer Room-Script dann ungefähr so aussehen:

String sNummer;
Overlay* oAnzeige;

function NewNumber (String Ziffer)
{
  sNummer = sNummer.Append (Ziffer);
  oAnzeige.SetText (200, eFontFont1, 50, sNummer);

  if (sNummer.Length == 5)
  {
    if (sNummer == "15276")   // Das ist eine richtige Nummer
    {

    }
    else if (sNummer == "00097")     // Das ist auch eine richtige Nummer
    {

    }
    else           // Wenn keine richtige (also eine falsche) Nummer gewählt wurde
    {
      player.Say ("Das war wohl die falsche Nummer.");
    }
    sNummer = "";
    oAnzeige.SetText (200, eFontFont1, 50, sNummer);
  }
}

function room_Load()
{
  sNummer = "";
  oAnzeige = Overlay.CreateTextual (115, 120, 200, eFontFont0, 50, "");
  gMaingui.Visible = false;
}

function room_Leave()
{
  oAnzeige.Remove ();
  gMaingui.Visible = true;
}

function h1_AnyClick()
{
  NewNumber ("1");
}

function h2_AnyClick()
{
  NewNumber ("2");
}

...usw...

Ich hoffe mal, das alles funktioniert. Bei mir gehts.
Wenn ihrs nicht hinkriegt, seid ihr zwar selbst Schuld, aber ich stehe euch trotzdem gerne mit Rat und Tat zur Seite. 8)
« Letzte Änderung: 29. September 2010, 21:36:09 von Timer »

Domi

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1071
  • Geschlecht: Männlich
  • Still existing
    • Profil anzeigen
Re: [AGS - Fortgeschritten] Telefoninterface-Tutorial
« Antwort #1 am: 29. September 2010, 19:11:13 »
mir hats geholfen (nochmal öffentlich) danke timer^^
Ich hab mal richtig schlechte Spiele produziert.
Tut euch einen Gefallen und liest euch nicht meine alten Beiträge durch, danke.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 981
    • Profil anzeigen
Re: [AGS - Fortgeschritten] Telefoninterface-Tutorial
« Antwort #2 am: 30. September 2010, 15:13:40 »
Jetzt müssen wir diese Funktion nur noch bei jeder Taste aufrufen. Also erstellen wir für jede Taste ein "Any click on"-Event, bei der die jeweilige Ziffer angehängt wird.

Da darf ich mal auf meinen Beitrag von vor einem Jahr hinweisen: ;D
http://www.maniac-mansion-mania.de/forum/index.php?topic=1254.msg24497#msg24497

Timer

  • volljähriger Tentakel
  • *****
  • Beiträge: 763
  • Geschlecht: Männlich
    • ICQ Messenger - 275798409
    • AOL Instant Messenger - commandertimer
    • Profil anzeigen
    • Meine Seite
    • E-Mail
Re: [AGS - Fortgeschritten] Telefoninterface-Tutorial
« Antwort #3 am: 30. September 2010, 16:27:18 »
Deine Methode ist dann wohl die "Koordinatennetz-Methode". ;D
Du könntest ihn ja gleich nochmal hier posten (bzw. Beitrag editieren), dann kann ihn jeder gleich in diesem Thread lesen und muss nicht erst weitere Threads durchkämmen. :)

« Letzte Änderung: 30. September 2010, 16:28:30 von Timer »