Autor Thema: Probleme bei AGS 3.2.1  (Gelesen 14102 mal)

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #15 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 :)
« Letzte Änderung: 21. Juni 2011, 13:17:50 von KhrisMUC »

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #16 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?
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

Endres

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1264
  • Geschlecht: Männlich
  • En|dres, der
    • ICQ Messenger - 230191486
    • MSN Messenger - enni_puschner@hotmail.de
    • Profil anzeigen
    • e7p.de
    • E-Mail
Re: Probleme bei AGS 3.2.1
« Antwort #17 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.  :)


Domi:"irc hab ich mir viren geholt.. icq hab ich nimmer"

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #18 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.
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #19 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).
« Letzte Änderung: 21. Juni 2011, 16:12:28 von KhrisMUC »

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #20 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?
« Letzte Änderung: 21. Juni 2011, 17:34:32 von mukk »
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #21 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.

mukk

  • kleiner Tentakel
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #22 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 ;)
Each year, vegetarians bully animals,
cheat in relationships, watch porno and cause pollution.
So join the fight now and stop the vegetarians.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #23 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.

Endres

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1264
  • Geschlecht: Männlich
  • En|dres, der
    • ICQ Messenger - 230191486
    • MSN Messenger - enni_puschner@hotmail.de
    • Profil anzeigen
    • e7p.de
    • E-Mail
Re: Probleme bei AGS 3.2.1
« Antwort #24 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 :)


Domi:"irc hab ich mir viren geholt.. icq hab ich nimmer"

ZAK

  • volljähriger Tentakel
  • *****
  • Beiträge: 503
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #25 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
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2371
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: Probleme bei AGS 3.2.1
« Antwort #26 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]

ZAK

  • volljähriger Tentakel
  • *****
  • Beiträge: 503
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #27 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....
« Letzte Änderung: 04. Juli 2011, 18:43:01 von ZAK »
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #28 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.

ZAK

  • volljähriger Tentakel
  • *****
  • Beiträge: 503
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Probleme bei AGS 3.2.1
« Antwort #29 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
Ich bin mal kurz weg, mich suchen. Wenn ich zurück komme bevor ich wieder da bin, sagt mir bitte das ich warten soll!