Ist aber kein Grund gleich ausfallend zu werden!
Meine Frage zu anfang war:
mal was andere... wie kann ich denn ein "timer" in das spiel einbauen ? also ich führe eine aktion aus, wie z.b. ich stelle das wasser an, diese aktion soll dann gestartet wenn ich den raum verlasse und so etwa nach 10 min. soll dann alles unter wasser sein.
die lösung kam von:
SetTimer() und IsTimerExpired().
Letzteres muss logischerweise innerhalb der repeatedly_execute abgefragt werden.
Nach einigem hin und her habe ich das mit dem Timer ja auch hin bekommen.
Nur...
mir geht es hier doch nur um die "timerfunktion" einer aktion, welch ja auch funktioniert, aber meine wünsche nicht erfüllt. der wassehahn läuft nach wie vor super und spielt auch den sound ab.
mir war es nur wichtig einen timer einzuschalten, der nach etwa 3 - 5 min. eine aktion hervorruft die ja auch durch ein "objekt" sichtbar ist. nachdem ich alles im skript geschrieben habe klappte es auch alles soweit, nur das er mir die zusatzansprüche, wie der player sagt etwas(egal im welem raum er sich gerade befindet) oder auch das wenn die aktion genau dann aktiviert wired wenn sich der player in diesem raum befindet (welches ich gerne versuche zu vermeiden) eine andere aktion nicht passiert, weil er ja dazu den raum erst betreten muss....
die einfache alternative dazu habe ich ja gefunden (leider nicht auf zeit) durch eine bool in einem andern raum. der nachteil dadurch ist, dass es diesmal nicht zeitbedingt, sonder das der player genau diesen raum betritt...
Da wurde mir dieser Vorschlag gemacht...
Das Prinzip ist folgendermaßen: SetTimer(1,1000) startet einen internem Timer. 1000 frames sind per Grundeinstellung 25 Sekunden (1 Sek. = 40 Frames).
Dieser Timer läuft nun im Hintergrund runter.
Wird jetzt IsTimerExpired(1) aufgerufen, solange er noch läuft, wird "false" zurückgeliefert. Sobald der Timer abgelaufen ist, liefert IsTimerExpired(1) genau einmal "true" zurück, danach wieder false.
Wenn das Wasser erst auslaufen soll, nachdem man den Raum verlassen hat, setzt man SetTimer(1, GetGameSpeed()*60*3); in leave_room.
(Das sind übrgens drei Minuten. Man kann auch den Raum jederzeit wieder betreten. Falls es nur in Abwesenheit auslaufen soll, deaktiviert man den Timer einfach beim Betreten wieder: SetTimer(1, 0);
Hat übrigens bisschen was von alten Sierra-Spielen, dieses Rätsel. Und das ist kein Kompliment )
Dann fügt man Folgendes in repeatedly_execute in Global.asc ein:
[ags] if (IsTimerexpired(1)) {
CallRoomScript(1);
wasser_ausgelaufen = true;
}[/ags]
wasser_ausgelaufen ist eine globale bool-Variable, mit der ich in "before fadein" der betroffenen Räume beispielsweise Wasserflecken einschalten kann.
CallRoomScript(1) bewirkt, dass AGS in meinem Raumskript "on_call(1);" aufruft, d.h. ich setze z.B. Folgendes ins Raumskript des Flurs vor dem Bad:
[ags]void on_call(int p) {
if (p == 1) { // wasser läuft aus
oWasserLache.Visible = true;
Wait(5);
player.Say("Hier ist gerade Wasser ausgelaufen.");
}[/ags]
da tauchten doch erst die probleme auf...
soweit ich verstanden habe, handelt es sich hier doch um eine "bool" funktion
wasser_ausgelaufen soll wohl eine variable sein, welche man natürlich auch vor dem verwenden erst mal definieren muss
im globalen skript am besten ganz oben
[ags]bool wasser_ausgelaufen = false;
export bool wasser_ausgelaufen;[/ags]
(beim export bin ich mir jetzt nicht sicher, ob man das bool angeben muss, oder nicht)
in den räumen, wo du die variable abfragen willst, ebenfalls am besten ganz oben
[ags]import bool wasser_ausgelaufen;[/ags]
und das ich dieses vorher im Global.ash
[ags]import bool bwasser_ausgelaufen;[/ags]
sowie im Global.asc
[ags]bool bwasser_ausgelaufen = false;
export bwasser_ausgelaufen;[/ags]
schreiben muss ist mir auch klar.
ich habe auch diverse bool funktionen ausprobiert...
das mit der bool funktion hatte ich schon...
ist der timer abgelaufen, muss ich erst den raum betreten damit die bool funtion funktioniert
auch das mit dem "CallRoomScript(1)" habe ich probiert, mit dem erfolg nachdem ich den Raum betreten habe in dem das Wasser übergelaufen ist, wurde die "bool" funktion aktiviert, und als ich den Raum verlassen hatte, kam die Aktion ("Das Wasser ist übergelaufen") die ja eigendlich vorher kommen sollte (als der Timer abgelaufen ist.)
meine vermutung geht nun mal dahin, da ich die "bool" funktion im Raumskript "x" habe, wird sie ja auch nur dann aktiv, insofern ich diesen Raum auch betrete.(eine ähnliche situation hatte ich schon mal, die ich aber anders umgehen konnte.)
faktum ist: der timer funktioniert, aber die...
wasser_ausgelaufen ist eine globale bool-Variable, mit der ich in "before fadein" der betroffenen Räume beispielsweise Wasserflecken einschalten kann.
CallRoomScript(1) bewirkt, dass AGS in meinem Raumskript "on_call(1);" aufruft, d.h. ich setze z.B. Folgendes ins Raumskript des Flurs vor dem Bad:
[ags]void on_call(int p) {
if (p == 1) { // wasser läuft aus
oWasserLache.Visible = true;
Wait(5);
player.Say("Hier ist gerade Wasser ausgelaufen.");
}[/ags]
funktioniert halt nicht (Error wegen oWasserLache, weil diese nicht in dem Raum vorhanden ist.)
mag sein das ich zu blöd bin (sollte wohl echt das AGS löschen, mit der folge das ich ja hier auch überflüssig bin) oder das wo anders der Wurm drin ist (und ich werde die lösung auch finden)
manchmal klappen Dinge nicht auf anhieb, wo selbst die besten Programmierer ihre Schwierigkeiten haben und dabei ist die Lösung doch so einfach gewesen.......
auch wenn ich in mancher hinsicht eine "Mimose" sein sollte, ist es noch lange kein grund unmenschlich miteinander umzugehen !!!