Timer im repeatedly execute

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Timer im repeatedly execute

Beitrag von DieFüchsin »

Ich möchte zwei Personen abwechselnd einen zufällig per Funktionen ausgewählten Satz sagen und antworten lassen. Dazu habe ich in die Repeatedly execute folgendes geschrieben:
repeatedly execute hat geschrieben:if(wer==0) wer= Random(2);

if(wer==1) {

SetTimer(1,100);

if (IsTimerExpired(1) == 1) {

if(labervar==0){
katerlaber();
labervar=1;
}
else{
katerantwort();
labervar=0;
}
wer=0;
}
}


if(wer==2){

SetTimer(1,100);

if (IsTimerExpired(1) == 1) {

if(labervar==0){
viehlaber();
labervar=1;
}

else {
viehantwort();
labervar=0;
}
wer=0;
}
}

den Timer möchte ich als Puffer zwischen die Sätze schieben, damit nicht alles ohne Punkt und Komma nacheinander gesagt wird.

So wie ichs jetzt hab klappts allerdings nicht. Könnte es sein, dass der Timer immer wieder auf 100 gesetzt wird bevor er ablaufen kann? Wenn ja, wie muss ich es umschreiben? Oder wo liegt der Fehler? (Kein Satz wird je ausgesprochen).
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Timer im repeatedly execute

Beitrag von KhrisMUC »

Code: Alles auswählen

if(wer==0) { 
  if (!labervar) wer=Random(1)+1;    // 1 oder 2
  SetTimer(1, 100);
}

if (IsTimerExpired(1)) {
  if(labervar==0){
    if (wer==1) katerlaber();
    else viehlaber();
    labervar=1;
  }
  else {
    if (wer==1) viehantwort();
    else katerantwort();
    labervar=0;
    wer=0;
  }
}
Jupp, der Fehler lag am Aufrufen von IsTimerExpired direkt nach SetTimer.

-Random(2) liefert 0, 1 oder 2.
-Ich hab es so umgeschrieben, dass sie sich nicht selbst antworten.

Noch ein Hinweis:
Den Code konnte man beträchtlich verkürzen, da sich die beiden Blöcke nur durch die kater/vieh-Zeilen unterschieden haben. In so einem Fall sollte man den Rest einmal schreiben und nur den unterschiedlichen Teil innen mit einem if regeln.

Du könntest übrigens noch mehr verkürzen:

Code: Alles auswählen

function labern(Character*c, bool antwort) {
  if (!antwort) {
    // laber
    if (c==cKater) {
      ...
    }
    else {
      ...
    }
  }
  else {
    // antwort
  }
}
Dann im Code:

Code: Alles auswählen

if (IsTimerExpired(1)) {
  labern(character[5+wer*3], labervar);
  labervar=labervar-1;
  wer=wer*labervar;
}
Wenn die Charaktere z.B. die IDs 8 und 11 haben.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

Ohne deinen kompliziert aussehenden verkürzten Code ausprobiert zu haben:

mit deiner umgeschriebenen Fassung wird nur ganz am Anfang, wenn der Raum geladen wurde ein Satz ausgegeben und dann gar nichts mehr. Auch nicht, wenn der Raum verlassen und neu betreten wird.

Liegt das möglicherweise daran, dass
if (IsTimerExpired(1))

nur einmal überprüft wird und es so nie zur Abfrage
if (wer==1)
kommen kann?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Nicht bloss einmal überprüft, andauernd, aber es liefert nur genau einmal true zurück, d.h. der else-Block mit der Antwort kommt nie zum Zug.

Benutz stattdessen:

Code: Alles auswählen

if (IsTimerExpired(1) || labervar) {
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

Jetzt klappt das, aber beide Figuren reden fast gleichzeitig und da sie nah beieinander stehen überlagert sich der Text. Kann man die Antwort noch verzögern?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Hab mich dodal verzettelt.

Jetzt sollte es klappen:

Code: Alles auswählen

if(wer==0) {
  if (!labervar) wer=Random(1)+1;    // 1 oder 2
  SetTimer(1, 100);
}

if (IsTimerExpired(1)) {  //  || labervar muss raus, war schmarrn
  if(labervar==0){
    if (wer==1) katerlaber();
    else viehlaber();
    labervar=1;
    SetTimer(1, 60);  // Pause zwischen Rede & Antwort
  }
  else {
    if (wer==1) viehantwort();
    else katerantwort();
    labervar=0;
    wer=0;
  }
}
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

Juhuu es klappt ^^ danke danke danke :D
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Fein, gern geschehen :D
Use gopher repellent on funny little man
Antworten