Maniac Mansion Mania Forum
MMM-Werkzeugkiste => Technik => Newbies => Thema gestartet von: Champ am 23. November 2010, 21:24:50
-
Kurz und knapp:
"Nimm Stift: "Erstmal sehen, was draußen los ist."
(SetGlobalInt (1)==1) (Nur als Beispiel)
(GetGlobalInt(1)==1)
"Nimm Stift: "Her damit!"
Ich habs versucht, aber nun ist das Skript durch herumexperimentieren im Arsch.
Bei schau kommt es wie gewohnt, aber nach benutze kommt ein Standart Kommentar, eine Fehler Meldung,
beide Texte werden angezeigt, es erscheint ein Fehler in einen Skript, welches ich nicht mal angefasst habe, usw.
Hotspot entfernen geht nicht, da 2 Hotspots nicht übereinander liegen können und ein object sollte es nicht sein.
Könnte Hilfe gebrauchen.
-
Mir ist nicht ganz klar, warum ein Stift, der mitgenommen werden kann, nicht als Objekt eingebunden werden soll. Egal.
Ich weiß nicht, mit welchem Starterpack oder welcher AGS-Version Du arbeitest; GlobalInts werden bei älteren Starterpacks verwendet, um den Status von Türen zu speichern, man sollte also pauschal keinesfalls die GlobalInts 1-100 verwenden.
Der Stift wird also erst beim zweiten Mal mitgenommen, richtig? Da gibt es die sehr praktische Funktion DoOnceOnly:
else if (UsedAction(eActPickUp)) {
if (Game.DoOnceOnly("Stift mitnehmen")) player.Say("Erstmal sehen, was draußen los ist.");
else {
player.Say("Her damit!");
oStift.Visible = false;
player.AddInventory(iStift);
}
}
Game.DoOnceOnly("beliebiger Text") ist beim ersten Mal wahr, danach immer falsch. Der Text muss aber einmalig sein, also am besten eine Beschreibung der Situation; theoretisch könnte man aber auch eine beliebige Zeichenfolge nehmen.
Der Code geht natürlich davon aus, dass man den Stift kein drittes Mal nehmen kann, logischerweise wird ja das Objekt nach dem zweiten Mal ausgeschaltet. Wenn Du das um jeden Preis doch als Hotspot einbauen willst, sag Bescheid.
-
Der Stift wird also erst beim zweiten Mal mitgenommen, richtig?
"Nimm Stift: "Erstmal sehen, was draußen los ist." lässt eher vermuten, daß man den Stift erst nehmen darf wenn man draussen war oder aus dem Fenster geguckt hat.
-
Ja, der Stift war ein schlechtes Beispiel. (Da kann ich ja gleich object on/off machen)
Es ist ein Hotspot, welcher mit einen Gegenstand bearbeitet werden kann, und auf zwei ansichten
angeschaut werden kann. (Z.B. Schau an Zettel: "Ein leerer Zettel."
(GetGlobalInt) (Schau an Zettel: "Immernoch ein Zettel."
Was ich vergessen habe zu sagen, ich benutze AGS 2.7.2.
-
Wie schon von KhrisMUC gesagt, lässt sich das auch Prima (sowieso) ohne GIs realisieren.
if(Game.DoOnceOnly("Zettel anschauen")) player.Say("Ein leerer Zettel.");
else player.Say("Immernoch ein Zettel.");
Generell sollte man dennoch auf überflüssige Werte verzichten, und auch hierbei könnte man sich eventuell schon überlegen, einen richtigen Integer oder ein Boolschen Wert zu verwenden, da ein DoOnce-String schon ein bisschen länger ist als ein paar Variablen zu beschreiben. Allerdings lässt sich darüber streiten. GlobalInts sind Mist, punkt.
Erstes Beispiel:
bool bWarDraussen = false; // Im GlobalScript definieren und exportieren mit export bWarDraussen;
function ...() { // Any Click On Hotspot bei Stift
if(UsedAction(eActLookAt)) {
player.Say("Das ist ein Stift.");
} else if(UsedAction(eActPickUp)) {
if(!bWarDraussen) player.Say("Erstmal sehen, was draußen los ist.");
else {
player.Say("Her damit!");
// ...
}
} else Unhandled();
}
-
Falls der Edit nicht gezeigt hat, dass ich was neued geschrieben habe, hier nochmal so.
Wo genau im Globalscript?
Und ich benutze AGS 2.7.2
-
Wo im Globalscript ist prinzipiell egal, solange alle Funktionen, die die Variable verwenden, weiter unten sind.
Mach dir am Bestem der Übersicht halber einen Kommentar mit ein paar Leerzeilen ganz oben:
// meine globalen Variablen
bool WarDraussen;
export WarDraussen;
Jetzt musst Du die Variablendefinition noch im header des Globalscripts importieren:
import bool WarDraussen;
Du kannst jetzt die Variable im Global- und jedem Raumskript verändern oder ihren Wert abfragen.
Wenn Du sie ohne Anfangswert definierst (so wie ich es gemacht habe), ist sie false.
Sobald man also draußen war, setzt man sie auf true:
// innerhalb einer Funktion, z.B. "first time player enters room", room = vor der Haustür
WarDraussen = true;
-
Habe es mal versucht (den Text ändere ich noch) Ergebniss:
(http://npshare.de/files/b458c69a/Fehler.png)
Jedesmal wenn ich nur so ein Script ansehe, fängt mein Gehirn an zu rotieren!
(Eures, nicht meines)
-
Hast du bereits bei der Definition und im import im Header das "b" vor dem "WarDraußen"?
-
Lass es mich so sagen:
:O---
-
Was soviel heißen soll wie.
"Hä? Ich glaube ich blicke nicht richtig durch!"
-
du hast die Variable bWarDraussen schon definiert, oder? ;)
Wie gesagt. Im GlobalScript folgendes einfügen:
bool bWarDraussen;
export bWarDraussen;
und im GlobalHeader:
import bool bWarDraussen;
Warum benutzt du "DisplaySpeech"?
-
HA! champ!! doppelpost ;D
-
HA! Domi!! Wen kümmerts? :police:
-
Doppelposts gelten nach 72 stunden nicht mehr als Doppelpost, wenn wir geade Forum Cherif spieln....
Übrigens dein Post ist völlig unnötig(meiner auch)
-
Display.Speech?
Was ist daran komisch?
Gibts player.say auch in AGS 2.7.2?
-
Achso, du verwendest noch 2.72?
Naja, jedenfalls gibt es das da auch schon.
-
Der erzählt mir immernoch etwas von "undefined symbol".
Das ganze script. (Reihe 530 ist der Fehler)
(http://www.npshare.de/files/6cf9fcfe/1.png)
Global script:
(http://www.npshare.de/files/f852ffd4/2.png)
Script header:
(http://www.npshare.de/files/ec0892a3/3.png)
Vergisst nicht, AGS 2.7.2, falls das wichtig ist.
-
Ich glaub bei den Variablen war das bei 2.72 ein bisschen anders...
Was ist der Grund, dass du nicht mit 3.x anfängst?
-
Der Grund war, das ich eigentlich mit MD anfangen wollte und die
anderen Versionen nicht kompartiebel sind.
Daher habe ich angefangen mich in AGS 2.7.2 einzuarbeiten.
-
Die Variable wird bei Dir als "WarDraussen" deklariert und ex- und importiert; in Zeile 530 verwendest Du aber "bWarDraussen". Einfach das b weg, dann passts.
In meinen Beispiel hab ich kein b davor, und genau das hat dann erst Timer und dann Endres angesprochen...
Ist doch auch logisch, dass AGS "bWarDraussen" nicht kennt, wenn Du die Variable "WarDraussen" nennst...
-
Achso, das hatte ich wiederum übersehen... ;D