button-frage

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
ags_noob

button-frage

Beitrag von ags_noob »

leute ich bin ein noob. wie kann ich überprüfen ob ein button auf einem gui angeklickt wurde? in der funktion interface_clicked is das ja einfach (mit if (button==1){ //code}). ich habe aber eine eigene funktion in der ich prüfen muss ob auf gui x button y angeklickt wurde. den anfang habe ich mit if(gui.visible==true){} gemacht aber jetzt weiß ich nicht wie ich überprüfen kann welcher button y gedrückt wurde. kann mir da jemand helfen? (ags v2.7)

p.s.: habe im manual nichts gefunden
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Du kannst theoretisch überprüfen, ob ein Button gedrückt wird, indem Du ständig (also in der repeatedly_execute) den Zustand der Mousebuttons und den Button unter der Maus überprüfst.
Das ist aber umständlich.

Mir ist nicht ganz klar, warum Du die interface_klick-function nicht benutzen willst, denn genau dafür ist sie da.
Du kannst aber im GUI-Editor jedem Button einen Scriptnamen geben und dann eine Funktion eintragen, die nach Klick aufgerufen wird.

Wo hast Du denn deine eigene Funktion reingeschrieben? Ins roomscript?
Und was soll sie bewirken?
Beschreib Dein Vorhaben mal bitte etwas genauer.
Use gopher repellent on funny little man
ags_noob

Beitrag von ags_noob »

ich habe meine function an den anfang des global scripts geschrieben. der grund warum ich die button abfrage nicht ins interface_click dingsdabumsta schreiben will ist dass ich es einfach nicht so gerne benutze :lol:
ich mag das halt irgendwie nicht. frag nicht warum. aber okay wenn es so einfacher ist mache ich es damit. aber dann frage ich nochmal anders. kann ich denn auch in der interface_click funktion meine eigenen funktionen einbauen? also z.b.:

Code: Alles auswählen

function interface_click(int interface, int button) {

function MeineFunktion(int blabla{ //code}
}
Du kannst aber im GUI-Editor jedem Button einen Scriptnamen geben und dann eine Funktion eintragen, die nach Klick aufgerufen wird.
das habe ich auch gesehen aber weiß nicht wie es genau funktioniert. vielleicht kannst du mir das etwas genauer erklären.

auf jedenfall danke für deine hilfe.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Du kannst Funktionen nicht verschachteln.

Aber du könntest in die on_interface_click schreiben:

Code: Alles auswählen

if (interface==x) {
  if (button==y) myLoad();
  if (button==z) mySave();
  ...
}
Dann kannst du die eigenen Funktionen verwenden.

Zu deiner 2. Frage:
Ich bin auch gerade am rumprobieren.
Der Scriptname ist der Name des Buttons, mit dem Du ihn im script ansprechen kannst. Wenn Du hier z.B. ldbutton einträgst, kannst Du im script z.B.

Code: Alles auswählen

ldbutton.SetPosition(10, 10);
schreiben und so den Button an andere Koordinaten setzen.
Wenn Du bei "Click" den Namen einer Funktion einträgst, dann wird diese aufgerufen, anstatt der on_interface_click().
Allerdings will AGS 2 Parameter übergeben, d.h. wenn Du jetzt bei Click z.B. "ldbutton_Click" drinstehen hast, musst Du im global script folgende Funktion definieren:

Code: Alles auswählen

function ldbutton_Click(? a, int b) {
  // code
}
Allerdings weiß ich nicht, was da übergeben wird, hab auch im manual nix gefunden. b war wohl ein int, es hatte den Wert 1, aber a war als int 118974987 oder so und als String "He0" :)
Strazer?

NACHTRAG: Hab's gefunden.
http://www.bigbluecup.com/yabb/index.php?topic=19369.0

Ich hab drei Buttons, Script names sind "load", "save" und "quit". Bei Left click ist "Run script" eingestellt, bei Click steht "menu_Click".

Die Funktion sieht bei mir jetzt so aus:

Code: Alles auswählen

function menu_Click(GUIControl *c, int mousebutton) {
  string s, t;
  if (mousebutton==eMouseLeft)
    StrCopy(s, "Linksklick auf Button ");
  else if (mousebutton==eMouseMiddle)
    StrCopy(s, "Mausradklick auf Button ");
  else if (mousebutton==eMouseRight)
    StrCopy(s, "Rechtsklick auf Button ");

  if (c==load)
    StrCopy(t, "load.");
  else if (c==save)
    StrCopy(t, "save.");
  else if (c==quit)
    StrCopy(t, "quit.");
    
  StrCat(s, t);
  Display(s);
}
Man muss also nicht mal eine eigene Funktion für jeden Button verwenden, da der angeklickte Button beim Funktionsaufruf übergeben wird (function menu_Click(GUIControl *c, int mousebutton)).
Der zweite Parameter ist der Mousebutton, der sich bequem über die eNums abfragen lässt.

Noch etwas fiel mir auf: Einer der Buttons hat trotzdem nach wie vor die on_interface_click() aufgerufen, statt meiner menu_Click(). Dann hab ich aber im GUIEditor Left click auf "No action" und dann wieder auf "Run script" gestellt, und dann gings.
Use gopher repellent on funny little man
ags_noob

Beitrag von ags_noob »

klingt interessant. ich glaube ich sollte mich auch mal ein wenig darin einarbeiten. auf jedenfall danke für deine hilfe.
Antworten