Bettler soll immer was anderes sagen...

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Find dA real
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 233
Registriert: 28.12.2005, 00:16

Bettler soll immer was anderes sagen...

Beitrag von Find dA real »

In meinem Spiel gibt es einen Bettler - jedesmal wenn man auf einem hotSpot vor ihm tritt soll er was anderes sagen also genau genommen wir die szene etwa so:

Man tritt das erste mal drauf "hey hast du ne mark?".
Dann sagt er nicht mehr bis man nochmal den raum betritt bzw. nochmal den hotspot überschreitet.
Dann sagt er "hey gib mir ne mark"

Das ganze sollte 3 mal sein beim dritten mal ist er halt eingeschnappt...

wie geht das?!

Nutze AGS 2.71
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Zwei Möglichkeiten: SSH's MultiResponse-Module, such einfach danach im englischen AGS-Forum.

Oder du skriptest es selbst:
Füge eine RunScript-Interaction ein, dann öffne das raumskript:

Code: Alles auswählen

// ausschnitt aus dem raumskript

int antw=0;

#DO NOT EDIT bla
function x() {
// player walks on hotspot x
  antw++;   // variable um eins erhöhen
  if (antw==1) cBettler.SayBackground("Hey, ...");
  if (antw==2) cBettler.SayBackground("Hey, ...");
  if (antw>=3) cBettler.SayBackground("Jetzt bin ich sauer.");
}
#DO NOT EDIT bla
(Jede hinzugefügte RunScript-Interaction generiert eine Funktion im Raumskript, sie wird wahrscheinlich ganz unten sein, such einfach danach, dann füge die fehlenden Zeilen ein.
Nicht einfach diesen kompletten Code ins Raumskript pasten!)
Use gopher repellent on funny little man
Benutzeravatar
Find dA real
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 233
Registriert: 28.12.2005, 00:16

Beitrag von Find dA real »

Klappt soweit ganz gut, nur das alle 3 antworten direkt hintereinander kommen nicht wenn ich nochmal über den hotspot laufe. Der Hotspot ist ein Punkt auf dem Boden - könnte das Problem sein?!

Code: Alles auswählen

  // script for Hotspot 4 (Hotspot 4): Player stands on hotspot
int antw=0;
GUIOff(0);
StopMoving(EGO);
DisableHotspot(4);
  antw++;   // variable um eins erhöhen
  if (antw==1) cHeinz.SayBackground("Halt!");
               MoveCharacterBlocking(HEINZ, 271, 130, 1);
               cHeinz.Say("Ich brauche Geld - gibt mir Geld");
               MoveCharacterBlocking(EGO, 418, 126, 1);
							 EnableHotspot(4);
                GUIOff(1);
  if (antw==2) cHeinz.SayBackground("Hey2, ...");
   MoveCharacterBlocking(HEINZ, 271, 130, 1);
               cHeinz.Say("Gib mir Geld!");
               MoveCharacterBlocking(EGO, 418, 126, 1);
              EnableHotspot(4);
              GUIOff(1);
  if (antw>=3) cHeinz.SayBackground("Jetzt bin ich sauer!");

Benutzeravatar
Rocco
Adventure-Treff
Adventure-Treff
Beiträge: 1019
Registriert: 25.11.2003, 16:20
Wohnort: Ronville
Kontaktdaten:

Beitrag von Rocco »

du musst die blöcke einklammer { }

wenn du nur eine anweisung nach dem if hast, brauchst du keine klammern

if(var == 1)
var++;

das funktioniert, aber wenn du hast

if(var == 1)
var++;
player.Say("Hello");

dann wird er immer Hello sagen weil sich das if nur auf das var++; bezieht und danach alles normal ausgeführt wird.

richtigerweise musst du dann klammern benutzen:

if(var == 1)
{
var++;
player.Say("Hello");
}

damits klappt.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

@blound:
statt: MoveCharacterBlocking(EGO, 418, 126, 1); (alter code) besser:
player.Walk(418, 126, eBlock);

Du lässt den Spieler vom Hotspot herunterlaufen, damit nicht alle drei Reaktionen hintereinander passieren, oder?
Und warum soll sich Heinz bewegen?

Aber erstmal Folgendes:
Für so etwas sind normalerweise regions gedacht. (Steht auch im Interaction-Fenster: "player stands on hotspot - obsolete, use regions").

Bei regions gibt es nämlich die Interaction "player walks onto region", und diese wird nur einmal ausgeführt, dann nicht mehr, so lange, bis der Spieler aus der region raus- und wieder reinläuft.
"player stands on hotspot" hingegen wird kontinuierlich ausgeführt, während man draufsteht.

Und: Ich hatte extra erklärt, wie Du "int antw=0;" außerhalb der Funktion einfügen kannst.
Wenn Du die Variable innerhalb der Funktion deklarierst, wird sie immer wieder auf 0 gesetzt, auch, wenn Du nur "int antw;" schreiben würdest.
"int antw=0;" muss außerhalb stehen.
Use gopher repellent on funny little man
Benutzeravatar
Find dA real
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 233
Registriert: 28.12.2005, 00:16

Beitrag von Find dA real »

Hatte ich ja gemacht (die steht bei mir ganz ganz oben in roomscript).

Mein Code funktioniert jetzt hier ist er für dritte:

Code: Alles auswählen

  // script for Hotspot 4 (Hotspot 4): Player stands on hotspot (obsolete, use Regions)

GUIOff(0);
StopMoving(EGO);
DisableHotspot(4);
  antw++;   // variable um eins erhöhen
  if (antw==1) 
							{
							 cHeinz.SayBackground("Halt!");
               MoveCharacterBlocking(HEINZ, 271, 130, 1);
               cHeinz.Say("Geld! Sofort");
               cEgo.Walk(418, 126, eBlock);
							 EnableHotspot(4);
GUIOn(1);
							 }
							 
  if (antw==2) {
cHeinz.SayBackground("Hey2, ...");
   MoveCharacterBlocking(HEINZ, 271, 130, 1);
               cHeinz.Say("ich will dein Geld!");
               cEgo.Walk(418, 126, eBlock);
							 EnableHotspot(4);
GUIOff(1);
							 }
  if (antw>=3) {
cHeinz.SayBackground("Jetzt bin ich sauer!");
GUIOn(1);
  }


Einziges Manko ist das es nur funktioniert solange man den Raum nicht verlässt - es sollte aber auch so sein das wenn man später nochmal da wäre das dann halt immer noch die erste Reaktion rum ist..
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Einziges Manko ist das es nur funktioniert solange man den Raum nicht verlässt - es sollte aber auch so sein das wenn man später nochmal da wäre das dann halt immer noch die erste Reaktion rum ist..
Das funktioniert doch eigentlich automatisch, zumindest wenn du am Anfang des room script "int antw;" schreibst statt "int antw=0;".
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Benutzeravatar
Agent Cat
Tastatursteuerer
Tastatursteuerer
Beiträge: 614
Registriert: 30.04.2005, 13:21
Kontaktdaten:

Beitrag von Agent Cat »

Man könnte es im Grunde auch ganz einfach machen:

Du setzt vor den Bettler 3 Regions (evtl. gaaaaanz dicht aneinander). Beim Betreten des Raumes deaktivierst du 2 Regions. Die Region,die jetzt noch da ist, löst beim Drauftreten z.B den Kommentar "hey hast du ne mark?" aus. Jetzt wird auch diese Region ausgeschaltet. Dafür schaltet sich jetzt eine der 2 anderen Regions an. Wenn man jetzt auf die neu angeschaltete, nächste Region tritt kommt der Kommenar "hey gib mir ne mark!". Und dann wird eben diese Region ausgeschaltet und die letzte Region widerum angeschaltet, die den letzten Kommentar dann auslöst.

Klingt zwar mächtig nach Kauderwelsch, geht aber in AGS eigentlich schnell und leicht zu machen. Da ich selbst keine Ahnung vom umfangreichen Skripten habe (Variables usw...) umgehe ich Situationen, die eigentlich kompliziertes Geskripte erfordern, meisten auf so eine ähnliche Art.
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

das wär mir zu umständlich xD
Danke, Adventuretreff! <3
Benutzeravatar
Find dA real
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 233
Registriert: 28.12.2005, 00:16

Beitrag von Find dA real »

Sinitrena's antwort hat bei mir die Lösung gebracht - danke nochmal...
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Gerade erst gesehen...
Ich will nicht AgentCat fertigmachen, er hat immerhin einen gewissen Erfindungsgeist bewiesen, aber seine Methode kommt dem gleich, die Schraube an einer Uhr mit zugeschliffener Nagelfeile und Rohrzange reinzudrehen. Es kann funktionieren, ist aber unsauber, unelegant und fehleranfällig.

Noch dazu ist die alternative Skriptlösung alles andere als kompliziert oder umständlich. Die Benutzung von Variablen ist nun mal unumgänglich für etwas gehobenere Aufgaben, und wer es einmal begriffen hat, der wird es nie wieder anders versuchen.

Und auch an dieser Stelle nochmal: Die Benutzung von Variablen ist einfach. Wirklich. Kein Info-Diplom nötig.
Use gopher repellent on funny little man
Antworten