Maniac Mansion Mania Forum

MMM-Werkzeugkiste => Technik => Thema gestartet von: ZAK am 11. April 2011, 18:02:34

Titel: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 11. April 2011, 18:02:34
Beim AGS 3.2 sind sie Fonts ( ich glaube Fonts 2) nicht mehr leserlich...
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 11. April 2011, 18:26:59
Inwiefern? Mehr Info? Screenshot? ::)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 11. April 2011, 18:37:16
Wie mehr Infos ??? halt nicht leserlich...
(http://imgmi.net/b/b491664e.bmp)
(http://imgmi.net/6/6cb65f73.bmp)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Bòógieman am 11. April 2011, 18:45:08
liegt an der "Anti-alias TTF fonts" option in den general settings
mach die auf false und es geht wieder  :)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 19. Juni 2011, 21:22:50
hi,
stehe vor einem rätsel und brauche hilfe.
wenn ich den wasserhahn aufdrehe und in den raum wieder rein gehe, läuft das wasser noch ( soll ja auch so sein), aber der sound ist weg.
hat einer eine idee ???
[ags]
function room_Load()
{
    oWasser.SetView(58);
    oWasser.Animate(0, 0, eRepeat, eNoBlock);
}
[/ags]

[ags]else if (UsedAction(eActUse))
{
  Wait(5);
  if ( GetGlobalInt(13) == 0 )
   {
     oWasser.Visible = true;
     PlayAmbientSound (1, 95, 150, 51, 131);
     SetGlobalInt(13,1);
    }
     else if ( GetGlobalInt(13) == 1 )
     {
       oWasser.Visible = false;
       StopAmbientSound(1);
       SetGlobalInt(13,0);
      }
}[/ags]
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: mukk am 19. Juni 2011, 21:53:55
Der Sound wird nur nach der Use-Aktion ausgeführt und hört auf wenn man den Raum verlässt.
Benutze deine GlobalInt im Room Load für Sound:

[ags]function room_Load()
{
    oWasser.SetView(58);
    oWasser.Animate(0, 0, eRepeat, eNoBlock);

 if ( GetGlobalInt(13) == 1 ) PlayAmbientSound (1, 95, 150, 51, 131);

}
 [/ags]

Edit: Versuch besser auf die GlobalInts zu verzichten. Du könntest hier zB nach dem Objekt fragen:

[ags] if ( oWasser.Visible == 0 )
   {
     oWasser.Visible = true;
     PlayAmbientSound (1, 95, 150, 51, 131);
    }
     else if ( oWasser.Visible == 1 )
     {
       oWasser.Visible = false;
       StopAmbientSound(1);
      }[/ags]

im RoomLoad dann

[ags] if ( oWasser.Visible == 1 ) PlayAmbientSound (1, 95, 150, 51, 131);[/ags]
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 20. Juni 2011, 11:04:13
im RoomLoad dann

[ags] if ( oWasser.Visible == 1 ) PlayAmbientSound (1, 95, 150, 51, 131);[/ags]
Danke, damit funktioniert es nun...

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.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 20. Juni 2011, 11:55:03
SetTimer() und IsTimerExpired().
Letzteres muss logischerweise innerhalb der repeatedly_execute abgefragt werden.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 20. Juni 2011, 19:42:50
SetTimer() und IsTimerExpired().
Letzteres muss logischerweise innerhalb der repeatedly_execute abgefragt werden.
irgendwie funktioniert das nicht so richtig, habe vieles ausprobiert, aber bistlang noch kein erfol damit erzielt.
habe u.a SetTimer(1,1000); dann hat er mit die funktion sofort ausgeführt, habe ich z.b. die "IsTimer" unter leave gemacht, klappte alles nur halt nicht wenn ich mich gerade zu dem zeitpunkt im raum befand...
...naja egal, hab ne andere möglichkeit gefunden es auszuführen, aber leider nicht auf zeit (counter)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Der Kompaniechef am 20. Juni 2011, 19:57:23
ZAK kannst du mir den download link schicken vom Abspann
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: mukk am 20. Juni 2011, 20:16:48
irgendwie funktioniert das nicht so richtig, habe vieles ausprobiert, aber bistlang noch kein erfol damit erzielt.
habe u.a SetTimer(1,1000); dann hat er mit die funktion sofort ausgeführt, habe ich z.b. die "IsTimer" unter leave gemacht, klappte alles nur halt nicht wenn ich mich gerade zu dem zeitpunkt im raum befand...
...naja egal, hab ne andere möglichkeit gefunden es auszuführen, aber leider nicht auf zeit (counter)

Is n bisschen konfus, deine Beschreibung. SetTimer muss in deinem Fall beim Wasserhahn-öffnen-Script rein, dazu ne GlobalInt auf 1 setzen. Beim Wasserhahn schließen den Timer auf 0 setzen und vorher die GlobalInt ebenfalls auf 0 damit du den Timer/Wasserhahn stoppen kannst ohne dein Event auszulösen.
Jetzt schreibst du ins Globalscript unter die function repeatedly_executed [ags]if (IsTimerExpired (x) == true && [die GlobalInt von oben] == 1)
{
///deine Script
}[/ags]
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 20. Juni 2011, 21:36:46
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 alle 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...

p.s.:wenn ich zu kompliziert schreiben sollte, dann bitte ich dieses zu entschuldigen.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 21. Juni 2011, 11:03:31
"IsTimer" unter "leave"? Ich hab doch noch extra geschrieben, dass IsTimerExpired in eine der verfügbaren rep_exes muss.

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]
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: mukk am 21. Juni 2011, 13:03:10
Das is besser als meine Variante :)

Mal so zum Verständnis:

p setzt man dann beim Wasserhahn 1 bzw 0 ?
Was ist void?
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Rocco am 21. Juni 2011, 13:14:52
p steht hier einfach nur für den Wert der durch
[ags]CallRoomScript(1); ->  void on_call(int p)[/ags]
übergeben wurde und ist in khris beispiel kein bool sondern ein int, das nicht direkt mit dem Wasserhahn in Verbindung steht, sonder einfach nur dazu benutzt wird um in der Funktion
verschiedene Zustände abfragen zu können ->[ags] if (p == 1) [/ags]

on_call ist eine Funktion und jede Funktion wird nach folgendem Muster definiert:
[ags]Rückgabeformat Funktionsname(Funktionsparameter)[/ags]

void heisst, dass diese Funktion keinen Wert zurückgíbt.
in AGS steht normalerweise function vor dem Funktionsname und das ist ein Synoym für int(eger) -> ganze Zahlenwerte.
man kann aber auch chars (Buchstaben) Strings (Zeichenkette) oder floats (Kommazahlen) zurückgeben und in "richtigen" Programmiersprachen auch eigens definierte Datentypen oder structs
(weiss jetzt nicht auswendig ob structs bei AGS auch funktionieren und ob du das überhaupt so genau wissen wolltest.  :cl)



Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 21. Juni 2011, 13:15:42
"void" bedeutet, dass die Funktion nichts zurückliefert. Man kann stattdessen genauso gut "function" nehmen; das ist jedoch nur ein Platzhalter für "int", und da die Funktion nur was macht und nichts zurückliefert, benutze ich "void".

Ein paar Beispiele für Funktionen, die etwas zurückliefern:

[ags]int Summe(int a, int b) {
  return a+b;
}

String Begruessung() {
  return String.Format("Hallo %s!", player.Name);
}[/ags]

p hat mit dem Wasserhahn nichts zu tun. Genau wie bei dem veralteten dialog_request kann ich der Funktion einen parameter mitgeben, falls ich mehrere Situationen habe, in denen etwas passiert.

Ich benutze ja nicht "CallRoomScript();" sondern "CallRoomScript( 1 );", aus diesem Grund muss ich die on_call Funktion auch mit einem int als Parameter deklarieren. Den kann ich nennen, wie ich möchte, aber er muss vorhanden sein und hat dann in der Funktion den Wert, den ich bei CallRoomScript in Klammern gesetzt habe.

Wenn es also beispielsweise eine andere Situation gibt, in der ich Code ausführen muss, der in jedem Raum anders ist, würde ich dort "CallRoomScript(2);" verwenden und dann innerhalb von on_call dieses haben:

[ags]  if (p == 1) {  // wasser laeuft aus
    ...
  }
  if (p == 2) {  // was anderes passiert
    ...
  }[/ags]

Edit: doppelt hält besser :)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: mukk am 21. Juni 2011, 13:24:47
Kann man dann p noch an anderen Orten ändern, also einfach mit p +1; ?
Wundere mich nur gerade wozu der dann benannt wird...wenn das so ist könnte man ja die Integer unterschiedlich benutzen. Also CallRoomScript (1) setzt alle on_call (int p) oder on_call (int q) eins, aber ich könnte p dann mit p +1 ändern um unterschiedliche Reaktionen hervorzurufen?
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Endres am 21. Juni 2011, 14:31:53
Ich glaube was du meinst, ist eine globale Variable: Ein normaler int.
Parameter werden einer Funktion mitgegeben. Normalerweise sind diese dann auch nur dort benutzbar. Der Fall on_call ist eine Art Sonderfall von Funktion, da hierbei die Engine selbst den Parameter der Funktion mitgibt.
Somit kannst du zwar manuell on_call(1); aufrufen, was genausogut die Aktionen ausführt, nur ist dies im Bereich des repeatedly_execute nicht erlaubt, da diese Funktion immer möglichst wenig Zeit beanspruchen darf. Also wird intern durch CallRoomScript(1); vorgemerkt, dass on_call(1); in einem anderen Bereich ausgeführt werden soll, sobald dies möglich ist.
Also ist p in diesem Beispiel nur die Variable, in der die Zahl liegt, mit der CallRoomScript aufgerufen wurde.
Warum du p ändern willst ist daher nicht so ganz klar. Du kannst natürlich bspw. wie schon gesagt mit CallRoomScript(2); und einem entsprechend anderem if-Block im on_call-Teil eine andere Aktion ablaufen lassen.
Ich hoffe dass dir das ein wenig hilft.  :)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: mukk am 21. Juni 2011, 15:22:52
Hat schon für mehr Verständnis gesorgt. Um meine Frage verständlich zu formulieren bin ich wahrscheinlich noch zu unsicher mit den Vokabeln ;)

Ich glaub, was ich im Kopf hatte ist auch recht überflüssig. Man kann ja mit CallRoomScript(x)  schon ausreichend bedingen kann was passieren soll.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 21. Juni 2011, 16:06:07
Um Deine erste Frage zu beantworten: nein.
p existiert nur innerhalb der Funktion.

Wenn Du folgenden Befehl benutzt: Display("Hallo!");

dann ruft AGS eine Funktion auf, die grob so aussieht:

[ags]void Display(String message) {
  // Ausgabe-Box zeichnen
  // Inhalt von message rein schreiben
  // auf Tastendruck bzw. Mausklick warten
  // Box löschen
}[/ags]

Wie Du siehst, macht es keinen Sinn, die lokale String-Variable message zu verändern oder dergleichen, sie dient nur dazu, dass die Funktion den übergebenen Parameter verwenden kann.

Also CallRoomScript (1) setzt alle on_call (int p) oder on_call (int q) eins
Das macht null Sinn.
Ich kann nicht on_call(int p) auf eins setzen.
Wie ich den Parameter in der Funktionsdefinition nenne, ist völlig egal. Der Parameter ist eine lokale Variable, die nur innerhalb der Funktion benutzt werden kann, aber im Gegensatz zu Variablen, die innerhalb der Funktion deklariert werden, bereits den übergebenen Wert hat.

[ags]void Hallo(int p) {

  int q;
}[/ags]

p und q sind vom Verhalten, Typ, etc. absolut identisch. Aber während q 0 (Null) ist, da kein Wert zugewiesen wurde, hat p von Anfang an den Wert, der übergeben wurde (Hallo(347);  ->  p = 347).
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: mukk am 21. Juni 2011, 17:17:10
Okay, verstanden...denk ich. (int p) gibt nur der Variablen der Funktion den Namen p. Aber, um meinem Gedankengang mal halbwegs Sinn zu geben, ich könnte die Variable umbenennen, um mit CallRoomScript (1) unterschiedliche Dinge auszulösen. Bsp. am Wasserhahn: [ags]function (der Wasserhahn wird geöffnet)
{
 if (normales Wasser) on_call(int p);
if (Spieler hat vorher die Wasserversorgung mit...wasweißich... Plutonium versetzt) on_call(int q);
StartTimer(1, 40*60*5)
}

//im GlobalScript
if (IsTimerExpired(1)) CallRoomScript(1);

//im Raum
void on_call()
{
if (p == 1)  blaues Wasser;
if (q == 1) grünes Wasser;
}[/ags]

Is mir klar, dass man das auch mir CallRoomScript(2) oder sonstewie machen könnte, aber vom Prinzip her passt das so?
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 21. Juni 2011, 17:58:17
NEIN. Sorry, aber Du hast NICHTS verstanden.

Die Variable umzubenennen, macht überhaupt keinen Sinn. Wie Du sie nennst, ist schnurzpiepegal.

Und on_call(int p); wird wahrscheinlich nicht mal kompilieren. In Deiner Vorstellung setzt das anscheinend p auf 1 oder sowas, keine Ahnung. Das ist jedenfalls totaler Käse.

Der Parameter, der bei CallRoomScript(1) in der Klammer steht, also hier die 1, dient dazu, in verschiedenen Situationen verschieden zu reagieren.
Beispielsweise:
  CallRoomScript(1);  // Stromausfall, Raum wird dunkel        -> AGS führt diesen Befehl aus: on_call(1);
  CallRoomScript(2);  // ausgelaufenes Wasser wird sichtbar   -> AGS führt diesen Befehl aus: on_call(2);
  CallRoomScript(3);  // Schwerkraft fällt aus, alle Objekte im Raum fangen an, zu schweben  -> AGS führt diesen Befehl aus: on_call(3);

Ich muss in jedem Raum auf alle Situationen reagieren, ich habe aber nur EINE on_call pro Raum zur Verfügung. Irgendwie muss ich also wissen, welche der Situationen eingetreten ist; mit anderen Worten, ich muss irgendwie an die Zahl kommen, die nach CallRoomScript in der Klammer steht.

Ich deklariere also die Funktion mit einem Integer-Parameter, wie durch AGS vorgeschrieben:
[ags]void on_call(int param) {
  ...
}[/ags]
Statt "param" kann ich auch "Blumenkohl" schreiben, es macht absolut keinen Unterschied. Entscheidend ist nicht der NAME, sondern der WERT dieser Variable; dieser Wert teilt nämlich mit, welches Ereignis eingetreten ist, z.B. 3 wäre die aufgehobene Schwerkraft.
Ich kann also jetzt innerhalb der on_call-Funktion den WERT der Variable abfragen und auf das Ereignis reagieren.

[ags]void on_call(int Blumenkohl) {
 
  if (Blumenkohl == 1) {   // falls CallRoomScript(1); aufgerufen wurde, hat Blumenkohl den Wert 1
    // Raum verdunklen
  }
  if (Blumenkohl ==2 ) {  // falls CallRoomScript(1); aufgerufen wurde, hat Blumenkohl den Wert 2
    // Wasser läuft aus
  }
  ...
}[/ags]

Ich kann natürlich genauso gut einen globale Variable namens "EreignisNummer" benutzen und dann den Parameter ignorieren:
[ags]  EreignisNummer = 2;
  CallRoomScript(3567);

// room script

void on_call(int p) {

  if (EreignisNummer == 2) ...
  ...
}[/ags]

Aber ich spare mir die globale Variable, indem ich den vorhandenen Parameter benutze.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: mukk am 21. Juni 2011, 18:13:11
NEIN. Sorry, aber Du hast NICHTS verstanden.

Ist ja GUT, ich bin ja hier um zu LERNEN ^^

Ich hab schon kapiert wie das funktioniert. Meine Frage war nur, OB man mehr Optionen durch umbenennen der Variablen/des Parameters erreichen kann. Geht wohl nicht, Frage beantwortet ;)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 21. Juni 2011, 18:27:55
Nein, der Name spielt keine Rolle, nur der WERT wird übertragen.
on_call hat keine Ahnung, wie der Parameter hieß; es bekommt nur den WERT "zu Gesicht".

[ags]  int p = 1;
  int q = 1;

  CallRoomScript(p);
  CallRoomScript(q);[/ags]

Beide Zeilen bewirken exakt das Gleiche; p und q haben beide den Wert 1, also wird in beiden Fällen CallRoomScript(1); aufgerufen.

Wenn mehr Informationen übertragen werden sollen, kann man entweder zusätzlich globale Variablen benutzen oder mehr Info in den einen Parameter packen.
Man kann z.B. Zehner- und Einerstelle verwenden, um zwei Zahlen von 0-9 zu übertragen.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Endres am 22. Juni 2011, 13:12:33
Ich mach mal dein Beispielskript, so wie es Sinn machen würde:
[ags]
function versetze_wasser_mit_plutonium() {
 Wasser=1;
}

function open_wasserhahn() //(der Wasserhahn wird geöffnet)
{
 StartTimer(1, 40*60*5);
}

//im GlobalScript (ganz oben)
int Wasser=0; // 0=normal, 1=plutonium

if (IsTimerExpired(1)) CallRoomScript(1); // das in rep_exec

//im Raum
void on_call(int p)
{
 if (p==1) {
  if (Wasser==0) // hier funktion für blaues Wasser
  if (Wasser==1) // hier funktion für grünes Wasser
 }
}[/ags]
Früher hat man für genau das selbe GlobalInts verwendet :)
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 04. Juli 2011, 17:44:31
also irgebdwie kriege ich das nicht hin!!! vorweg: ich arbeite mit AGS 3.2.1
die funktionen mit dem timer laufen soweit gut, bis auf das mit dem objekt.
ich muss dazu sagen, das ich eine animation habe die beim eintreten in den raum abgespielt wird, erst danach wird das objekt (wasserlache) sichtbar.
das mit dem void... klappt gar nicht und das objekt (wasserlache) kann ich im raum vorher nicht aktivieren (da ja auch kein objekt mit diesem namen vorhanden ist).
[ags]function room_AfterFadeIn()
{
//animation skript
}[/ags]
[ags]function room_RepExec()
{
  if (IsTimerExpired(1))
  {
      oWasserlache.Visible = true;
//mein skript
}[/ags]
[ags]function hWasserhahn_AnyClick()
{
else if (UsedAction(eActOpen))
{
SetTimer(1, 40*60*3);
}[/ags]
das alles klappt auch so.

bei
[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]
bekomme ich die fehlermeldung das eine klammer fehlt (habe sie verucht überall einzusetzten, jedoch ohne erfolg)

vbei dieser variante...
Ich mach mal dein Beispielskript, so wie es Sinn machen würde:
[ags]
function versetze_wasser_mit_plutonium() {
 Wasser=1;
}

function open_wasserhahn() //(der Wasserhahn wird geöffnet)
{
 StartTimer(1, 40*60*5);
}

//im GlobalScript (ganz oben)
int Wasser=0; // 0=normal, 1=plutonium

if (IsTimerExpired(1)) CallRoomScript(1); // das in rep_exec

//im Raum
void on_call(int p)
{
 if (p==1) {
  if (Wasser==0) // hier funktion für blaues Wasser
  if (Wasser==1) // hier funktion für grünes Wasser
 }
}[/ags]
Früher hat man für genau das selbe GlobalInts verwendet :)
...ist alles schon passiert wenn ich den raum betrete, ohne das ich etwas gemacht habe....

wie gesagt Timer funktioniert, hätte nur gerne das er mir in einem raum vorher sagt z.b. das er das wasser laufen hört
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Rocco am 04. Juli 2011, 17:58:05

bei
[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]
bekomme ich die fehlermeldung das eine klammer fehlt (habe sie verucht überall einzusetzten, jedoch ohne erfolg)


Jede geöffnete Klammer eröffnet einen bestimmten Codeblock, der dann mit der geschlossenen Klammer abgeschlossen wird.
In diesem Fall hast du 2 Blocks, einer ist der Hauptfunktionsblock void on_call(int p) {
der mit der Klammer geöffnet wir, aber in deinem Fall nicht wieder geschlossen,
der andere block der sich in dieser Funktion befinden if (p == 1) {
wird hingegen korrekt geschlossen.
so müsste das aussehen, ich strukturier das immer folgendermassen, damit ich auf einem Blick sehe, welcher Block und welche Klammer wo hingehört:
[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.");
    }
}  // <- Diese Klammer fehlt bei dir
[/ags]
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 04. Juli 2011, 18:36:24
das geht soweit, nur mit dem objekt hat es ein problem, da dieses ja im nächstem raum ist!

edit//
ich habe das objekt mal raus genommen.... aber selbst wenn der timer abgelaufen ist, sagt mir der player in dem raum vorher nichts....
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 05. Juli 2011, 00:01:10
Das Prinzip ist Folgendes:

Sobald der Timer abläuft, wird eine globale Variable (nennen wir sie: wasser_ausgelaufen) gesetzt.
Dann wird mittels CallRoomScript(1) eine unmittelbare Reaktion in den verschiedenen Räumen hervorgerufen.
In jeden betroffenen Raum kommt also eine on_call-Funktion, die bei einem Parameter von 1 das Wasser auslaufen lässt.

Außerdem muss grundsätzlich in jeden betroffenen Raum in before fadein die Vorbereitung; sprich: falls wasser_ausgelaufen == true, Objekt anschalten, etc.

Dieses Prinzip ist immer noch gleich; Objekte in anderen Räumen können nicht direkt angesprochen werden, also muss ich es über eine Variable machen. Hat im Grunde mit dem Wasser-/Timer-Problem nichts zu tun.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 05. Juli 2011, 04:41:27
wo setzte ich denn das
[ags]wasser_ausgelaufen == true;[/ags]
noch hin?

wenn ich es im
[ags]if (IsTimerExpired(1))
  {
wasser_ausgelaufen == true;
}[/ags]
reinsetze kommt die fehlermelung das er mit "wasser_ausgelaufen == true;" nichts anfangen kann
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Fatal M am 05. Juli 2011, 13:53:38
Wenn du die Variable wasser_ausgelaufen mit einem Wert belegen willst, darfst du nur ein Gleichheitszeichen nehmen.
wasser_ausgelaufen = true;
Bei Vergleichen nimmst du zwei Gleichheitszeichen.
if (wasser_ausgelaufen == true)
{
   // Wasser ist ausgelaufen.
}
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 05. Juli 2011, 14:31:14
Error (line 18): Undefined token 'wasser_ausgelaufen'
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Bòógieman am 05. Juli 2011, 15:18:34
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]
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 05. Juli 2011, 15:34:38
Bei export braucht man den Typ nicht nochmal.
Und import lieber in den header, geht auch und ist viel praktischer.

Oder einfach bei "Global variables" anlegen, dann brauch man das alles nicht.

Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 05. Juli 2011, 16:07:56
das mit der bool funktion hatte ich schon...
ist der timer abgelaufen, muss ich erst den raum betreten damit die bool funtion funktioniert
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 05. Juli 2011, 17:59:38
Deswegen ja auch CallRoomScript(1), damit es eine sofortige Reaktion gibt.
Wie oft sollen wir das denn alles von vorne durchkauen? Dreimal müsste doch reichen.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 05. Juli 2011, 19:26:36
[ags]
 if (IsTimerExpired(1))
{
      CallRoomScript(1);
      wasser_ausgelaufen = true;
      //Skript was noch passieren soll
}
[/ags]
folgende meldung von AGS
Error (line 18): Undefined token 'wasser_ausgelaufen'
im anderem raum
[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]

Zitat
Error (line 12): Undefined token 'oWasserLache'
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 05. Juli 2011, 21:49:42
Also doch alles von vorne? ::)

wasser_ausgelaufen ist eine globale Variable vom Typ bool, die VON DIR ANGELEGT WERDEN MUSS; ich mein, sie ist ja wohl kein Bestandteil von AGS oder so, ne?
Mehrfach wurde erklärt, dass man das entweder mit dem "Global variables"-Fenster in AGS macht oder mittels import und export im Skript.

oWasserLache ist ein Beispiel; keine Ahnung, wie Dein Wasserfleck-Objekt heißt. Kapierst Du wirklich nicht, wie Du das umzusetzen hast???
Dass Du entweder dein Objekt "oWasserLache" nennst, oder den Namen deines Objektes in den Code einfügst...? Ich mein, ernsthaft? Nach wochenlangem Arbeiten mit AGS?

Entweder gibst Du Dir jetzt mal ein bisschen Mühe und knallst uns nicht nur kommentarlos immer wieder die gleichen Fehlermeldungen hin, oder Du lässt es bleiben, würd ich sagen. Dann mach ich den thread hier dicht, und Du löscht AGS und fertig. Aber so gehts nicht weiter.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 05. Juli 2011, 22:12:55
das war meine Frage.!!!
wo setzte ich denn das
[ags]wasser_ausgelaufen == true;[/ags]
noch hin?

wenn ich es im
[ags]if (IsTimerExpired(1))
  {
wasser_ausgelaufen == true;
}[/ags]
reinsetze kommt die fehlermelung das er mit "wasser_ausgelaufen == true;" nichts anfangen kann
mit bool klappt es nicht (wie schon genannt).
aber vielleicht ist es doch besser Ags und mein account zu löschen.....
Tschüss und machts gut !!!
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Siel am 05. Juli 2011, 22:18:26
aber vielleicht ist es doch besser Ags und mein account zu löschen.....

Es ist garantiert NICHT besser einfach das Handtuch zu werfen.

Zur Beantwortung deiner Frage:

Wie schon hier mehrmals genannt ist == falsch!
Das wird nur bei vergleichen verwendet, also in if-Bedingungen oder ähnlichem.
Zum setzen einer Variable nimmst du nur ein =
Dein Problem ist aber Immer Noch, dass du die Variable noch gar nicht deklariert hast!
Und wie du das nun machen kannst, spar ich mir, weil es hier schon zur genüge erklärt wurde.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 05. Juli 2011, 23:02:21
Ja, deine "Frge" wurde bereits beantwortet, z.B. auf dieser Seite von Boogieman, lang und breit.

Wenn Du nicht liest, was andere schreiben, dann hat es wohl wenig Sinn, in einem Forum mitzumachen.
Und das hier ist nun mal kein bezahlter Programmierkurs. Mehr als immer wieder vorkauen können wir nicht.

Aber dass Du ernsthaft zum zweiten Mal den Mimosenabgang durchziehst... tschüss. Bis später.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 06. Juli 2011, 02:25:27
Ist aber kein Grund gleich ausfallend zu werden!
Meine Frage zu anfang war:
Zitat
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...
Zitat
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...
Zitat
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
Zitat
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...
Zitat
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...
Zitat
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  !!!
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Rocco am 06. Juli 2011, 11:28:28
du hast also diese variable deklariert:
[ags]bool bwasser_ausgelaufen = false;[/ags]
und diese hier wird nicht erkannt:
[ags]wasser_ausgelaufen == true;[/ags]
schau mal ob dir ein Unterschied zwischen den Variablennamen auffällt.  ;)

und damit diese Variable mit dem Object verbunden ist:
[ags]oWasserLache.Visible = true;[/ags]
musst du natürlich deine Objectgrafik von der Wasserlache auch genauso benennen, sprich
deine Grafik/Object Wasserlacke muss oWasserLache heissen.


Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: ZAK am 07. Juli 2011, 05:00:52
vielen Dank für den hinweis und ja, mir ist es aufgefallen. meine bool funktion heisst ja auch anders (habe es aber auch in meinem skript dementspechend so gennant).
die bool funkion klappt ja auch, nur das ich nach ablauf des timer erst den raum betreten muss, damit diese auch die gewünschte aktivität hervorruft. wie schon gesagt, der timer funktioniert, nur das mit den aktionen (die in den anderen räumen hervorgerufen werden sollen) klappen einfach nicht, aber ich gebe nicht auf und werde auch dieses problem lösen.
danke für die tips und anregungen
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: KhrisMUC am 07. Juli 2011, 05:47:45
Klappt es nicht im Sinne von "ich krieg die Fehlermeldung undefined token"? Dann gebe ich auf.

Oder klappt es nicht im Sinne von "es passiert nix"? Dann wäre es hilfreich, wenn Du die entsprechenden Code-Segmente postest.
Titel: Re: Probleme bei AGS 3.2.1
Beitrag von: Bòógieman am 07. Juli 2011, 08:59:33
1. hör bitte auf von einer "bool funktion" zu reden, wenn du eine variable vom typ bool meinst
das ist nicht dasselbe und verwirrt ungemein  ::)

grob vereinfacht gesagt:
eine funktion ist ein skriptblock, der unter einem namen zusammengefasst ist. der skriptblock wird ausgeführt, wenn man die funktion aufruft
eine variable speichert werte ab, die man später wieder abfragen kann

"bool funktion" klingt da nach einer funktion, die einen wert vom typ bool zurück gibt, was hier ja nicht der fall ist (wenn doch, reden hier wohl alle aneinander vorbei  ;) )

2. du musst in jedem raum, in dem sich der spieler bei ablauf des timers aufhalten kann, die on_call einbauen
im raum wo die wasserlache sein soll, musst du in on_call und im before_fadein abhängig von bwasser_ausgelaufen oWasserLache sichtbar machen
in allen anderen räumen setzt du in on_call die bwasser_ausgelaufen auf true