Script-Probleme

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
AlphaBolley
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 53
Registriert: 07.03.2006, 15:52
Wohnort: Iserlohn
Kontaktdaten:

Script-Probleme

Beitrag von AlphaBolley »

Hallo erstmal!

Ich habe mir vor etwa einer Woche mal AGS heruntergeladen und mich seitdem intensiv eingearbeitet (was aufgrund ein bisschen Programmiererfahrung auch recht gut klappte).

Hab mir die etwas veraltete MI-Demo von Lucasfan heruntergeladen, mit den neuen Befehlen von 2.7 aktualisiert und das GUI-System in großen Teilen neu geschrieben, hänge nun aber an einem Problem fest.

Den Objekten, Hotspots und Charakteren hab ich die Property "stdMode" gegeben, in der die Standardinteraktion gespeichert ist (also zum Beispiel, dass sich geschlossene Türen bei Rechtsklick öffnen, mit Personen geredet wird, etc.)

Nun soll die globale Funktion on_mouse_click diese Property abfragen, wozu soweit ich das sehe, zunächst einmal festgestellt werden muss, was sich unter dem Cursor befindet und dann muss die Property geholt werden. Das hab ich zunächst einmal so realisiert:

Code: Alles auswählen

#sectionstart on_mouse_click  // DO NOT EDIT OR REMOVE THIS LINE

function on_mouse_click(int button) {

...

if (GetLocationType(mouse.x, mouse.y) == 1)
    handlingModus = Hotspot.GetAtScreenXY(mouse.x, mouse.y).GetProperty("stdMode");
else if (GetLocationType(mouse.x, mouse.y) == 2)
    handlingModus = Character.GetAtScreenXY(mouse.x, mouse.y).GetProperty("stdMode");
else if (GetLocationType(mouse.x, mouse.y) == 3)
    handlingModus = Object.GetAtScreenXY(mouse.x, mouse.y).GetProperty("stdMode");

...

}
#sectionend on_mouse_click  // DO NOT EDIT OR REMOVE THIS LINE
Dummerweise scheint das nicht zu gehen, da diese Zeile nicht übersetzt werden kann (und die beiden anderen ähnlichen):

handlingModus = Hotspot.GetAtScreenXY(mouse.x, mouse.y).GetProperty("stdMode");

Offenbar können die beiden Methoden nicht so aneinander gereiht werden.

Wie kann ich das Problem lösen?
Muss ich erst nur "Hotspot.GetAtScreenXY(mouse.x, mouse.y)" anwenden und als neuen Hotspot speichern, dessen Property ich anschließend abfrage? Und wenn ja, wie mach ich das?

Ich hoffe mal, ich hab euch nicht überfordert und ihr könnt mir helfen :D
Zuletzt geändert von AlphaBolley am 16.03.2006, 16:54, insgesamt 1-mal geändert.
100,5% Sinnlos
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Properties abfragen bei on_mouse_click

Beitrag von KhrisMUC »

AlphaBolley hat geschrieben:Muss ich erst nur "Hotspot.GetAtScreenXY(mouse.x, mouse.y)" anwenden und als neuen Hotspot speichern, dessen Property ich anschließend abfrage?
Ja, nämlich so:

Code: Alles auswählen

#sectionstart on_mouse_click  // DO NOT EDIT OR REMOVE THIS LINE

function on_mouse_click(int button) {

Hotspot *hot;
Object *obj;
Character *cha;

...

if (GetLocationType(mouse.x, mouse.y) == 1) {
  hot = Hotspot.GetAtScreenXY(mouse.x, mouse.y);
  handlingModus = hot.GetProperty("stdMode");
}
else if (GetLocationType(mouse.x, mouse.y) == 2) {
  cha = Character.GetAtScreenXY(mouse.x, mouse.y);
  handlingModus = cha.GetProperty("stdMode");
}
else if (GetLocationType(mouse.x, mouse.y) == 3) {
  obj = Object.GetAtScreenXY(mouse.x, mouse.y);
  handlingModus = obj.GetProperty("stdMode");
}
...

}
#sectionend on_mouse_click  // DO NOT EDIT OR REMOVE THIS LINE
Use gopher repellent on funny little man
Benutzeravatar
AlphaBolley
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 53
Registriert: 07.03.2006, 15:52
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von AlphaBolley »

Okay, danke schön!

Hätte ich irgendwie auch selbst drauf kommen können.
100,5% Sinnlos
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Stimmt ;)

Ne, Schmarrn, aber bei sowas ist der Editor hilfreich, wenn man nämlich den Punkt nach Hotspot.GetAtScreenXY(mouse.x, mouse.y) setzt, kommt keine Auswahlbox mit Hotspot.*-Befehlen. Ein sicheres Zeichen, dass es nicht geht.

Aber es ist durchaus möglich, das eine zukünftige AGS-Version so etwas mal unterstützt.
Use gopher repellent on funny little man
Benutzeravatar
AlphaBolley
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 53
Registriert: 07.03.2006, 15:52
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von AlphaBolley »

Hat jetzt übrigens auch funktioniert.

Dafür gibt's aber schon ein weiteres Problem.

Da ich ja mehr Verben benutze als in AGS Cursor-Modi vorgesehen sind, wird bei Interaktion mit Hotspots/Objects eine entsprechende Stelle im Roomscript aufgerufen, auch wenn für die gewählte Interaktion gar keine spezielle Behandlung vorgesehen ist.

Deshalb würde ich von dort aus gerne auf unhandling_event aus dem global script verweisen.

Bei den Interaktionsscripts im Inventar hab ich das durch den Aufruf "unhandling_event(5,0)" erreicht.

Gibt's ne Möglichkeit das auch von den Roomscripts aus aufzurufen?

EDIT: hab mal entsprechend den Thread-Titel angepasst
100,5% Sinnlos
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Nach der Funktionsdefinition im global script exportierst Du die Funktion.

global script:

Code: Alles auswählen

...
...

function unhandled_event(int what, int type) {
  ...
  ...
}

export unhandled_event;
Im script header wird sie importiert, allerdings im Gegensatz zum Exportieren mit Parametern!

script header:

Code: Alles auswählen

import function unhandled_event(int what, int type);
Jetzt kann von jedem script auf die Funktion zugegriffen werden.
Use gopher repellent on funny little man
Benutzeravatar
AlphaBolley
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 53
Registriert: 07.03.2006, 15:52
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von AlphaBolley »

Nochmals vielen Dank!

Damit sollte eigentlich erst einmal alles so laufen, wie ich mir das gedacht habe.

Aber das nächste Problem kommt bestimmt :wink:
100,5% Sinnlos
strazer
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 35
Registriert: 17.06.2005, 14:22

Beitrag von strazer »

export unhandled_event;
Dies ist unnötig. Funktionen müssen nicht exportiert werden, nur Variablen.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Hey cool, man lernt nie aus :)
Use gopher repellent on funny little man
[ZENSIERT]
Adventure-Gott
Adventure-Gott
Beiträge: 4575
Registriert: 13.07.2004, 14:04
Wohnort: Da wo muss
Kontaktdaten:

Beitrag von [ZENSIERT] »

Also khris, jetzt bin ich aber überrascht von dir. Das weiß doch sogar ich ;)
Es heißt, Leute mit den originellsten Nicknames schreiben die besten Beiträge

Ausnahmen bestätigen die Regel
_________________
<Problem> Weil du denken kannst.

Zuletzt bearbeitet von [ZENSIERT] am 16.07.1759, 16:19, insgesamt 54743869-mal bearbeitet
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ich wußte es nicht, na und, dafür hab ich nen ellenlangen Pimmel :mrgreen:
Use gopher repellent on funny little man
Benutzeravatar
Tentankel
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 77
Registriert: 23.10.2005, 14:10
Wohnort: Schwarzwald

Beitrag von Tentankel »

Wo kann man sich das Demo von Lucasfan runterladen???
„Ich habe nur einen Wunsch, weißt du. Es gibt nur eine Sache die ich verwirklicht sehen will. Ich möchte, dass die Menschheit miteinander lebt - schwarz, weiß, chinesisch, jeder - das ist alles.“ |Robert (Bob) Nesta Marley|
Benutzeravatar
AlphaBolley
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 53
Registriert: 07.03.2006, 15:52
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von AlphaBolley »

So, es ist mal wieder eine neue Frage aufgetaucht, aber wohl wesentlich schneller zu beantworten:

Nur, damit ich mir nicht unnötig Arbeit mache:
Es ist in AGS nicht möglich, objekt-orientierte Methoden zu schreiben, sondern nur globale Funktionen, oder?

Konkret:
Es ist nicht möglich, eine Methode "spring()" zu schreiben, die sich für Objekte vom Typ character aufrufen lässt, also

Code: Alles auswählen

cEgo.spring();
sondern ich müsste eine globale Funktion schreiben, der ich den Charakter als Parameter übergebe, also z.B.

Code: Alles auswählen

spring(cEgo);
Ersteres fände ich nämlich schöner, aber das ist offenbar nicht machbar. Ich wüsste zumindest nicht wie, da ja keine Klassen anlegen kann.

Ihr braucht also nur antworten mit "Nope, is nich!", das reicht mir.
Tentankel hat geschrieben:Wo kann man sich das Demo von Lucasfan runterladen???
Such einfach irgendwo im Netz. In den Tutorien vom Adventure-Treff ist's glaub ich auch, kann mich aber auch irren.
100,5% Sinnlos
strazer
Komplettlösungsnutzer
Komplettlösungsnutzer
Beiträge: 35
Registriert: 17.06.2005, 14:22

Beitrag von strazer »

Für eingebaute ("managed") Klassen wie Charaktere geht das nicht, stimmt.
Man kann aber selbst Klassen erstellen, z.B. so etwas:

Code: Alles auswählen

// global script header

struct MeineCharakterKlasse {
  import function Spring(int wiehoch);
  int Nummer; // speichert die ID des zugehörigen Characters
};

Code: Alles auswählen

// global script

MeineCharakterKlasse meinecharaktere[AGS_MAX_CHARACTERS]; // erzeugen eines Arrays aus der Klasse

//----------------------------------------

function MeineCharakterKlasse::Spring(int wiehoch) {

  // der Springen-Code, z.B. character[this.Nummer].z += wiehoch;

}

//----------------------------------------

function game_start() {

  //--
  // Initialisierung
  //--
  int charid = 0;
  while (charid < GetGameParameter(GP_NUMCHARACTERS, 0, 0, 0)) { // wiederhole für alle Characters

    meinecharaktere[charid].Nummer = charid; // speichern der ID des zugehörigen Characters im Array

    charid++; // nächster Character
  }
  //--

}
So kann man dann in seinen Skripts dies machen:

Code: Alles auswählen

// script

  meinecharaktere[DETLEF].Spring(10);
Sicherlich nicht unbedingt besonders komfortabel, aber für bestimmte Einsatzzwecke sehr nützlich.

(Code nicht getestet.)
Benutzeravatar
AlphaBolley
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 53
Registriert: 07.03.2006, 15:52
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von AlphaBolley »

Oh, das ist mehr, als ich erwartet hatte.
Danke schön für die ausführliche Erklärung.
strazer hat geschrieben:Sicherlich nicht unbedingt besonders komfortabel, aber für bestimmte Einsatzzwecke sehr nützlich.
Da hast du recht.
Für meine aktuellen Probleme werde ich wohl einfach eine globale Funktion schreiben (bzw. ich hab's schon getan), die den Charakter als Parameter bekommt.

Aber vielleicht ist das später mal nützlich zu wissen.
100,5% Sinnlos
Antworten