Nach Codeeingabe auf Keypad soll Tür öffnen.

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
DernetteEddy
Süßwasserpirat
Süßwasserpirat
Beiträge: 298
Registriert: 30.06.2004, 00:31

Nach Codeeingabe auf Keypad soll Tür öffnen.

Beitrag von DernetteEddy »

Hi,

ich möchte gerne folgende Animation realisieren, weiß aber nicht wirklich wie das gehen soll:
Ich habe wie bei Maniac Mansion ein Keypad auf dem man einen bestimmten Code eingeben muss damit sich eine Tür öffnet. Wenn man einen falschen Code eingibt soll nichts passieren. Der Code ist vierstellig und lautet z.B. 1234
Mach ich das über eine GUI oder wie? Super wäre, wenn einer schonmal sowas gemacht hat und mir das Script zukommen lassen könnte.

Gruß

Eddy
Mit * markierte Felder sind erforderlich
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

Ja, am besten wäre ein GUI und ein String in dem die Eingabe gespeichert werden kann. Das Script dazu ist recht simpel:

Code: Alles auswählen

string temp;
GetGlobalString(20, temp);
if(interface == CONTROL) {
  if(button == 0) StrCat(temp, "1");
...
// nach allen button-Abfragen
if(StrLen(temp) == 4) {
  if(!StrComp(temp, "0123")) DisplaySpeech(EGO, "Ich habe 0123 eingetippt");
  else DisplaySpeech(EGO, "Das bringt mir zwar nichts, aber es ist unterhaltsam");
  SetGlobalString(20, "");
  }
else SetGlobalString(20, temp);
}
Nicht getestet

Meine neueste Episode enthält ein solches Script mit Hotspots. Das Script ist allerdings so unübersehbar, dass ich dir das nicht antun will ;)
Es heißt, Leute mit den originellsten Nicknames schreiben die besten Beiträge

Ausnahmen bestätigen die Regel
_________________
<Problem> Weil du denken kannst.

Zuletzt bearbeitet von [ZENSIERT] am 16.07.1759, 16:19, insgesamt 54743869-mal bearbeitet
Benutzeravatar
DernetteEddy
Süßwasserpirat
Süßwasserpirat
Beiträge: 298
Registriert: 30.06.2004, 00:31

Beitrag von DernetteEddy »

Mach ruhig!!! :wink:
Ich kenn mich im GUI Bereich wirklich nicht aus, da ich selber nur von anderen übernommen und nie selber was gemacht habe.
Hotspotsachen sind für mich einfacher zu verstehen. Zur Not über PM. Wenn's nicht geht, muss ich mir wohl oder übel die GUI templates durchsehen. *buhuuu* :cry: :cry:
Mit * markierte Felder sind erforderlich
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

Meine Güte ;)

Mein Script ist noch komplizierter, das fragt über on_mouse_click den geklicken Hotspot ab ;)
Es heißt, Leute mit den originellsten Nicknames schreiben die besten Beiträge

Ausnahmen bestätigen die Regel
_________________
<Problem> Weil du denken kannst.

Zuletzt bearbeitet von [ZENSIERT] am 16.07.1759, 16:19, insgesamt 54743869-mal bearbeitet
Benutzeravatar
Floyd
Logik-Lord
Logik-Lord
Beiträge: 1088
Registriert: 14.03.2004, 19:59

...

Beitrag von Floyd »

Also ich habe es folgendermaßen gemacht:
Jede Taste (also bei dir wahrscheinlich 0-9) ist ein Objekt/Hotspot.
Beim Klick auf dieses/diesen wird ein script aufgerufen (geht natürlich auch mit rauminternen Variablen):

Code: Alles auswählen

if (GetGlobalInt (5) == 0) {
SetGlobalInt (1,x);
SetGlobalInt (5,1);
}
else if (GetGlobalInt (5) == 1) {
SetGlobalInt (2,x);
SetGlobalInt (5,2);
}
else if (GetGlobalInt (5) == 2) {
SetGlobalInt (3,x);
SetGlobalInt (5,3);
}
else if (GetGlobalInt (5) == 3) {
SetGlobalInt (4,x);
SetGlobalInt (5,4);
}
else if (GetGlobalInt (5) == 4) {
}
Zur Erklärung:
Variable 5 speichert die Anzahl der bereits eingegebenen Zahlen und prüft diese auch wieder ab, sodass nicht mehr als 4 eingegeben werden können.
Die anderen 4 Variablen stehen für die Stelle, an der die Zahl auftaucht.
Für x setzt du die Zahl ein, z.B. ist bei SetGlobalInt ( 3,8 ); die 3te Stelle deiner Zahl eine 8.

Wenn der Spieler nun auf "OK" klickt, schreibst du folgendes in ein script:
if ((GetGlobalInt (1) == 1) && (GetGlobalInt (2) == 2) && (GetGlobalInt (3) == 3) && (GetGlobalInt (4) == 4) && (GetGlobalInt (5) == 4)) {
Dein Code hier;
}
else {
}
Wenn an der ersten Stelle 1, an der zweiten 2 usw. steht und die Zahl aus 4 Stellen besteht ( (5) = 4 ), passiert etwas, ansonsten nicht.

Du benötigst natürlich noch einen Button "Zurücksetzen", der alle Variablen wieder auf 0 setzt.

Die grafische Ausgabe dürfte ja kein Problem sein, oder?

MfG Floyd
Benutzeravatar
DernetteEddy
Süßwasserpirat
Süßwasserpirat
Beiträge: 298
Registriert: 30.06.2004, 00:31

Beitrag von DernetteEddy »

Super danke Floyd hat geklappt. Grafisch hatte ich das schon fertig gehabt.
Für die, die es auch vor haben sollten kann ich noch sagen, dass für jeden Button das Script eingefügt werden muss. Die Buttons die eine Zahl in dem Code darstellen müssen dann an der Stelle an der sie auftauchen eingetragen werden.z.b:
Wenn der Code 6789 ist muss man bei Button 6 das Script so aussehen:

Code: Alles auswählen

if (GetGlobalInt (5) == 0) {
SetGlobalInt (1,6);                     // die erste zahl des codes ist 6 
SetGlobalInt (5,1);
}
else if (GetGlobalInt (5) == 1) {
SetGlobalInt (2,0);
SetGlobalInt (5,2);
}
else if (GetGlobalInt (5) == 2) {
SetGlobalInt (3,0);
SetGlobalInt (5,3);
}
else if (GetGlobalInt (5) == 3) {
SetGlobalInt (4,0);
SetGlobalInt (5,4);
}
else if (GetGlobalInt (5) == 4) {
}
Bei der 7 dann die sieben hier einsetzen:

Code: Alles auswählen

if (GetGlobalInt (5) == 0) {
SetGlobalInt (1,0);
SetGlobalInt (5,1);
}
else if (GetGlobalInt (5) == 1) {
SetGlobalInt (2,7);
SetGlobalInt (5,2);
}
else if (GetGlobalInt (5) == 2) {
SetGlobalInt (3,0);
SetGlobalInt (5,3);
}
else if (GetGlobalInt (5) == 3) {
SetGlobalInt (4,0);
SetGlobalInt (5,4);
}
else if (GetGlobalInt (5) == 4) {
}
bei der 8 und 9 natürlich dann jeweils einen tiefer eintragen. Alle andeen Buttons die nicht im Code vorkommen werden mit 0 eingetragen.
So hab ich es gemacht. Geht bestimmt auch einfacher. Danke nochmal an Floyd.

Gruß
Eddy
Mit * markierte Felder sind erforderlich
Benutzeravatar
Floyd
Logik-Lord
Logik-Lord
Beiträge: 1088
Registriert: 14.03.2004, 19:59

...

Beitrag von Floyd »

So geht es natürlich auch. Allerdings kannst du x auch genauso gut durch die Zahl selbst (also hier 7) ersetzen und musst so nicht immer sehen, dass du die Zahl an der richtigen Stelle einfügst. Aber das ist nun wirklich Geschmackssache :wink: . MfG Floyd
Benutzeravatar
DernetteEddy
Süßwasserpirat
Süßwasserpirat
Beiträge: 298
Registriert: 30.06.2004, 00:31

Beitrag von DernetteEddy »

Ich versteh nicht wie du das meints.
:?: :?: :?:
Mit * markierte Felder sind erforderlich
Benutzeravatar
Floyd
Logik-Lord
Logik-Lord
Beiträge: 1088
Registriert: 14.03.2004, 19:59

Beitrag von Floyd »

Es gibt 2 Möglichkeiten:

Code: Alles auswählen

if (GetGlobalInt (5) == 0) {
SetGlobalInt (1,0);
SetGlobalInt (5,1);
}
else if (GetGlobalInt (5) == 1) {
SetGlobalInt (2,7 );
SetGlobalInt (5,2);
}
else if (GetGlobalInt (5) == 2) {
SetGlobalInt (3,0 );
SetGlobalInt (5,3);
}
else if (GetGlobalInt (5) == 3) {
SetGlobalInt (4,0 );
SetGlobalInt (5,4);
}
else if (GetGlobalInt (5) == 4) {
} 

Code: Alles auswählen

if (GetGlobalInt (5) == 0) {
SetGlobalInt (1,7 );
SetGlobalInt (5,1);
}
else if (GetGlobalInt (5) == 1) {
SetGlobalInt (2,7 );
SetGlobalInt (5,2);
}
else if (GetGlobalInt (5) == 2) {
SetGlobalInt (3,7 );
SetGlobalInt (5,3);
}
else if (GetGlobalInt (5) == 3) {
SetGlobalInt (4,7 );
SetGlobalInt (5,4);
}
else if (GetGlobalInt (5) == 4) {
} 
MfG Floyd
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Es geht aber wirklich vieeeel einfacher:

Ein Klick auf den Button (ob GUI oder hotspot is total egal) ruft eine funktion auf und übergibt ihr die Taste: 0-9 is klar, -1 für enter.
Dann braucht man noch eine globale variable für den code, meinetwegen int code=0;.

Code: Alles auswählen

function key_pressed(int a) {
  if (a==-1) {
    if (code>999) {
      if (code==1234) {
        // Tür öffnen, etc.
      }
      else code=0;  // falscher Code, zurücksetzen
    }
    else PlaySound(x);  // Fehlerton, noch keine 4 Ziffern eingegeben
  }
  else {
    if (code>999) // 5. Zahl gedrückt, 1. Zahl wird abgeschnitten
      code=code-(code/1000)*1000;
    code=code*10+a;  // gedrückte Zahl dranhängen
  }
  // grafische Befehle, um GUI/Screen zu aktualisieren
}
Use gopher repellent on funny little man
Benutzeravatar
DernetteEddy
Süßwasserpirat
Süßwasserpirat
Beiträge: 298
Registriert: 30.06.2004, 00:31

Beitrag von DernetteEddy »

khrismuc hat geschrieben:Es geht aber wirklich vieeeel einfacher:
Alter Angeber.:lol:
Vielen Dank für die Hilfe. Weitere Probleme folgen!!
:wink:
Mit * markierte Felder sind erforderlich
Benutzeravatar
Dusty D.
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 153
Registriert: 18.04.2004, 20:03
Kontaktdaten:

Beitrag von Dusty D. »

In unserem Spiel gibt es eine Aufzugsteuerung, da geht das Folgendermaßen:

Jeder Knopf hat einen eigenen Hotspot. Im Interact-Hotspot-Script steht

Code: Alles auswählen

StrCat(etage,"x");
position=++;
wobei im String "etage" zunächst die Eingabe und in "position" die Anzahl der gedrückten Tasten gespeichert wird. Statt "x" wird die jeweilige Taste (0-9) in den String eingefügt. Im repeatedly-execute des Raums steht:

Code: Alles auswählen

if (position==3) {
  ziel=StringToInt(etage);
  if (negativ==1) ziel=-1*ziel;
  SetGlobalInt(11,ziel);
Wenn 3 Stellen eingegeben wurden, steht in GlobalInt(11) die eingegebene Zahl und kann ausgewertet werden. Da unsere Steuerung auch negative Zahlen verarbeiten kann, wurde das Negativ-Flag fällig, das gesetzt wird, wenn man den entsprechenden Knopf drückt. Außerdem kann man weitere Spielereien leicht einbauen, wie zB. einen "clear enter" Button usw.
Das Long Trip-Projekt

"Lauf nicht weg!"
Antworten