Problem mit Variablen
- evaeva
- Komplettlösungsnutzer
- Beiträge: 10
- Registriert: 13.03.2008, 11:15
- Wohnort: Erde
- Kontaktdaten:
Problem mit Variablen
Folgendes Problem:
Ich möchte, dass der Character unterschiedliche Messages erhält, je öfter er sich einen Hotspot anschaut. In der Helpdatei von AGS ist das ja eigentlich auch schlüssig mit der Variablemabfrage erklärt. Trotzdem funktioniert es bei mir nicht so richtig. Jetzt rattert das Skript nämlich einfach so durch - Ich möchte aber, dass der Spieler nach jedem Satz erst erneutauf den Hotspot klicken muß, um die nächste Message angezeigt zu bekommen.
Hier das Skript:
Roomscript:
int counter = 0;
// script for Hotspot 6 (Hotspot 6): Look at hotspot
if (counter == 0) {
cGunther.Say("My substitute coat. Cosy and fancy");
counter ++;
}
if (counter == 1) {
cGunther.Say( "Made in Schnippelbach an der Schnippse.");
counter ++;
}
if (counter == 2) {
cGunther.Say("I once had a girlfried from Schnippelbach...");
cGunther.Say("Her name was Christel Salat...");
counter ++;
}
if (counter == 3) {
cGunther.Say("I still dream of her amazing nose");
counter ++;
}
if (counter == 4) {
cGunther.Say("Oh THAT nose...");
counter ++;
}
if (counter == 5) {
cGunther.Say("Ohh Christel....");
counter ++;
}
if (counter == 6) {
cGunther.Say("Why did we split up...");
counter ++;
}
if (counter == 7) {
cGunther.Say( "Oh, how I miss her fantastic nose.");
counter ++;
}
if (counter == {
cGunther.Say("Maybe I should phone her...");
counter ++;
}
if (counter == 9) {
cGunther.Say("I don't think she has someone new...");
counter ++;
}
if (counter == 10) {
cGunther.Say("except her nose she was quite average, not to say boooring...");
counter ++;
}
if (counter == 11) {
cGunther.Say("gifted with a terrible sense of humor...");
}
Bin für jede Hilfe dankbar. Ist sicher nur eine kleine Sache, aber ich komm einfach nicht drauf...
EvaEva
Ich möchte, dass der Character unterschiedliche Messages erhält, je öfter er sich einen Hotspot anschaut. In der Helpdatei von AGS ist das ja eigentlich auch schlüssig mit der Variablemabfrage erklärt. Trotzdem funktioniert es bei mir nicht so richtig. Jetzt rattert das Skript nämlich einfach so durch - Ich möchte aber, dass der Spieler nach jedem Satz erst erneutauf den Hotspot klicken muß, um die nächste Message angezeigt zu bekommen.
Hier das Skript:
Roomscript:
int counter = 0;
// script for Hotspot 6 (Hotspot 6): Look at hotspot
if (counter == 0) {
cGunther.Say("My substitute coat. Cosy and fancy");
counter ++;
}
if (counter == 1) {
cGunther.Say( "Made in Schnippelbach an der Schnippse.");
counter ++;
}
if (counter == 2) {
cGunther.Say("I once had a girlfried from Schnippelbach...");
cGunther.Say("Her name was Christel Salat...");
counter ++;
}
if (counter == 3) {
cGunther.Say("I still dream of her amazing nose");
counter ++;
}
if (counter == 4) {
cGunther.Say("Oh THAT nose...");
counter ++;
}
if (counter == 5) {
cGunther.Say("Ohh Christel....");
counter ++;
}
if (counter == 6) {
cGunther.Say("Why did we split up...");
counter ++;
}
if (counter == 7) {
cGunther.Say( "Oh, how I miss her fantastic nose.");
counter ++;
}
if (counter == {
cGunther.Say("Maybe I should phone her...");
counter ++;
}
if (counter == 9) {
cGunther.Say("I don't think she has someone new...");
counter ++;
}
if (counter == 10) {
cGunther.Say("except her nose she was quite average, not to say boooring...");
counter ++;
}
if (counter == 11) {
cGunther.Say("gifted with a terrible sense of humor...");
}
Bin für jede Hilfe dankbar. Ist sicher nur eine kleine Sache, aber ich komm einfach nicht drauf...
EvaEva
Die Axt im Zimmermann erspart den Wald im Haus.
- Kaktus
- Tastatursteuerer
- Beiträge: 658
- Registriert: 17.02.2006, 01:45
- Wohnort: Wüstä
- Kontaktdaten:
Re: Problem mit Variablen
Abgesehen vom ersten, gehört vor jedes if ein else
also else if (counter == 1) etc.
also else if (counter == 1) etc.
- evaeva
- Komplettlösungsnutzer
- Beiträge: 10
- Registriert: 13.03.2008, 11:15
- Wohnort: Erde
- Kontaktdaten:
Re: Problem mit Variablen
Ahhhhhhhhhh!Es funktioniert! So ne einfache Sache....
Danke!!! Danke!!! Danke!!!
Danke!!! Danke!!! Danke!!!
Die Axt im Zimmermann erspart den Wald im Haus.
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit Variablen
Jou, denn mit dieser Reihenfolge werden sonst alle Bedingungen erfüllt, da ja jedesmal schön rechtzeitig die Variable eins hochgesetzt wird, nüsch.
Ansonsten: "I should call her" und "apart from her nose".
Ansonsten: "I should call her" und "apart from her nose".
Use gopher repellent on funny little man
- Kaktus
- Tastatursteuerer
- Beiträge: 658
- Registriert: 17.02.2006, 01:45
- Wohnort: Wüstä
- Kontaktdaten:
Re: Problem mit Variablen
Ich hätte jetzt gesagt, dass "I should phone her" richtig ist, aber du wirst mich sicher eines besseren belehren.KhrisMUC hat geschrieben: Ansonsten: "I should call her"
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit Variablen
Ich hab das mehr instinktiv "verbessert"; phone so. ist britisch, die Amerikaner callen.
Use gopher repellent on funny little man
- evaeva
- Komplettlösungsnutzer
- Beiträge: 10
- Registriert: 13.03.2008, 11:15
- Wohnort: Erde
- Kontaktdaten:
Re: Problem mit Variablen
also ich find ja britisch besser .... von daher lass ich mal das phone drin, aber "apart from her nose" klingt besser, except kam mir selber schon spanisch än englisch vor, aber irgendwie falsch englisch...
Die Axt im Zimmermann erspart den Wald im Haus.
- Außenseiter
- Verpackungs-Wegwerfer
- Beiträge: 58
- Registriert: 14.10.2007, 20:04
Re: Problem mit Variablen
Britisch rockt auf jeden Fall
Ich möchte das Thema hier ansonsten gerne mal kapern: Als ich das hier gesehen habe dachte ich mir nämlich ich könnte das in AGS 3.0 für function character_talk verwenden, aber wie sich zeigte gibts da einige Probleme.
Problemstellung
Und zwar geht es darum, dass der Spieler verschiedene Gespräche bekommen soll, je nachdem ob er einen Gegenstand schon hat oder nicht und abhängig davon wie oft er den Charakter schon angesprochen hat. Klingt abstrakt, aber in der Praxis ist es so:
A schmeißt Müll rum und cEgo fordert ihn auf das aufzuheben. Macht A aber nicht. Daraufhin wird cEgo wütend, kommt also zu einem anderen Dialog. Z.b. statt "würdest du das bitte aufheben?" zu "Heb auf oder schieb ab!".
bisherige Versuche:
Ich habs also mit dem int counter usw. von oben versucht, aber wenn ich das
so eingebe
sagt er mir was von einem Parse error bei counter (also beim if).
Ich hab danach mal int counter = 0; im Raumscript eingegeben, aber darauf bekomme ich nur ein verstelltes "Kenn ich nich ( = "counter" ist unbekannt)" zurück.
Ich hab daraufhin nochmal die Hilfedatei bemüht, aber zum Thema Variablen find ich nix außer irgendwelcher Spielvariablen (game.irgendwas), die mich nicht weiterbringen.
Zum zweiten hab ich keine hasItem-Funktion oder so gefunden also war das nächst naheliegende mit if (objekt.Visible == true) (yada yada) zu arbeiten, allerdings hat da AGS gemeckert weil das Objekt ja nur lokal bestimmt ist, nicht aber global vorkommt, da man Gespräche mit Charakteren ja scheinbar immer global festlegen muss, auch wenn sie nur in einem einzigen Raum vorkommen (in etwa "ObjektX? Kenn ich nich", also unknown object oMuell). Ergo: Geht so nicht. Ich habe eben versucht die Funktion player.InventoryQuantity[iMuell.1] zu verwenden, allerdings bekomm ich da nur wieder gesagt dass "1" nicht zum allgemeinen Inventar gehört. Allerdings hab ich das doch im Script von Raum 2 festgelegt, dass eben ein Objekt zu Gegenstand 1 im Inventar wird wenn mans aufhebt. Ich schätze da müsste ich wohl GetRoomscript oder so in irgendeiner Weise verwenden?
Möglicher Lösungsansatz für Problem 2:
Vielleicht sollte ich einen unsichtbaren hotspot über den Charakter legen, so dass ich das Gespräch im Raumscript festlegen kann. Dann wäre zumindest schonmal die Sache mit dem Objekt und dem Inventar geklärt weil ich dann einfach VISIBLE verwenden kann.
Nun aber die Sache mit dem Counter...
Hilferuf
Ich hatte ganz vergessen dass man properties festlegen kann. Das hab ich dann auch mal gemacht und die im globalen Script mit if (Property == 0) [...] und property ++; aufgegriffen. Das Problem ist nur dass das dem Raum jetzt wiederum schnurzegal zu sein scheint. Mach ichs ohne else if (also nur else) schreibt er gleich alles, mach ich et mit else if, ändert er den Wert nie oder zeigt zumindest immer nur den selben Dialog an.
Tut mir leid, das ganze ufert gerade aus und ich fühl mich ziemlich verwirrt. Ich wollte nur nicht, dass es so rüberkommt als würde ich nix versuchen und wegen jedem Mist gleich hier angelaufen kommen... ich hoffe dieser quasi-Stream of Consciousness macht hier keinem was aus Habs versucht nochmal etwas zu ordnen.
Der Code sieht JETZT wieder so aus:
Die Nuance mit dem Gegenstand hab ich wegen Testzwecken mit dem ähler erstmal rausgenommen, da ich denke dafür schon eine Lösung gefunden zu haben.
Ich möchte das Thema hier ansonsten gerne mal kapern: Als ich das hier gesehen habe dachte ich mir nämlich ich könnte das in AGS 3.0 für function character_talk verwenden, aber wie sich zeigte gibts da einige Probleme.
Problemstellung
Und zwar geht es darum, dass der Spieler verschiedene Gespräche bekommen soll, je nachdem ob er einen Gegenstand schon hat oder nicht und abhängig davon wie oft er den Charakter schon angesprochen hat. Klingt abstrakt, aber in der Praxis ist es so:
A schmeißt Müll rum und cEgo fordert ihn auf das aufzuheben. Macht A aber nicht. Daraufhin wird cEgo wütend, kommt also zu einem anderen Dialog. Z.b. statt "würdest du das bitte aufheben?" zu "Heb auf oder schieb ab!".
bisherige Versuche:
Ich habs also mit dem int counter usw. von oben versucht, aber wenn ich das
so eingebe
Code: Alles auswählen
function cA_talk()
int counter = 0;
if (counter == 0) {dbitte.Start(); counter ++;}
else if (counter ==1) dAufsMaul.Start();
Ich hab danach mal int counter = 0; im Raumscript eingegeben, aber darauf bekomme ich nur ein verstelltes "Kenn ich nich ( = "counter" ist unbekannt)" zurück.
Ich hab daraufhin nochmal die Hilfedatei bemüht, aber zum Thema Variablen find ich nix außer irgendwelcher Spielvariablen (game.irgendwas), die mich nicht weiterbringen.
Zum zweiten hab ich keine hasItem-Funktion oder so gefunden also war das nächst naheliegende mit if (objekt.Visible == true) (yada yada) zu arbeiten, allerdings hat da AGS gemeckert weil das Objekt ja nur lokal bestimmt ist, nicht aber global vorkommt, da man Gespräche mit Charakteren ja scheinbar immer global festlegen muss, auch wenn sie nur in einem einzigen Raum vorkommen (in etwa "ObjektX? Kenn ich nich", also unknown object oMuell). Ergo: Geht so nicht. Ich habe eben versucht die Funktion player.InventoryQuantity[iMuell.1] zu verwenden, allerdings bekomm ich da nur wieder gesagt dass "1" nicht zum allgemeinen Inventar gehört. Allerdings hab ich das doch im Script von Raum 2 festgelegt, dass eben ein Objekt zu Gegenstand 1 im Inventar wird wenn mans aufhebt. Ich schätze da müsste ich wohl GetRoomscript oder so in irgendeiner Weise verwenden?
Möglicher Lösungsansatz für Problem 2:
Vielleicht sollte ich einen unsichtbaren hotspot über den Charakter legen, so dass ich das Gespräch im Raumscript festlegen kann. Dann wäre zumindest schonmal die Sache mit dem Objekt und dem Inventar geklärt weil ich dann einfach VISIBLE verwenden kann.
Nun aber die Sache mit dem Counter...
Hilferuf
Ich hatte ganz vergessen dass man properties festlegen kann. Das hab ich dann auch mal gemacht und die im globalen Script mit if (Property == 0) [...] und property ++; aufgegriffen. Das Problem ist nur dass das dem Raum jetzt wiederum schnurzegal zu sein scheint. Mach ichs ohne else if (also nur else) schreibt er gleich alles, mach ich et mit else if, ändert er den Wert nie oder zeigt zumindest immer nur den selben Dialog an.
Tut mir leid, das ganze ufert gerade aus und ich fühl mich ziemlich verwirrt. Ich wollte nur nicht, dass es so rüberkommt als würde ich nix versuchen und wegen jedem Mist gleich hier angelaufen kommen... ich hoffe dieser quasi-Stream of Consciousness macht hier keinem was aus Habs versucht nochmal etwas zu ordnen.
Der Code sieht JETZT wieder so aus:
Code: Alles auswählen
// GLOBAL
function cMuellmann_Talk()
{ int Zaehler = 0;
if ( player == cEgo)
dEgoMuellmann.Start();
else if (player == cEgo2)
{if (zaehler == 0)
dEgo2Muellmann1.Start();
Zaehler ++;}
else if (Zaehler ==1)
dEgo2Muellmann2.Start();}
Ich verzweifle derzeit an:
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- gff
- Profi-Abenteurer
- Beiträge: 802
- Registriert: 09.03.2004, 18:49
- Wohnort: Ge
- Kontaktdaten:
Re: Problem mit Variablen
Geht es wenn Du außerhalb der Function schreibst?
Code: Alles auswählen
int Zaehler = 0;
- Außenseiter
- Verpackungs-Wegwerfer
- Beiträge: 58
- Registriert: 14.10.2007, 20:04
Re: Problem mit Variablen
Dann macht er den ersten Durchgang wie gehabt und beim zweiten Mal kommt dann gar nichts mehr komischerweise.
Ich hab das zweite else if ab dem if auch mal in {} gesetzt, aber da tut sich auch nichts. Ich muss da irgendwo eine Kleinigkeit übersehen haben, denn wenn ich die Funktion vom //GLOBALEN in den Raum verfrachte und mit einem einfachen Look/Display verknüpfe funktioniert es wunderbar (ich weiß jetzt auch woran das "kenn ich nich" beim ersten Versuch lag). Ich schau mir den Code mal noch weiter an, aber ich habe noch immer das Problem dass ich nicht weiß wie ich dem Programm im globalen Script verklickern soll dass ein anderer Dialog gesprochen werden soll falls der Spieler den Müll schon aufgehoben hat.
Ansonsten könnt ichs jetzt aber mit Getrickse im Lokalen regeln.
Macht ja keinen Sinn wegen Müll zu meckern wenn gar keiner ist
Jetzt frag ich mich nur woran das liegt, dass er beim Gespräch nix anzeigt... laut Code sollte er doch den zweiten Dialog starten
Fehlermeldungen gibts auch keine mehr.
Ich hab das zweite else if ab dem if auch mal in {} gesetzt, aber da tut sich auch nichts. Ich muss da irgendwo eine Kleinigkeit übersehen haben, denn wenn ich die Funktion vom //GLOBALEN in den Raum verfrachte und mit einem einfachen Look/Display verknüpfe funktioniert es wunderbar (ich weiß jetzt auch woran das "kenn ich nich" beim ersten Versuch lag). Ich schau mir den Code mal noch weiter an, aber ich habe noch immer das Problem dass ich nicht weiß wie ich dem Programm im globalen Script verklickern soll dass ein anderer Dialog gesprochen werden soll falls der Spieler den Müll schon aufgehoben hat.
Ansonsten könnt ichs jetzt aber mit Getrickse im Lokalen regeln.
Macht ja keinen Sinn wegen Müll zu meckern wenn gar keiner ist
Jetzt frag ich mich nur woran das liegt, dass er beim Gespräch nix anzeigt... laut Code sollte er doch den zweiten Dialog starten
Fehlermeldungen gibts auch keine mehr.
Ich verzweifle derzeit an:
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit Variablen
Ich habs jetzt mehr so überflogen, allerdings scheiterst Du "nur" an kleinen Syntaxfehlern.
1. Die erste function wurde nicht mit "{" aufgemacht, deswegen gabs einen parse-Fehler beim "if".
2. Die Variable counter muss außerhalb der Funktion deklariert werden, da sie sonst jedesmal beim Aufruf der Funktion wieder bei 0 anfängt.
3. Ob der Spieler einen Inventargegenstand dabei hat, findet man so heraus:
Character.InventoryQuantity ist ein array, also eine Gruppe gleichnamiger Variablen, die sich durch ihre Index-Nummer unterscheiden, welche in eckigen Klammern angegeben wird. Früher hat man einfach die Zahl im Editor in der Inventory-Liste abgelesen, seit 2.7 geht das bequem mit InventoryItem.ID.
Da man theoretisch einen Gegenstand mehrmals besitzen kann, prüft man einfach, ob die Anzahl größer 0 ist.
4. Was Du mit properties meinst, ist mir nicht ganz klar. Die Custom properties, mit denen ich jedem Objekt/Hotspot/Raum/etc. eine Anzahl von bools, ints und Strings zuweisen kann, sind während des Spiels nicht abänderbar.
Ein Beispiel für die Verwendung wäre eine bool "maennlich", die ich bei weiblichen Charakteren auf "false" setze.
So kann ich im Spiel jederzeit das Geschlecht einer Person prüfen. ( if (cPerson.GetProperty("maennlich")) Display("Person ist männlich."); )
5.
In diesem letzten Code-Abschnitt fällt besonders auf, dass Du Dir viel Arbeit sparen kannst, wenn Du vernünftig einrückst und auf das korrekte Setzen der Klammern achtest.
Du hast Dich auf komplizierte Lösungsalternativen konzentriert, dabei waren lediglich ein paar kleine Schnitzer im ursprünglichen Code. Das Einrücken hilft ungemein, aber auch die Fehlermeldungen von AGS sollte man ganz wörtlich nehmen.
Wenn das berühmte "Undefined Token" kommt, heißt das i.d.R., dass irgendwo weiter oben eine "}" fehlt.
1. Die erste function wurde nicht mit "{" aufgemacht, deswegen gabs einen parse-Fehler beim "if".
2. Die Variable counter muss außerhalb der Funktion deklariert werden, da sie sonst jedesmal beim Aufruf der Funktion wieder bei 0 anfängt.
Code: Alles auswählen
// room script
int counter; // = 0 ist nicht notwendig, ints starten sowieso als 0.
function character_talk() {
if (counter == 0) dBitte.Start();
else dAufsMaul.Start();
counter = 1;
}
Code: Alles auswählen
if (player.InventoryQuantity[iMuell.ID] > 0)
Da man theoretisch einen Gegenstand mehrmals besitzen kann, prüft man einfach, ob die Anzahl größer 0 ist.
4. Was Du mit properties meinst, ist mir nicht ganz klar. Die Custom properties, mit denen ich jedem Objekt/Hotspot/Raum/etc. eine Anzahl von bools, ints und Strings zuweisen kann, sind während des Spiels nicht abänderbar.
Ein Beispiel für die Verwendung wäre eine bool "maennlich", die ich bei weiblichen Charakteren auf "false" setze.
So kann ich im Spiel jederzeit das Geschlecht einer Person prüfen. ( if (cPerson.GetProperty("maennlich")) Display("Person ist männlich."); )
5.
Code: Alles auswählen
int zaehler;
function cMuellmann_Talk() {
if ( player == cEgo) dEgoMuellmann.Start();
else if (player == cEgo2) {
if (zaehler == 0) dEgo2Muellmann1.Start();
else if (zaehler ==1) dEgo2Muellmann2.Start();
zaehler = 1;
}
}
Du hast Dich auf komplizierte Lösungsalternativen konzentriert, dabei waren lediglich ein paar kleine Schnitzer im ursprünglichen Code. Das Einrücken hilft ungemein, aber auch die Fehlermeldungen von AGS sollte man ganz wörtlich nehmen.
Wenn das berühmte "Undefined Token" kommt, heißt das i.d.R., dass irgendwo weiter oben eine "}" fehlt.
Use gopher repellent on funny little man
- Außenseiter
- Verpackungs-Wegwerfer
- Beiträge: 58
- Registriert: 14.10.2007, 20:04
Re: Problem mit Variablen
OK, das hilft mir schonmal eine ganze Ecke weiter
Ich habe das mal umformatiert damit es übersichtlicher wird und habe die ganzen if if if durch && ersetzt (gerade rausgefunden ^^), so dass der Code jetzt so aussieht:
Und nachdem ich es hier gepostet habe ist mir auch aufgefallen warum er mir einen Parse Error gibt. Es muss ja ...ID] == 0 ) sein. Den Fehler habe ich behoben und siehe da, es funktioniert. Heureka
Insofern also: Alles erstmal wunderbar, vielen Dank
Ich hatte zwar in der Hilfedatei zu dem Thema nichts gefunden, aber als ich gestern nochmal die Tutorials auf der Homepage durchgewühlt habe bin ich auf genau das was ich die ganze Zeit gesucht hatte. Da ist auch erklärt wie man solche Variabeln global setzt und abruft. Das hilft mir gerade ziemlich bei einem anderen Problem weiter für das ich genau die Funktionen/Variabeln brauche weil das zwei Zusatzoptionen betrifft, die im regulären AGS nicht mit drin sind.
---------------------------------------------
AKTUALISIERUNG:
Ich habs jetzt mit Zahlen statt Worten versucht und siehe da, es funktioniert einwandfrei und bleibt auch so wie es sein soll. Ergo: Untenstehendes Problem gelöst und wieder etwas schlauer.
Warum schreiben die das bitte nicht ins Tutorial mit rein, dass man bei globalen ints nur zahlen verwenden darf? Ich lass das untenstehende trotzdem mal drin für Interessierte (weiß ja nicht).
----------------------------------------------
Allerdings hab ich damit jetzt auch schon wieder ein Problem.
Ich hab zu Testzwecken mal einen Soundeffekt eingebaut falls die globale Variable auf 1 steht, also eingeschaltet ist. Damit dies standardmäßig wenn man das Spiel startet auch der Fall ist, hab ich folgendes eingebaut:
Dazu dann noch einen Knopf im gPanel um die Variable auf null bzw. wieder auf eins zu setzen:
Das selbe entsprechend für global2
Das scheint soweit alles richtig zu sein und funktioniert scheinbar auch, denn die Anzeige bekomme ich im Wechsel, also so wie es sein sollte wenn man etwas dauernd ein- und ausschaltet.
Allerdings hapert es bei der Probe aufs Exempel, denn wenn selbst wenn ich Global1 ausschalte wird der Testsound trotzdem noch gespielt. Woran könnte das liegen?
Hier der Testlauf:
Wenn ich das ausprobiere bekomme ich jetzt allerdings IMMER den Sound mitabgespielt und auch immer die erste nachricht angezeigt, obwohl er eigentlich die zweite zeigen sollte.
Außerdem ist mir aufgefallen, dass wenn ich global1 abschalte, auch global2 abgeschaltet wird. Das gilt auch umgekehrt und natürlich auch fürs anschalten.
Muss man solche globale Variabeln etwa mit Zahlen statt mit Namen versehen?
In der Hilfsdatei von AGS finde ich dazu mal wieder nichts außer der Auflistung der game.irgendwas-variablen. Außerdem meckert AGS ja nicht wenn ich statt Zahlen Namen eingebe.
Ansonsten funktioniert global2 aber wunderbar (im Gegensatz zu global1) und wenn ich es abschalte werden auch die entsprechenden Zusatzaktionen nicht mehr angezeigt.
Weiteres Problem:
Ich habe gesehen dass ich im Raumscript irgendwo stehen hatte. Also kein Wunder, dass der das Teil nicht verändert hat.
ABER wenn ich das jetzt entferne sagt er mir dass er mit der Befehlszeile "GetGlobalInt(global1)" nichts mehr anfangen kann weil er nicht weiß was global1 ist.
Mit global 2 gehts doch auch wunderbar??
Ich versuchs nochmal mit Zahlen statt mit Worten.
ANMERKUNG: Fehler behoben. Es lag wirklich daran, dass ich Worte für die GlobalInt verwendet habe.
Ich habe das mal umformatiert damit es übersichtlicher wird und habe die ganzen if if if durch && ersetzt (gerade rausgefunden ^^), so dass der Code jetzt so aussieht:
Code: Alles auswählen
int zaehler;
function cMuellmann_Talk()
{
if (player == cEgo)
{
dEgoMuell.Start();
}
else if ((player == cEgo2) && (zaehler == 0) && (player.InventoryQuantity[iDose1.ID] = 0))
{
dEgo2Muell1.Start();
zaehler ++;
}
else if ((zaehler == 1) && (player.InventoryQuantity[iDose1.ID] = 0))
{
dEgo2Muell2.Start();
}
else if (player.InventoryQuantity[iDose1.ID] > 0)
{
dEgo2Muell0.Start();
}
}
Insofern also: Alles erstmal wunderbar, vielen Dank
Das war es mir auch nicht, bis ich irgendwann gestern ein entsprechendes Tutorial ( http://www.bigbluecup.com/actutor.htm" onclick="window.open(this.href);return false; , ziemlich weit unten ) gefunden habe.Was Du mit properties meinst, ist mir nicht ganz klar.
Ich hatte zwar in der Hilfedatei zu dem Thema nichts gefunden, aber als ich gestern nochmal die Tutorials auf der Homepage durchgewühlt habe bin ich auf genau das was ich die ganze Zeit gesucht hatte. Da ist auch erklärt wie man solche Variabeln global setzt und abruft. Das hilft mir gerade ziemlich bei einem anderen Problem weiter für das ich genau die Funktionen/Variabeln brauche weil das zwei Zusatzoptionen betrifft, die im regulären AGS nicht mit drin sind.
---------------------------------------------
AKTUALISIERUNG:
Ich habs jetzt mit Zahlen statt Worten versucht und siehe da, es funktioniert einwandfrei und bleibt auch so wie es sein soll. Ergo: Untenstehendes Problem gelöst und wieder etwas schlauer.
Warum schreiben die das bitte nicht ins Tutorial mit rein, dass man bei globalen ints nur zahlen verwenden darf? Ich lass das untenstehende trotzdem mal drin für Interessierte (weiß ja nicht).
----------------------------------------------
Allerdings hab ich damit jetzt auch schon wieder ein Problem.
Ich hab zu Testzwecken mal einen Soundeffekt eingebaut falls die globale Variable auf 1 steht, also eingeschaltet ist. Damit dies standardmäßig wenn man das Spiel startet auch der Fall ist, hab ich folgendes eingebaut:
Code: Alles auswählen
int global1;
function game_start()
{
mouse.UseModeGraphic(eModePointer);
gIconbar.Visible = false;
gQuit.Visible = false;
SetGlobalInt(global1, 1);
SetGlobalInt(global2, 1);
}
Code: Alles auswählen
// Aus gPanel
function btnpublikum_OnClick(GUIControl *control, MouseButton button)
{
if (GetGlobalInt(global1) == 1)
{
SetGlobalInt(global1, 0);
Display("Global1 ausgeschaltet");
}
else
{
SetGlobalInt(global1, 1);
Display("Global1 angeschaltet");
}
}
Das scheint soweit alles richtig zu sein und funktioniert scheinbar auch, denn die Anzeige bekomme ich im Wechsel, also so wie es sein sollte wenn man etwas dauernd ein- und ausschaltet.
Allerdings hapert es bei der Probe aufs Exempel, denn wenn selbst wenn ich Global1 ausschalte wird der Testsound trotzdem noch gespielt. Woran könnte das liegen?
Hier der Testlauf:
Code: Alles auswählen
// Aus einem Raumscript (also nicht mehr Global, im Gegensatz zu oben)
function hHotspot7_Look()
{
if (GetGlobalInt(global1) == 1 )
{
PlaySound(3);
Display("Sieht aus wie ein Testlauf");
}
else if (GetGlobalInt(global1) == 0 )
{
Display("Sieht aus wie ein Testlauf (unplugged)");
}
}
Außerdem ist mir aufgefallen, dass wenn ich global1 abschalte, auch global2 abgeschaltet wird. Das gilt auch umgekehrt und natürlich auch fürs anschalten.
Muss man solche globale Variabeln etwa mit Zahlen statt mit Namen versehen?
In der Hilfsdatei von AGS finde ich dazu mal wieder nichts außer der Auflistung der game.irgendwas-variablen. Außerdem meckert AGS ja nicht wenn ich statt Zahlen Namen eingebe.
Ansonsten funktioniert global2 aber wunderbar (im Gegensatz zu global1) und wenn ich es abschalte werden auch die entsprechenden Zusatzaktionen nicht mehr angezeigt.
Weiteres Problem:
Ich habe gesehen dass ich im Raumscript irgendwo
Code: Alles auswählen
int global1
ABER wenn ich das jetzt entferne sagt er mir dass er mit der Befehlszeile "GetGlobalInt(global1)" nichts mehr anfangen kann weil er nicht weiß was global1 ist.
Mit global 2 gehts doch auch wunderbar??
Ich versuchs nochmal mit Zahlen statt mit Worten.
ANMERKUNG: Fehler behoben. Es lag wirklich daran, dass ich Worte für die GlobalInt verwendet habe.
Ich verzweifle derzeit an:
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit Variablen
Hmm. Ifs durch && zu ersetzen ist durchaus möglich und teilweise angebracht, aber man kann auch schnell stolpern.
Else (if) behandelt ja das Nichtzutreffen der Bedingung, d.h. durch Verschachtelung der ifs kann man präziser zwischen verschiedenen Situationen unterscheiden. Und man spart Schreibarbeit, wie Du sehen wirst.
Ich würde das z.B. so coden:
Du siehst, dass ich jede der ingesamt drei Bedingungen nur einmal schreiben musste.
Ein && "lohnt" sich IMO erst, wenn es wirklich nur zwei Ergebnisse gibt:("zaehler = 1;" statt "zaehler++;", da Letzteres theoretisch einen Fehler erzeugen kann. In der Praxis wird zaehler zwar 2^15 nicht überschreiten, aber es ist nie verkehrt, auch solche unwahrscheinlichen Fehler von vornherein auszuschließen.
Außerdem kann man bei einem einzelnen Befehl die gruppierenden "{}" weglassen.)
Zu GlobalInts: Die sind für Anfänger gedacht und werden schlicht von 0-500 durchnumeriert, keine Namen.
Du benutzt bereits eigene Variablen, deswegen würde ich die unhandlichen GlobalInts ganz schnell wieder vergessen.
Wenn Du eine eigene globale Variable verwenden möchtest, geht das so:
Beim Exportieren reicht der Name ("gl_var"), beim Importieren hingegen muss der Typ ("int") wieder dabeistehen!
Die export-Zeile muss irgendwann nach der Deklaration stehen, am Besten direkt darunter (wie oben).
Gern gemachter Fehler: die Variable im header deklarieren (statt nur importieren). Das erzeugt einen Satz Variablen, eine fürs global script und eine für jeden Raum, die unabhängig voneinander sind. Kann gewünscht sein, ist es aber i.d.R. nicht.
Else (if) behandelt ja das Nichtzutreffen der Bedingung, d.h. durch Verschachtelung der ifs kann man präziser zwischen verschiedenen Situationen unterscheiden. Und man spart Schreibarbeit, wie Du sehen wirst.
Ich würde das z.B. so coden:
Code: Alles auswählen
int zaehler;
function cMuellmann_Talk() {
if (player == cEgo) dEgoMuell.Start();
else if (player == cEgo2) {
if (player.InventoryQuantity[iDose1.ID] > 0) dEgo2Muell0.Start();
else {
if (zaehler == 0) {
dEgo2Muell1.Start();
zaehler = 1;
}
else dEgo2Muell2.Start();
}
}
}
Ein && "lohnt" sich IMO erst, wenn es wirklich nur zwei Ergebnisse gibt:
Code: Alles auswählen
// pseudocode
if (spieler_unter_dusche && dusche_an && haupthahn_an) Spieler_wird_nass();
else Spieler_bleibt_trocken();
Außerdem kann man bei einem einzelnen Befehl die gruppierenden "{}" weglassen.)
Hehe, weil das bereits im Namen steckt. "int" = Integer = ganze Zahl.Warum schreiben die das bitte nicht ins Tutorial mit rein, dass man bei globalen ints nur zahlen verwenden darf?
Zu GlobalInts: Die sind für Anfänger gedacht und werden schlicht von 0-500 durchnumeriert, keine Namen.
Du benutzt bereits eigene Variablen, deswegen würde ich die unhandlichen GlobalInts ganz schnell wieder vergessen.
Wenn Du eine eigene globale Variable verwenden möchtest, geht das so:
Code: Alles auswählen
// global script
int gl_var;
export gl_var;
// script header
import int gl_var;
Die export-Zeile muss irgendwann nach der Deklaration stehen, am Besten direkt darunter (wie oben).
Gern gemachter Fehler: die Variable im header deklarieren (statt nur importieren). Das erzeugt einen Satz Variablen, eine fürs global script und eine für jeden Raum, die unabhängig voneinander sind. Kann gewünscht sein, ist es aber i.d.R. nicht.
Use gopher repellent on funny little man
- Außenseiter
- Verpackungs-Wegwerfer
- Beiträge: 58
- Registriert: 14.10.2007, 20:04
Re: Problem mit Variablen
Naja, Int hin oder her, aber die lokalen Variablen kann ich ja auch mit INT lustigername bezeichnen ne?
Das hat mich daran verwirrt ^^
Danke dass du mir auch die Fortgeschrittene Variante auflistest, ist gut das zu wissen!
Ich denke aber ich bleibe erstmal bei den beiden unhandlichen Zahlen weils gerade (endlich ) funktioniert. Ich seh mich da durchaus als Anfänger, also ist das OK
Thema if: Findest du wirklich? Ich hatte vorher immer das Problem dass ich bei mehreren Bedingungen sehr schnell sehr verwirrt war, deshalb finde ich die && im Moment eigentlich sehr praktisch, auch wenn man dann vielleicht etwas mehr schreiben muss. Vor allem wegen der vielen {} bei mehreren if-Bedingungen hintereinander bin ich da sehr schnell durcheinandergekommen und hatte schnell Fehler drin die ich erst wieder rauspicken musste, was im Zustand geistiger Verwirrtheit ("Wieso geht das nicht? Sieht doch alles richtig aus?? ") meistens sehr viel Zeit auf sich bringt oder sogar einen neuen Thread im Forum beschert. Deshalb bleib ich lieber erstmal bei den &&.
Dankeschön
Das hat mich daran verwirrt ^^
Danke dass du mir auch die Fortgeschrittene Variante auflistest, ist gut das zu wissen!
Ich denke aber ich bleibe erstmal bei den beiden unhandlichen Zahlen weils gerade (endlich ) funktioniert. Ich seh mich da durchaus als Anfänger, also ist das OK
Thema if: Findest du wirklich? Ich hatte vorher immer das Problem dass ich bei mehreren Bedingungen sehr schnell sehr verwirrt war, deshalb finde ich die && im Moment eigentlich sehr praktisch, auch wenn man dann vielleicht etwas mehr schreiben muss. Vor allem wegen der vielen {} bei mehreren if-Bedingungen hintereinander bin ich da sehr schnell durcheinandergekommen und hatte schnell Fehler drin die ich erst wieder rauspicken musste, was im Zustand geistiger Verwirrtheit ("Wieso geht das nicht? Sieht doch alles richtig aus?? ") meistens sehr viel Zeit auf sich bringt oder sogar einen neuen Thread im Forum beschert. Deshalb bleib ich lieber erstmal bei den &&.
OK!("zaehler = 1;" statt "zaehler++;", da Letzteres theoretisch einen Fehler erzeugen kann.
Dankeschön
Ich verzweifle derzeit an:
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- Eigene GUI zum Laden und Speichern erschaffen
Grund zur Freude:
Hab die Dialogsprache verstanden und kann jetzt lauter lustige Extras einbauen
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
Re: Problem mit Variablen
"Int" ist der Typ. Ob global oder lokal ist völlig egal, "int" heißt nur, dass die Variable ganzzahlige Werte speichert (im Gegensatz zu z.B. Kommazahlen, Zeichenketten o.a. Variablentypen).
Deklariert wird immer mit [Variablentyp] [Variablenname];
Ob lokal oder global ergibt sich daraus, wo deklariert wird.
Wenn Du dich durchaus als Anfänger siehst, solltest Du vielleicht auf mich hören
Bei GlobalInts musst Du eine Liste führen, welche Zahl für welche Spielbedingung steht (nervig), und das if-Ding ist einfach Erfahrungssache.
Meine Methode ist wesentlich fehlersicherer, glaub mir.
Bei drei aufeinanderfolgenden else ifs mit jeweils mehrerern Bedingungen und && dazwischen läuft es ganz fix aus dem Ruder. So einen Logikfehler später finden zu müssen, ist sehr anstrengend und schlicht vermeidbar.
Und wie gesagt: wenn man vernünftig einrückt, hat man auch keine Probleme mit den Klammern.
Aber das lernt man am besten selber mit der Zeit
Deklariert wird immer mit [Variablentyp] [Variablenname];
Ob lokal oder global ergibt sich daraus, wo deklariert wird.
Wenn Du dich durchaus als Anfänger siehst, solltest Du vielleicht auf mich hören
Bei GlobalInts musst Du eine Liste führen, welche Zahl für welche Spielbedingung steht (nervig), und das if-Ding ist einfach Erfahrungssache.
Meine Methode ist wesentlich fehlersicherer, glaub mir.
Bei drei aufeinanderfolgenden else ifs mit jeweils mehrerern Bedingungen und && dazwischen läuft es ganz fix aus dem Ruder. So einen Logikfehler später finden zu müssen, ist sehr anstrengend und schlicht vermeidbar.
Und wie gesagt: wenn man vernünftig einrückt, hat man auch keine Probleme mit den Klammern.
Aber das lernt man am besten selber mit der Zeit
Use gopher repellent on funny little man