Verzweiflung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Moinsen,

    ich habe ein Problem und zwar brauche ich eine Klick-Funktion, mit der ich andere verknüpfen kann. Ich kriege die Nachricht zwar, aber wenn ich sie einbinde funktioniert es nicht. Hier der code:

    LUA-Quellcode

    1. function isClicked(button,state)
    2. if button == "left" and state == "down" then
    3. outputChatBox("s")
    4. end
    5. end
    6. addEventHandler("onClientClick", root, isClicked)

    Mit der ersten IF-Zeile, klappt es. Wenn ich dann isClicked benutze, funktioniert es nicht. Was muss ich tun? So soll es eingebunden werden.


    LUA-Quellcode

    1. function destroyWindow(button, state)
    2. --if button == "left" and state == "down" then
    3. if isClicked() then
    4. if isCursorOnElement(1123, 335, 20, 20) then
    5. removeEventHandler("onClientRender", root, Window)
    6. showCursor(false)
    7. showChat(true)
    8. isWindowOpen = false
    9. showPlayerHudComponent("all",true)
    10. end
    11. end
    12. end
    13. addEventHandler("onClientClick", root, destroyWindow)
    Alles anzeigen


    Bin für jede Antwort dankbar!

    LG

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LASTI ()

  • Ohne mir den Code weiter anzuschauen musst du in deiner isClicked Funktion einen Rückgabewert einbinden

    LUA-Quellcode

    1. function isClicked(button,state)
    2. if button == "left" and state == "down" then
    3. outputChatBox("s")
    4. return true; // Damit weiß die if Abrage das gedrückt wurde
    5. else
    6. return false;
    7. end
    8. end
    9. addEventHandler("onClientClick", root, isClicked)
    Edit habe den Code mal angeschaut. So ist's richtig

    LUA-Quellcode

    1. function isClicked(button,state)
    2. if button == "left" and state == "down" then
    3. outputChatBox("s")
    4. return true; // Damit weiß die if Abrage das gedrückt wurde
    5. else
    6. return false;
    7. end
    8. end
    9. function destroyWindow(button, state)
    10. --if button == "left" and state == "down" then
    11. if isClicked(button, state) then
    12. if isCursorOnElement(1123, 335, 20, 20) then
    13. removeEventHandler("onClientRender", root, Window)
    14. showCursor(false)
    15. showChat(true)
    16. isWindowOpen = false
    17. showPlayerHudComponent("all",true)
    18. end
    19. end
    20. end
    21. addEventHandler("onClientClick", root, destroyWindow)
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Drake ()

  • Drake schrieb:

    Ohne mir den Code weiter anzuschauen musst du in deiner isClicked Funktion einen Rückgabewert einbinden

    LUA-Quellcode

    1. function isClicked(button,state)
    2. if button == "left" and state == "down" then
    3. outputChatBox("s")
    4. return true; // Damit weiß die if Abrage das gedrückt wurde
    5. else
    6. return false;
    7. end
    8. end
    9. addEventHandler("onClientClick", root, isClicked)

    Das hast du mir ja beim letzten mal geschrieben. Habe es dann auch gemacht jedoch funktioniert es trotzdem nicht.
  • @LASTSCHRIFT
    Das Problem ist das du bei isClicked() in deiner destroyWindow() Funktion keine Argumente übergibst. Deine isClicked() Funktion hat somit die undefinierten Variablen buttonund state, welche die Funktion nicht vergleichen kann, da es eben keine gibt. (Korrigiert mich wenn ich falsch liege.)

    So müsste dann dein code aussehen:

    LUA-Quellcode

    1. function isClicked(button,state)
    2. if button == "left" and state == "down" then
    3. outputChatBox("s")
    4. end
    5. end
    6. --addEventHandler("onClientClick", root, isClicked) Diesen Eventhandler brauchst du nicht, da es schon in der destroyWindow funktion gehandelt wird



    LUA-Quellcode

    1. function destroyWindow(button, state)
    2. if isClicked(button, state) then --Hier fehlten deine Argumente button, state
    3. if isCursorOnElement(1123, 335, 20, 20) then
    4. removeEventHandler("onClientRender", root, Window)
    5. showCursor(false)
    6. showChat(true)
    7. isWindowOpen = false
    8. showPlayerHudComponent("all",true)
    9. end
    10. end
    11. end
    12. addEventHandler("onClientClick", root, destroyWindow)
    Alles anzeigen
  • SlliX schrieb:

    @LASTSCHRIFT
    Das Problem ist das du bei isClicked() in deiner destroyWindow() Funktion keine Argumente übergibst. Deine isClicked() Funktion hat somit die undefinierten Variablen buttonund state, welche die Funktion nicht vergleichen kann, da es eben keine gibt. (Korrigiert mich wenn ich falsch liege.)

    So müsste dann dein code aussehen:

    LUA-Quellcode

    1. function isClicked(button,state)
    2. if button == "left" and state == "down" then
    3. outputChatBox("s")
    4. end
    5. end
    6. --addEventHandler("onClientClick", root, isClicked) Diesen Eventhandler brauchst du nicht, da es schon in der destroyWindow funktion gehandelt wird


    LUA-Quellcode

    1. function destroyWindow(button, state)
    2. if isClicked(button, state) then --Hier fehlten deine Argumente button, state
    3. if isCursorOnElement(1123, 335, 20, 20) then
    4. removeEventHandler("onClientRender", root, Window)
    5. showCursor(false)
    6. showChat(true)
    7. isWindowOpen = false
    8. showPlayerHudComponent("all",true)
    9. end
    10. end
    11. end
    12. addEventHandler("onClientClick", root, destroyWindow)
    Alles anzeigen

    Genau. Nur wie kriege ich es hin, dass man als Event "onClientRender" angeben kann, es aber trotzdem funktioniert? Denn wenn ich "onClientRender" benutze, funktioniert es nicht mehr.
  • SlliX schrieb:

    LASTSCHRIFT schrieb:

    Genau. Nur wie kriege ich es hin, dass man als Event "onClientRender" angeben kann, es aber trotzdem funktioniert? Denn wenn ich "onClientRender" benutze, funktioniert es nicht mehr.
    Ein bisschen code wäre sinnvoll, denn bei destroyWindow willst du ja höchst wahrscheinlich kein onClientRender benutzen.

    LUA-Quellcode

    1. function toggleButton()
    2. if isWindowOpen == true then
    3. if isOffButtonDraw == false then
    4. addEventHandler("onClientRender", root, drawOffButton)
    5. isOffButtonDraw = true
    6. else
    7. if isCursorShowing() then
    8. if isOnButtonDraw == false then
    9. if isCursorOnElement(1043,579,45,30) then
    10. removeEventHandler("onClientRender", root, drawOffButton)
    11. addEventHandler("onClientRender", root, drawOnButton)
    12. isOnButtonDraw = true
    13. neymar = playSound("files/music.mp3")
    14. end
    15. else
    16. if isCursorOnElement(1088,579,45,30) then
    17. addEventHandler("onClientRender", root, drawOffButton)
    18. removeEventHandler("onClientRender", root, drawOnButton)
    19. isOnButtonDraw = false
    20. stopSound(neymar)
    21. end
    22. end
    23. end
    24. end
    25. end
    26. end
    27. addEventHandler("onClientClick", root, toggleButton)
    Alles anzeigen
    Das Problem ist, dass der Button erst angezeigt wird, wenn ich klicke. Und mit "onClientRender", funktioniert halt isClicked nicht.
  • @LASTSCHRIFT
    Ich kann leider nicht wirklich rauslesen was dein Code macht.

    Was soll schritt für schritt passieren?
    Was ist drawOffButton?
    Wann soll dieser angezeigt werden?

    Zumal es keinen Sinn machen würde ein onClientRender Event die funktion handeln zu lassen, wieso soll die Funktion jeden Frame ausgeführt werden?
    Wenn du uns den ganzen Code bereit stellen würdest wäre es definitiv einfacher dein Problem zu lösen.
  • SlliX schrieb:

    @LASTSCHRIFT
    Ich kann leider nicht wirklich rauslesen was dein Code macht.

    Was soll schritt für schritt passieren?
    Was ist drawOffButton?
    Wann soll dieser angezeigt werden?

    Zumal es keinen Sinn machen würde ein onClientRender Event die funktion handeln zu lassen, wieso soll die Funktion jeden Frame ausgeführt werden?
    Wenn du uns den ganzen Code bereit stellen würdest wäre es definitiv einfacher dein Problem zu lösen.

    Die Funktion ist für einen Button wie z.b Passwort speichern.

    LUA-Quellcode

    1. function drawOffButton()
    2. dxDrawRectangle(1043, 579, 45, 30, tocolor(202, 135, 19, 255), false)
    3. end



    LUA-Quellcode

    1. function drawOnButton()
    2. dxDrawRectangle(1088, 579, 45, 30, tocolor(202, 135, 19, 255), false)
    3. end
  • Ich weiß jetzt aber immer noch nicht, was genau schritt für schritt passieren soll.
    Ich interpretiere deinen Code so:
    Du hast ein window, welches beim öffnen den normalen weißen button zeichnen soll. Wenn du drüber hoverst soll er orange werden, und wenn du ihn klickst soll das fenster schließen, verstehe ich das richtig?
    Schick mir mal deine window funktion mit, damit ich besser testen kann.
  • LUA-Quellcode

    1. function toggleButton()
    2. if isWindowOpen == true then -- Wenn Fenster offen ist, dann..
    3. if isOffButtonDraw == false then -- Wenn linker Button false ist dann..
    4. addEventHandler("onClientRender", root, drawOffButton) -- Linker Button wird gezeichnet
    5. isOffButtonDraw = true -- Linker Button wird true
    6. else -- Wenn linker Button ist true dann
    7. if isCursorShowing() then -- Wenn Maus dann
    8. if isOnButtonDraw == false then -- Wenn rechter Button false dann..
    9. if isCursorOnElement(1043,579,45,30) then -- Wenn Maus auf linken Button dann
    10. removeEventHandler("onClientRender", root, drawOffButton) -- Linker Button weg
    11. addEventHandler("onClientRender", root, drawOnButton) -- Rechter Button wird gezeichnet
    12. isOnButtonDraw = true -- Rechter Button ist true
    13. neymar = playSound("files/music.mp3") -- Musik spielt
    14. end
    15. else
    16. if isCursorOnElement(1088,579,45,30) then -- Wenn Maus dann
    17. addEventHandler("onClientRender", root, drawOffButton) -- Linker Button wird gezeichnet
    18. removeEventHandler("onClientRender", root, drawOnButton) -- Rechter Button weg
    19. isOnButtonDraw = false -- Rechter Button ist false
    20. stopSound(neymar) -- Stop Musik
    21. end
    22. end
    23. end
    24. end
    25. end
    26. end
    27. addEventHandler("onClientClick", root, toggleButton)
    Alles anzeigen
  • Kann man bestimmt eleganter lösen, jedoch tut es was es soll:
    An manchen stellen wirst du es noch anpassen müssen, wie z.B. bei window() und destroyWindow(), da ich ja nicht weiß was noch alles angzeigt/zerstört/gemacht werden soll.

    LUA-Quellcode

    1. local isDrawOffButtonShowing = false
    2. local isDrawOnButtonShowing = false
    3. local isSound = false
    4. function isCursorOnElement( posX, posY, width, height ) --Useful function aus dem MTA WIKI
    5. if isCursorShowing( ) then
    6. local mouseX, mouseY = getCursorPosition( )
    7. local clientW, clientH = guiGetScreenSize( )
    8. local mouseX, mouseY = mouseX * clientW, mouseY * clientH
    9. if ( mouseX > posX and mouseX < ( posX + width ) and mouseY > posY and mouseY < ( posY + height ) ) then
    10. return true
    11. end
    12. end
    13. return false
    14. end
    15. function window()
    16. --Deine window draw function
    17. dxDrawRectangle(1043, 579, 90, 30, tocolor(255, 255, 255, 255), false) --Hintergrund der Buttons
    18. if isDrawOffButtonShowing == false then --Wenn offbutton nicht gedrawt
    19. if (not isDrawOnButtonShowing) then --und onbutton auch nicht
    20. OffButton() --dann offButton ausführen
    21. showCursor(true) --und Cursor anzeigen
    22. end
    23. end
    24. end
    25. function drawOffButton()
    26. dxDrawRectangle(1043, 579, 45, 30, tocolor(202, 135, 19, 255), false)
    27. end
    28. function drawOnButton()
    29. dxDrawRectangle(1088, 579, 45, 30, tocolor(202, 135, 19, 255), false)
    30. end
    31. function playMusic()
    32. sound = playSound("files/music.mp3", true)
    33. isSound = true
    34. end
    35. function stopMusic()
    36. stopSound(sound)
    37. isSound = false
    38. end
    39. function OffButton() --wird gleichzeitig mit öffnen des windows benutzt
    40. addEventHandler("onClientRender", root, drawOffButton) --rendert den standardmäßig zuerst angezeigten offButton
    41. addEventHandler("onClientClick", root, clickHandler) --clickHandler hinzufügen
    42. isDrawOffButtonShowing = true
    43. end
    44. function clickHandler(button, state, x, y) --ist für anklicken der buttons zuständig
    45. if ( button == "left" and state == "down" and isDrawOffButtonShowing == true and isCursorOnElement(1043,579,45,30) ) then --wenn Offbutton gedrawt ist und cursor auf OffButton ist
    46. removeEventHandler("onClientRender", root, drawOffButton) --OffButton destroyen
    47. addEventHandler("onClientRender", root, drawOnButton) --OnButton drawen
    48. isDrawOffButtonShowing = false --variablen ändern
    49. isDrawOnButtonShowing = true
    50. playMusic() --musik abspielen
    51. elseif ( button == "left" and state == "down" and isDrawOnButtonShowing == true and isCursorOnElement(1088, 579, 45, 30) ) then --das gleiche wie oben nur für OnButton
    52. removeEventHandler("onClientRender", root, drawOnButton)
    53. addEventHandler("onClientRender", root, drawOffButton)
    54. isDrawOnButtonShowing = false
    55. isDrawOffButtonShowing = true
    56. stopMusic()
    57. end
    58. end
    59. function destroyWindow()
    60. --deine destroyWindow argumente
    61. if isDrawOnButtonShowing == true then --Wenn OnButton, dann destroy
    62. removeEventHandler("onClientRender", root, drawOnButton)
    63. isDrawOnButtonShowing = false
    64. elseif isDrawOffButtonShowing == true then -- wenn OffButton, dann destroy
    65. removeEventHandler("onClientRender", root, drawOffButton)
    66. isDrawOffButtonShowing = false
    67. end
    68. removeEventHandler("onClientRender", root, window) --destroyed window
    69. removeEventHandler("onClientClick", root, clickHandler) -- destroyed clickHandler
    70. showCursor(false) --entfernt den cursor
    71. if isSound == true then --wenn sound spielt dann
    72. stopSound(sound) --sound beenden
    73. isSound = false --isSound auf false stellen
    74. end
    75. end
    Alles anzeigen
  • SlliX schrieb:

    Kann man bestimmt eleganter lösen, jedoch tut es was es soll:
    An manchen stellen wirst du es noch anpassen müssen, wie z.B. bei window() und destroyWindow(), da ich ja nicht weiß was noch alles angzeigt/zerstört/gemacht werden soll.

    LUA-Quellcode

    1. local isDrawOffButtonShowing = false
    2. local isDrawOnButtonShowing = false
    3. local isSound = false
    4. function isCursorOnElement( posX, posY, width, height ) --Useful function aus dem MTA WIKI
    5. if isCursorShowing( ) then
    6. local mouseX, mouseY = getCursorPosition( )
    7. local clientW, clientH = guiGetScreenSize( )
    8. local mouseX, mouseY = mouseX * clientW, mouseY * clientH
    9. if ( mouseX > posX and mouseX < ( posX + width ) and mouseY > posY and mouseY < ( posY + height ) ) then
    10. return true
    11. end
    12. end
    13. return false
    14. end
    15. function window()
    16. --Deine window draw function
    17. dxDrawRectangle(1043, 579, 90, 30, tocolor(255, 255, 255, 255), false) --Hintergrund der Buttons
    18. if isDrawOffButtonShowing == false then --Wenn offbutton nicht gedrawt
    19. if (not isDrawOnButtonShowing) then --und onbutton auch nicht
    20. OffButton() --dann offButton ausführen
    21. showCursor(true) --und Cursor anzeigen
    22. end
    23. end
    24. end
    25. function drawOffButton()
    26. dxDrawRectangle(1043, 579, 45, 30, tocolor(202, 135, 19, 255), false)
    27. end
    28. function drawOnButton()
    29. dxDrawRectangle(1088, 579, 45, 30, tocolor(202, 135, 19, 255), false)
    30. end
    31. function playMusic()
    32. sound = playSound("files/music.mp3", true)
    33. isSound = true
    34. end
    35. function stopMusic()
    36. stopSound(sound)
    37. isSound = false
    38. end
    39. function OffButton() --wird gleichzeitig mit öffnen des windows benutzt
    40. addEventHandler("onClientRender", root, drawOffButton) --rendert den standardmäßig zuerst angezeigten offButton
    41. addEventHandler("onClientClick", root, clickHandler) --clickHandler hinzufügen
    42. isDrawOffButtonShowing = true
    43. end
    44. function clickHandler(button, state, x, y) --ist für anklicken der buttons zuständig
    45. if ( button == "left" and state == "down" and isDrawOffButtonShowing == true and isCursorOnElement(1043,579,45,30) ) then --wenn Offbutton gedrawt ist und cursor auf OffButton ist
    46. removeEventHandler("onClientRender", root, drawOffButton) --OffButton destroyen
    47. addEventHandler("onClientRender", root, drawOnButton) --OnButton drawen
    48. isDrawOffButtonShowing = false --variablen ändern
    49. isDrawOnButtonShowing = true
    50. playMusic() --musik abspielen
    51. elseif ( button == "left" and state == "down" and isDrawOnButtonShowing == true and isCursorOnElement(1088, 579, 45, 30) ) then --das gleiche wie oben nur für OnButton
    52. removeEventHandler("onClientRender", root, drawOnButton)
    53. addEventHandler("onClientRender", root, drawOffButton)
    54. isDrawOnButtonShowing = false
    55. isDrawOffButtonShowing = true
    56. stopMusic()
    57. end
    58. end
    59. function destroyWindow()
    60. --deine destroyWindow argumente
    61. if isDrawOnButtonShowing == true then --Wenn OnButton, dann destroy
    62. removeEventHandler("onClientRender", root, drawOnButton)
    63. isDrawOnButtonShowing = false
    64. elseif isDrawOffButtonShowing == true then -- wenn OffButton, dann destroy
    65. removeEventHandler("onClientRender", root, drawOffButton)
    66. isDrawOffButtonShowing = false
    67. end
    68. removeEventHandler("onClientRender", root, window) --destroyed window
    69. removeEventHandler("onClientClick", root, clickHandler) -- destroyed clickHandler
    70. showCursor(false) --entfernt den cursor
    71. if isSound == true then --wenn sound spielt dann
    72. stopSound(sound) --sound beenden
    73. isSound = false --isSound auf false stellen
    74. end
    75. end
    Alles anzeigen

    Danke