Mousemodecycle und InventarGui...

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7306
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Mousemodecycle und InventarGui...

Beitrag von Fightmeyer »

Hallo Leute,

hab jetzt nach langer Zeit mal wieder was mit AGS gemacht (natürlich aktuellste Version) und stehe tierisch auf den Schlauch, bei im Betreff genannten Themen. Da hat sich ja ne Menge zu 2.7x getan...

Folgender IST-Zustand:
Ich habe ein neues Spiel mit dem defaulttemplate erstellt.
Dann hab ich die Mausmodes rausgeschmissen, die ich nicht brauche. Das habe ich im globalscript gemacht. Sieht so aus:

Code: Alles auswählen

function on_mouse_click(MouseButton button) {
  // called when a mouse button is clicked. button is either LEFT or RIGHT
  if (IsGamePaused() == 1) {
     // Game is paused, so do nothing (ie. don't allow mouse click)
  }
  else if (button == eMouseLeft) {
    ProcessClick(mouse.x, mouse.y, mouse.Mode );
  }
  else if (button == eMouseRight || button == eMouseWheelSouth){
    // right-click our mouse-wheel down, so cycle cursor (beschraenkt auf Gehen; Ansehen; Benutzen)
    if (mouse.Mode == eModeWalkto) {
        mouse.Mode = eModeLookat;
    }
    else if (mouse.Mode == eModeLookat) {
        mouse.Mode = eModeInteract;
    }
    else {
        mouse.Mode = eModeWalkto;
    }
  }
}
Das funktioniert auch so weit. Ich kann mit der rechten Maustaste durch "gehen" "ansehen" und "benutzen" wechseln.

Dann habe ich das InventarGui aus dem Defaulttemplate überarbeitet. Ich habe es permanent eingeblendet gelassen (oberer Rand), hab die Itemliste auf eine Zeile reduziert und nur die Pfeile für links und rechts gelassen.

Ziel ist es, dass man beim Klicken auf einen Gegenstand mit der linken Maustaste, den Gegenstand als Mauszeiger übernimmt. (also eModeUseInv) Bei einem Rechtsklick auf einen Gegenstand soll dann der entsprechende "Betrachtentext" zu dem jeweiligen Gegenstand kommen. Ich hab irgendwie keinen Plan, wie ich das anfangen soll. Die neue Syntax ist für mich noch ein Buch mit 7 Siegeln.

Zum einen müsste man ja sicherstellen, dass der Mausmodecycle auf der InventarGui nicht greift und zum anderen müssten ja irgendwie die einen Absatz höherer beschriebenen Funktionen umgesetzt werden.

Kann mir da jemand von euch bitte einen Tipp oder Hinweis geben? Wie gesagt, als Basis habe ich momentan das Defaulttemplate. Ich hab auch schon versucht das Script an der entsprechenden Stelle im GlobalScript anzupassen, aber ich steig da irgendwie nicht durch.

Besten Dank schon mal im Vorraus!
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Mousemodecycle und InventarGui...

Beitrag von KhrisMUC »

Der einzige zusätzliche Modus ist eModeTalkto, da müsste es reichen, wenn Du in den Eigenschaften den Wert von "StandardMode" auf "false" setzt.

Wenn Du Klicks auf Inventargegenstände selbst abwickeln willst, musst Du in den General settings bei Inventory die Option "Override built-in..." auf True setzen.
Jetzt kannst Du mittels eMouseLeftInv und eMouseRightInv in on_mouse_click festlegen, was passieren soll.

Auch eine Überlegung wert: soll im Interact-Modus bei einem Rechtsklick zum aktiven Inventargegenstand gewechselt werden oder zu Gehen?

eMouseLeftInv und eMouseRightInv greifen übrigens nur, wenn die Maus über einem Inventargegenstand ist (der angeklickte Gegenstand ist inventory[game.inv_activated]), alle anderen Klicks landen in gInventory_OnClick(), falls vorhanden.
Use gopher repellent on funny little man
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7306
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Mousemodecycle und InventarGui...

Beitrag von Fightmeyer »

Danke. Ich wurstel mich mal durch. Mal sehen, wie weit ich komme. Gibt es eigentlich eine Übersicht, in der alle Ereignisse für das globale Script und für Room-Scripts aufgelistet und erklärt werden?

Das ist momentan mein Hauptproblem, dass ich nicht weiß, welche Ereignisse ich direkt aus dem Skript heraus ansprechen kann.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Mousemodecycle und InventarGui...

Beitrag von KhrisMUC »

Use gopher repellent on funny little man
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7306
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Mousemodecycle und InventarGui...

Beitrag von Fightmeyer »

Danke. Das hilft mir schon mal weiter.
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7306
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Mousemodecycle und InventarGui...

Beitrag von Fightmeyer »

Also ich steig einfach nicht durch.
Ich hab in den Generel Settings die obengenannte Option eingestellt.

Dann habe ich angefangen mein Button-Klick-Script zu überarbeiten.
Sieht jetzt so aus.

Code: Alles auswählen

function on_mouse_click(MouseButton button) {
  // called when a mouse button is clicked. button is either LEFT or RIGHT
  if (IsGamePaused() == 1) {
     // Game is paused, so do nothing (ie. don't allow mouse click)
  }
  else if (button == eMouseLeft) {
    ProcessClick(mouse.x, mouse.y, mouse.Mode );
  }
  else if (button == eMouseRight || button == eMouseWheelSouth){
    // right-click our mouse-wheel down, so cycle cursor (beschraenkt auf Gehen; Ansehen; Benutzen)
    if (mouse.Mode == eModeWalkto) {
        mouse.Mode = eModeLookat;
    }
    else if (mouse.Mode == eModeLookat) {
        mouse.Mode = eModeInteract;
    }
    else {
        mouse.Mode = eModeWalkto;
    }
  }
  if (button== eMouseLeftInv) {
    ProcessClick(mouse.x, mouse.y, eModeUseinv );
  }
}
Entscheidend ist die letzte IF-Anweisung. Aber ich vermute mal, dass das kompletter Unsinn ist. Eigentlich soll als Ergebnis beim Klick mit der linken Maustaste auf ein Inventargegenstand im Inventar der entsprechende Gegenstand zum Mauszweiger werden. KLappt aber so noch nicht. Wie muss die Funktion aussehen, dass das klappt? Bei einem Rechtsklick auf einen Inventargegenstand soll der Text für das "Ansehen" des Gegenstandes kommen. (hab ich aber noch nicht eingebaut, da ja noch nicht mal das selektieren funktioniert)

Ich greife dabei die Idee von DIr auf, so dass man im Inventarbereich dieses Mousemodecycle generell nicht braucht. Praktisch wäre es lediglich, wenn der Mauszeiger automatisch zum "Interagieren"-Mauszeiger wird, sobald man in den Inventarbereich mit der Maus kommt. Aber selbst das krieg ich nicht hin.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Mousemodecycle und InventarGui...

Beitrag von KhrisMUC »

Mauszeiger wechselt über Inventar:

In repeatedly_execute:

Code: Alles auswählen

  GUIControl*gc = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
  if (gc == invCustomInv) {   // Maus über Inventarfenster?
    if (mouse.Mode != eModeInteract && mouse.Mode != eModeUseinv)
      mouse.Mode = eModeInteract;
  }
Inventar-Klicks:

Code: Alles auswählen

// Anfang von on_mouse_click:

  InventoryItem*ia = inventory[game.inv_activated];  // falls Klick auf Inv Item, in ia speichern
 
  // dann:
  ...
  else if (button == eMouseLeftInv) {
    if (mouse.Mode == eModeUseinv) ia.RunInteraction(eModeUseinv);  // aktuelles Item mit ia benutzen
    else player.ActiveInventory = ia;  // angeklicktes Item auswählen
  }
  else if (button == eModeRightInv) {
    if (mouse.Mode == eModeUseinv) player.ActiveInventory = null;  // aktives Item abwählen
    else ia.RunInteraction(eModeLookat);  // angeklicktes Item anschauen
  }
ProcessClick geht durch GUIs durch; GUI-Klicks müssen immer direkt verarbeitet werden.
Use gopher repellent on funny little man
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7306
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Mousemodecycle und InventarGui...

Beitrag von Fightmeyer »

Nochmals vielen Dank. Der automatische Mauszeigerwechsel, sobald man über das GUI navigiert funktioniert.
Auch das Selektieren der Items funzt. Aber das "Anschauen" mittels rechter Maustaste klappt nicht. Es passiert gar nichts beim Rechtsklick.
(außer wenn man über einen anderen GEgenstand ist; dann wird, wie im Code angegeben, das aktuelle Item abgewählt)
Ist der Befehl "ia.RunInteraction(eModeLookat)" wirklich richtig?


Grundsätzlich habe ich noch ne andere Frage. Kannst Du mir vielleicht mal kurz die einzelnen Bestandteile dieser Zeile hier erklären?!

Code: Alles auswählen

InventoryItem*ia = inventory[game.inv_activated];
Ich kann das Sternchenzeichen nicht deuten und auch den Teil rechts vom =.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Mousemodecycle und InventarGui...

Beitrag von KhrisMUC »

Da war noch ein Fehler in meinem Code, aber den hast Du gefunden, oder?
eMouseRightInv, nicht eModeRightInv.

Sorry, falls ich das missverstanden habe, aber ia.RunInteraction(eModeLookat) alleine bewirkt noch nichts, es muss auch eine Funktion geben, die ausgeführt wird, sprich, sie muss bei "look at inventory item" verlinkt sein und in irgendeiner Form eine Beschreibung ausgeben.
Ich habs getestet und bei mir funktioniert es einwandfrei.

Man kann auch ein Custom Property für alle Inventargegenstände anlegen, das den Beschreibungstext enthält und den dann automatisch ausgeben, z.B. so:

Code: Alles auswählen

    String d = ia.GetTextProperty("desc");
    if (d != "process") player.Say(d);
    else ia.RunInteraction(eModeLookat);
Jetzt kann man einfach jedem Gegenstand eine Beschreibung verpassen und in speziellen Fällen, wenn sich z.B. eine Nahansicht öffnen soll, "process" eintragen und dann wie gehabt die Funktion "iItemName_Lookat()" verlinken.

Code: Alles auswählen

InventoryItem*ia = inventory[game.inv_activated];
Hier deklariere ich einen sogenannten pointer (ia), deswegen der Stern. Der Typ ist ein InventoryItem; ia zeigt erstmal ins Leere (ia == null). Gleichzeitig weise ich inventory[game.inv_activated] zu, d.h. ia zeigt nun auf das angeklickte Item.
game.inv_activated ist eine Variable (Typ int), die die ID des angeklickten Items enthält. inventory[] ist ein Array von AGS, der alle Inventargegenstände enthält.

Der Unterschied zwischen einem Pointer und einer normalen Variablen (z.B. "int a = 3;") ist, dass er nicht einen konkreten Wert enthält, sondern auf eine Datenstruktur zeigt.
Wenn also z.B. iKey angeklickt wird, und ia nun auf iKey zeigt, dann ist ia.Name gleichwertig mit iKey.Name. Ich kann also z.B. den Namen des Inventargegenstands lesen oder verändern, ohne zu wissen, welches angeklickt wurde.

Ein von AGS deklarierter Pointer des Typs Character ist z.B. "player", der zeigt auf den aktuell gesteuerten Charakter.
Use gopher repellent on funny little man
Benutzeravatar
Fightmeyer
Riesiger Roboteraffe
Riesiger Roboteraffe
Beiträge: 7306
Registriert: 16.12.2004, 22:51
Wohnort: Potsdam
Kontaktdaten:

Re: Mousemodecycle und InventarGui...

Beitrag von Fightmeyer »

KhrisMUC hat geschrieben:Da war noch ein Fehler in meinem Code, aber den hast Du gefunden, oder?
eMouseRightInv, nicht eModeRightInv.
Ja. Das hatte ich dann anhand der Debuggermeldung entdeckt und korrigiert.

Das mit den Properties habe ich gerade eingebaut. Klappt prima. Besten Dank!

Und auch besten Dank für die Pointererklärung. Auch wenn ich selber das nicht so hinbekommen hätte, so habe ich es doch zumindest nun verstanden und nachvollziehen können.
Antworten