Globale Variable

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
rizla
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 11
Registriert: 30.10.2008, 18:23

Globale Variable

Beitrag von rizla »

Hi,
wie kann ich einen String global nutzen (in AGS3.x)?
Habe ein ScummGUI-Tut benutzt, allerdings ist das für ne ältere AGS Version, daher muss ich die umschreiben.
Im GlobalScript.ash hab ich alle Verbs definiert:

Code: Alles auswählen

String vWalkTo;
String vPickUp;
String verb;
...
etc.
In der GlobalScript.asc hab ich die verbs belegt (in GameStart):

Code: Alles auswählen

vWalk = "Gehe zu";
vPickUp = "Hebe auf";
...
etc.
In den RoomScripts (function Object_Interact() oder so ähnlich, sitze nicht davor)
wollte ich dann darauf zugreifen, a la

Code: Alles auswählen

if (verb == vPickUp)     <---------- NPR
{
// action für PickUp
}
Allerdings bekomme ich immer eine "NPR", also NullPointerRef. im RoomScript (s.o.).
Ich weiß, dass ich irgendwo reinschreiben soll:

Code: Alles auswählen

export vWalk, vPickUp, verb...;
Hab das auch ausprobiert, entweder kommen jedoch Compilerfehler und wenn die nicht, dann die NPR.

Hilfe! [-o<
pikubik
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 76
Registriert: 09.04.2006, 17:51
Kontaktdaten:

Re: Globale Variable

Beitrag von pikubik »

also..
ich weiß jetzt nicht genau was du überhaupt machen willst, das ist mir aus deiner beschreibung nicht ganz ersichtlich, jedenfalls ist es so, dass man variablen mit "export" exportieren und anschließend in dem raumscript (bzw das script in dem sie verwendet werden sollen) mit "import" wieder importiert werden müssen

wenn du schreibst was du genau denn bewerkstelligen willst könnte dir vielleicht noch besser geholfen werden
rizla
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 11
Registriert: 30.10.2008, 18:23

Re: Globale Variable

Beitrag von rizla »

Hoi,
wie gesagt, ich benutze ein ScummGui Tutorial, um mir eine GUI zu schreiben.
Leider ist der Code im Tutorial heftig inkompatibel mit AGS3.
Daher muss ich ihn anpassen..

Original: http://www.bigbluecup.com/yabb/index.php?topic=22525

Mein Problem ist jetzt ähnlich dem folgendem:

http://www.bigbluecup.com/yabb/index.ph ... #msg300591

Allerdings sind bei mir nicht die Verben vGive, vPickUp etc.. das Problem, sondern, dass
der String verb leer ist, wenn ich diesen im RoomScript benutzen will, sprich ein Vergleich a la

Code: Alles auswählen

if (verb == vPull)
scheitert an einer NullPointerReferenz-Exception. "Mein" workaround ist nun, in der rep_ex func den String quasi
manuell zu globalisieren a la

Code: Alles auswählen

Game.GlobalStrings[0] = verb;

und in den jeweiligen Object_Interact-Funktionen per

Code: Alles auswählen

verb = Game.GlobalStrings[0];
wieder zu "importieren". So, wie in http://www.bigbluecup.com/yabb/index.ph ... #msg300849
Ich verstehe das nicht, denn wenn ich in anderen Programmiersprachen Variablen im Header deklariere,
kann ich auf die ja auch überall zugreifen. Das mit dem

Code: Alles auswählen

verb = Game.GlobalStrings[0];
find ich recht unschön. Oder ist das der einzige Weg?
Selbst wenn ich im Tab "Global Variables" verb sowie vWalkTo, vPickUp etc. deklariere, ist sie in den jeweiligen Room_Scripts stehts und ständig leer. #-o
Irgendwas mach ich doch falsch, oder?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Globale Variable

Beitrag von KhrisMUC »

Der header wird vor jedes Skript gehängt, d.h. wenn man eine Variable im header deklariert, bekommt jedes Skript eine eigene. Die heißen alle gleich, sind aber nicht gleich; setzt man sie im einen Raum, ist sie überall anders trotzdem 0/null.

Deswegen müssen die Variablen (wie auch im Tutorial beschrieben) an den Anfang des global script.

Um sie global zu machen, müssten sie wie erwähnt ex- und im header importiert werden (ist aber hier nicht nötig afaik):

Code: Alles auswählen

// header

import String vWalkTo;

// global script

String vWalkTo;
export vWalkTo;  // Export ohne Typ!
Jetzt hat man eine, globale Variable.

Es gibt übrigens ein fertiges MI-GUI, das komplett für neuen Code umgeschrieben ist (basiert auf dem Maniac Mansion Mania-Starterpack bzw. MM Deluxe):
http://www.adventure-treff.de/forum/vie ... =7&t=13574
Eine Dokumentation der Funktionen (teilw. veraltet):
http://www.adventure-treff.de/forum/vie ... =16&t=7529
Use gopher repellent on funny little man
rizla
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 11
Registriert: 30.10.2008, 18:23

Re: Globale Variable

Beitrag von rizla »

Danke für die Antwort! :)

Aber wie ist das mit der Variable "verb"?
Die wird ja in der Rep.Ex. immer aktualisiert.
Im Room_Script ist die dann nicht aktuell.
Mach ich die auf die gleiche Weise global?
Oder geht das nur über die Game.GlobalStrings[0]?
Ist ja recht umständlich, wenn man mehr als 10 verschiedene Objects mit Interaction-Scripts hat..

:r:
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Globale Variable

Beitrag von KhrisMUC »

Du musst sie global machen, sonst kennt sie das room script gar nicht.
Und ja, Du musst sie auf die beschriebene Weise global machen.

Man kann auch globale Pointer haben; ein existierender ist z.B. "player" vom Typ "Character"; "player" zeigt immer auf den momentanen Spielercharakter.

In den neueren Versionen gibt es extra einen Menüpunkt "Global variables", mit dem man bequem globale Variablen ohne den ganzen export-import-Kram einrichten kann.
Use gopher repellent on funny little man
rizla
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 11
Registriert: 30.10.2008, 18:23

Re: Globale Variable

Beitrag von rizla »

Joa, das hab ich gemacht, über globale variables.
Also komme ich wohl nicht um das

Code: Alles auswählen

GegenstandXYZ_Interact()
{
 verb = Game.GlobalStrings[0];  <<---  // leider funktionieren die bbcodes nicht inn. von anderen  :? 
 if (verb == vUse)
  { 
  }
}

GegenstandZYX_Interact()
{
  verb = Game.GlobalStrings[0]; <<--- // leider funktionieren die bbcodes nicht inn. von anderen  :? 
  if (verb == vUse)
   { 
   } 
}
herum? Schade..

Danke für deine unendlichen Bemühungen, KHRIS
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Globale Variable

Beitrag von KhrisMUC »

DOCH. DU KOMMST DARUM HERUM.

Ich hab Dir gerade zwei Arten genannt.

a) richte mit AGS 3.x "verb" als globale Variable des Typs String ein.
b)

Code: Alles auswählen

// header
import String verb;

// global script
String verb;
export verb;
Use gopher repellent on funny little man
rizla
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 11
Registriert: 30.10.2008, 18:23

Re: Globale Variable

Beitrag von rizla »

Okay, ich hatte es bereits verstanden und ausprobiert.

Der Fehler liegt allerdings hier:

Code: Alles auswählen

if (button == eMouseLeft) 
  {
      ProcessClick(mouse.x,mouse.y, mouse.Mode);

        StrCopy(verb,  vWalkto);

        mouse.Mode = eModeWalkto;
  }
(Aus dem originalscript kopiert!) Das Problem ist, dass der Character zwar dann zum betreffenden Objekt hingeht,
bevor er jedoch agiert, wird allerdings verb schon vWalkto zugewiesen. Daher ist es kein Wunder,
dass verb im room-script dann nicht mehr stimmt, weil ihm ja bereits vWalkto zugewiesen wurde. Das heißt, der Fehler lag nicht bei mir (also kein Verständnisproblem), denn als ich

Code: Alles auswählen

StrCopy(verb,  vWalkto);
mouse.Mode = eModeWalkto;
auskommentiert habe, hat es funktioniert. Das Problem allerdings ist jetzt, das verb nun vWalkto bleibt.
Oder gibts sowas wie OnInteractionFinished? (in Delphi wäre das ein TNotifyEvent.)

A lá:

Code: Alles auswählen

ProcessClick(mouse.x,mouse.y, mouse.Mode);
if (InteractionFinished)
 {
  StrCopy(verb,  vWalkto); 
  mouse.Mode = eModeWalkto;
 }
?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Globale Variable

Beitrag von KhrisMUC »

ProcessClick landet in der queue und wird erst am Ende der Skriptfunktion ausgeführt (also nachdem verb wieder auf vWalkto gesetzt wurde).

Kurz gesagt, dass Tutorial ist veraltet und fehlerhaft, und es wird neuer mit altem Code gemischt.

Wenn Du nur ein ScummGUI brauchst, nimm mein MI-Template.
Wenn Du die AGS-Skriptsprache lernen willst, schau Dir gründlich die Hilfedatei und mein MI-Template an.
Use gopher repellent on funny little man
Antworten