Taste gedrückt halten und wieder loslassen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hi,


    ich möchte, dass ein Dialog angezeigt wird, wenn man RMB gedrückt hält, und wieder verschwindet, sobald man RMB loslässt. Hier der Code.
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(Condition[playerid] == CONDITION_DOWNED)
    {
    if((newkeys & KEY_HANDBRAKE) && !(oldkeys & KEY_HANDBRAKE))
    {
    ShowPlayerDialog(playerid, -1, DIALOG_STYLE_LIST, "", "", "", ""); //Hide dialog when RMB is pressed
    }
    if((oldkeys & KEY_HANDBRAKE) && !(newkeys & KEY_HANDBRAKE))
    {
    new
    ds[MAX_LANGUAGES][150];

    format(ds[LANGUAGE_DE], sizeof(ds[]), "Blutung stoppen\nLetzte Kraft\nHilferuf\nBlutbeutel (%d)\nMorphin (%d)\nBeruhigungsmittel (%d)\nAdrenalin (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    format(ds[LANGUAGE_EN], sizeof(ds[]), "Stop the bleeding\nLast strength\nCall for help\nBloodbag (%d)\nMorphine (%d)\nTranquilizer (%d)\nAdrenaline (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    ShowLanguageDialog(playerid, DIALOG_DOWNSTATE, DIALOG_STYLE_LIST, "Downstate Aktionen", "Downstate actions", ds[LANGUAGE_DE], ds[LANGUAGE_EN], "OK", "OK", "", "");
    }
    }
    return 1;
    }


    So, wenn ich RMB nun drücke, erscheint der Dialog, wie gewollt. Wenn ich RMB allerdings wieder loslasse, dann verschwindet der Dialog allerdings nicht.

  • Also, anfänglich wird mir ja kein Dialog angezeigt. Wenn ich dann RMB zunächst drücke, soll ja auch noch nichts passieren.
    Wenn ich beim ersten Mal dann RMB loslasse, wird mir der Dialog angezeigt. Wenn ich dann wieder RMB loslasse, dann verschwindet der Dialog nicht.

  • Habe es ausprobiert. Das Problem ist, dass du nichts im Dialog stehen hast. So geht es bei mir weg:
    ShowPlayerDialog(playerid, 9999999, DIALOG_STYLE_MSGBOX, "a", "a", "a", "a");


    Insgesamt:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(Condition[playerid] == CONDITION_DOWNED)
    {
    if(RELEASED(KEY_HANDBRAKE))
    {
    ShowPlayerDialog(playerid, 9999999, DIALOG_STYLE_MSGBOX, "a", "a", "a", "a"); //Hide dialog when RMB is pressed
    }
    else if(newkeys & (KEY_HANDBRAKE))
    {
    new ds[MAX_LANGUAGES][150];

    format(ds[LANGUAGE_DE], sizeof(ds[]), "Blutung stoppen\nLetzte Kraft\nHilferuf\nBlutbeutel (%d)\nMorphin (%d)\nBeruhigungsmittel (%d)\nAdrenalin (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    format(ds[LANGUAGE_EN], sizeof(ds[]), "Stop the bleeding\nLast strength\nCall for help\nBloodbag (%d)\nMorphine (%d)\nTranquilizer (%d)\nAdrenaline (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    ShowLanguageDialog(playerid, DIALOG_DOWNSTATE, DIALOG_STYLE_LIST, "Downstate Aktionen", "Downstate actions", ds[LANGUAGE_DE], ds[LANGUAGE_EN], "OK", "OK", "", "");
    }
    }
    return 1;
    }


    Das funktioniert allerdings nur mit dem Gamepad, da durch den Dialog und die Maus der Rechtsklick als losgelassen erkannt wird, es flackert dann wie verrückt. Mit der Tastatur das Gleiche.
    Mit dem Gamepad geht's.

  • Ich bin jetzt mal auf folgende Variante umgesprungen.


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(Condition[playerid] == CONDITION_DOWNED)
    {
    if(newkeys & (KEY_HANDBRAKE))
    {
    if(Downstate_DialogSwitch[playerid] == true)
    {
    Downstate_DialogSwitch[playerid] = false;
    ShowPlayerDialog(playerid, -1, DIALOG_STYLE_LIST, "a", "a", "a", "a");
    print("Close");
    }
    if(Downstate_DialogSwitch[playerid] == false)
    {
    Downstate_DialogSwitch[playerid] = true;

    new
    ds[MAX_LANGUAGES][150];


    format(ds[LANGUAGE_DE], sizeof(ds[]), "Blutung stoppen\nLetzte Kraft\nHilferuf\nBlutbeutel (%d)\nMorphin (%d)\nBeruhigungsmittel (%d)\nAdrenalin (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    format(ds[LANGUAGE_EN], sizeof(ds[]), "Stop the bleeding\nLast strength\nCall for help\nBloodbag (%d)\nMorphine (%d)\nTranquilizer (%d)\nAdrenaline (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    ShowLanguageDialog(playerid, DIALOG_DOWNSTATE, DIALOG_STYLE_LIST, "Downstate Aktionen", "Downstate actions", ds[LANGUAGE_DE], ds[LANGUAGE_EN], "OK", "OK", "", "");
    print("Open");
    }
    }
    }
    return 1;
    }


    Der Dialog wird einerseits beim Drücken geöffnet, wenn er zu ist, und andererseits geschlossen, wenn er offen ist - so die Absicht. Allerdings wird er nicht geschlossen. Geprintet wird alles.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(Condition[playerid] == CONDITION_DOWNED)
    {
    if(newkeys & (KEY_HANDBRAKE))
    {
    if(Downstate_DialogSwitch[playerid] == true)
    {
    Downstate_DialogSwitch[playerid] = false;
    ShowPlayerDialog(playerid, 9999999, DIALOG_STYLE_MSGBOX, "a", "a", "a", "a");
    print("Close");
    }
    else
    {
    Downstate_DialogSwitch[playerid] = true;

    new
    ds[MAX_LANGUAGES][150];

    format(ds[LANGUAGE_DE], sizeof(ds[]), "Blutung stoppen\nLetzte Kraft\nHilferuf\nBlutbeutel (%d)\nMorphin (%d)\nBeruhigungsmittel (%d)\nAdrenalin (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    format(ds[LANGUAGE_EN], sizeof(ds[]), "Stop the bleeding\nLast strength\nCall for help\nBloodbag (%d)\nMorphine (%d)\nTranquilizer (%d)\nAdrenaline (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
    ShowLanguageDialog(playerid, DIALOG_DOWNSTATE, DIALOG_STYLE_LIST, "Downstate Aktionen", "Downstate actions", ds[LANGUAGE_DE], ds[LANGUAGE_EN], "OK", "OK", "", "");
    print("Open");
    }
    }
    }
    return 1;
    }
    Versuche es so.


    Wenn das nicht geht, dann wird das Callback wohl zwei mal aufgerufen, und direkt nach dem Close müsste wieder Open angezeigt werden.
    Dann müsstest du einen kurzen Zeitstempel-Block einbauen, damit dieser Teil innerhalb von sagen wir 50ms nicht nochmal ausgeführt wird.

  • Ich bin momentan im Urlaub und habe keinen Zugriff auf meinen Code.


    Ich habe auch schon daran gedacht einfach 1 in den beiden Blöcken zu returnen, dass der Code einfach abbricht, bevor der nächste Block, der dann ja auch erfüllt wird, ausgeführt wird. Ich glaub auch, dass beide Print's nur aufgerufen wurden, weil sie direlt aufeinandet geprintet wurden, also bei einem Tastendruck. Ich werde den Code in einer Woche testen können, bis dahin setz ich mal vorerst einen Riegel hiervor.


    Danke bis hierhin!


    EDIT: So, bin wieder zurück. Hier ein kleines Update.


    Ich habe nun die Variante mit else, als auch die return Variante ausprobiert. Weder das eine noch das andere klappt. Mir ist jedoch etwas aufgefallen. Ich erkläre es am besten an einem Beispiel:
    Ich drücke RMB, der Dialog erscheint, Open wird geprintet.
    Drücke ich RMB, solange der Dialog offen ist, passiert nichts. Der Dialog schließt sich nicht und es wird kein Close geprintet.
    Wenn ich auf einen Dialog-Button klicke, schließt sich der Dialog. Es wird aber noch kein Close geprintet.
    Ist der Dialog zu, muss ich RMB 2x (!) drücken, damit der Dialog wieder aufgerufen wird. Bei ersten Klicken wird nur Close geprintet, beim zweiten wieder Open und der Dialog erscheint.


    Scheinbar wird der Tastendruck nicht erkannt solange der Dialog offen ist.

    Einmal editiert, zuletzt von Manyula ()

  • Scheinbar wird der Tastendruck nicht erkannt solange der Dialog offen ist.


    Ja, das ist so, war wohl etwas unglücklich von mir zuvor formuliert. Es funktioniert nur mit dem Gamepad, aber Maus und Tastatur wird bei OnPlayerKeyStateChange als losgelassen erkannt und dann auch nicht mehr erkannt sobald der Dialog zu sehen ist. Erst wenn der Dialog weg ist geht es wieder.