Autor Thema: GUI-Interface wird eingeblendet, obwohl dies nicht erfolgen soll  (Gelesen 867 mal)

MalleTheRedPhoenix

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1264
  • Geschlecht: Männlich
    • Profil anzeigen
Hallo zusammen,

bei der Erstellung des Starterpacks habe ich ein Problem, was mir momentan mächtig Kopfschmerzen bereitet.

Ich arbeite mit dem Thumbleweed-Template und schildere folgendes Problem:

Ich habe für einen Raum beim before fade-in den Befehl eingegeben, dass sowohl das Main- als auch das Action-Interface ausgeschaltet werden soll. Zudem soll sich die Grafik des Mauszeigers ändern.

Hier das Skript:

Zitat
function room_Load()
{
 player.Transparency=true;
 mouse.UseModeGraphic(eModePC);
 mouse.ChangeModeHotspot(eModeWalkto, 0, 0);
 gMain.Visible = false;
 gAction.Visible = false;
}

Klappt soweit alles schön und gut.

Dann habe ich einen Dialog geschrieben und am Ende des Dialoges habe ich folgendes Skript geschrieben:

Zitat
@5
Cheryl: Bye, baby.
  cCheryl.ChangeRoom(-1, 180, 92, eDirectionUp);
  object[0].SetView(27, 2);
  object[2].Visible=true;
  mouse.UseModeGraphic(eModePC);
  mouse.ChangeModeHotspot(eModeWalkto, 0, 0);
  gMain.Visible = false;
  gAction.Visible = false;
stop

Sobald der Dialog beendet wird, tauchen die beiden genannten GUIs dennoch auf, obwohl ich extra davor geschrieben habe, dass sie weiterhin nicht sichtbar sein sollen. Auch die Mausgrafik ändert sich nicht und ist wieder im vorherigen Zustand. Ich habe das Ganze, wie hier dargestellt, direkt in der Dialog-Funktion eingeführt und auch separat (also nicht gleichzeitig!) über die run-script-Funktion im GlobalScript probiert. Keine Besserung.

Ich habe im GlobalScript keinen Anhaltspunkt gefunden, ob es dort einen Befehl gibt, der am Ende eines Dialoges ausgeführt wird, dass die beiden GUIs wieder aktiviert werden sollen.

Ich hoffe ihr könnt mir bei diesem Problem helfen.

Danke auf jeden Fall im voraus.
Wie Phönix aus der Asche.

Neue Charaktere und Starterpack für MMM und MOR in Arbeit.

Cmdr

  • volljähriger Tentakel
  • *****
  • Beiträge: 752
    • Profil anzeigen
Re: GUI-Interface wird eingeblendet, obwohl dies nicht erfolgen soll
« Antwort #1 am: 03. Dezember 2024, 08:32:51 »
Ich habe leider keine spontane Lösung für dein Problem. Am ehesten könnte ich mir vorstellen, dass das GUI an anderer Stelle wieder eingeschaltet wird.

Aber noch ein kleiner Hinweis am Rande:
  mouse.UseModeGraphic(eModePC);
  mouse.ChangeModeHotspot(eModeWalkto, 0, 0);
  gMain.Visible = false;
  gAction.Visible = false;

Diesen Codeblock hast du in deinem Post bereits 2 mal. Solch duplizierter Code ist immer blöd, weil er schwer zu warten ist.
Will man eine kleine Anpassung daran machen, muss man alle anderen Stellen im gesamten Code heraussuchen und ebenfalls anpassen.
(Und da der Teufel ein Eichhörnchen ist, vergisst man mit Sicherheit eine Stelle  ;) ).
In den alten Episoden und Starterpacks findet man solche Stellen zu hauf, was die Entwicklung aus meiner Sicht stark erschwert.
Deshalb fände ich es wichtig, bei einem neuen Starterpack direkt auf solchen Codestyle zu achten.

Am Besten lagerst du solche Blöcke in eigene Funktionen aus (entweder im GlobalScript - oder noch besser in eigenständige Scriptmodule), die du dann an benötigter Stelle einfach aufrufst.
In meinen Episoden habe ich so verschiedenste Funktionen gescriptet, die ich gerne mal zukommen lassen kann.
Für die GUI habe ich z.B. auch schon ohne Mausmodus-Änderung folgende Funktion:

function SetGuiVisible(bool visible)
{
  gMain.Visible= visible;
  gAction.Visible=visible; 
}

Die rufe ich im Script an geeigneter Stelle mit SetGuiVisible(false); auf.
In diesem Fall ist es nicht so viel Ersparnis, aber mit der Erweiterung um den Mausmodus aus meiner Sicht absolut notwendig.

Cone Arex

  • Mod
  • alter Tentakel
  • **
  • Beiträge: 2327
  • Geschlecht: Männlich
  • Skandal-Entwickler und Idiot
    • Profil anzeigen
    • Conequest
Re: GUI-Interface wird eingeblendet, obwohl dies nicht erfolgen soll
« Antwort #2 am: 04. Dezember 2024, 00:26:27 »
Zitat
Am ehesten könnte ich mir vorstellen, dass das GUI an anderer Stelle wieder eingeschaltet wird.
Dies.
Genauer wird es in der repeatedly_execute() im CustomDialogGui.asc wieder eingeschaltet:
function repeatedly_execute()
{
  if (CDG_options.reset_scrollstate) {
    if (CDG_options.dialog_options_upwards) CDG_options.scroll_from =0;
    else CDG_options.scroll_from = 1;
  }
  if (in_speech == true) {
    in_speech = false;
    if (CDG_options.hide_gui_while_dialog == true && gMain.Visible == false && gAction.Visible == false) {
      gMain.Visible = true;
      gAction.Visible = true;
    }
  }
}
Ohne trifftigen Grund bitte nicht an dem Script rumfummeln!

Das Template bietet bereits die Option, das automatische ein- und ausschalten des GUIs bei den Dialogen abzustellen. In TemplateSettings.asc die Zeile
CustomDialogGui.DialogGuiOptions[eDialogGui_hide_gui_while_dialog]   = true;  suchen und auf false ändern. Daraus folgt natürlich, das man nun als Entwickler selbst dafür sorgen muss, das Interface für die Dialoge abzustellen.

Was den Mauszeiger angeht: Der wird auch irgendwo wieder zurückgesetzt. Wo genau habe ich nicht rausfinden können. Eine schmutzigen Workaround habe ich dafür: Deklarier eine Globale Variable vom Typ bool im GlobalScript oder vorzugsweise in einem eigenen Script (welches in der Rangfolge über dem GlobalScript stehen muss):
bool DialogCherylFinished;
export DialogCherylFinished;
Im Script Header dann:
import bool DialogCherylFinished;damit die Variable überall sichtbar ist. Im Dialogscript setzt du die Variable dann auf true sobald der Dialog beendet werden soll. Im Raum selbst prüfst du dann in der Repeated_Execute-Funktion auf diese Variable, setzt deinen Code in den Block und setzt anschließend die Variable wieder auf false:

function room_RepExec()
{
  if (DialogCherylFinished)
  {
    mouse.UseModeGraphic(eModePC);
    mouse.ChangeModeHotspot(eModeWalkto, 0, 0);
    DialogCherylFinished = false;
  }
}
Dieser Codeblock wird dann erst nach dem Abschalten des Dialogs ausgeführt. Heißt: Der Dialog setzt erst den Mouse Cursor zurück und anschließend setzt du den Cursor wieder auf deine Grafik. Das kann den Effekt haben, dass für einen Moment der Cursor die Standardgrafik hat ehe er wieder deine Customgrafik hat. Von daher ist das auch nicht die Ideallösung.


Folge mir auf X und itch.io