GTAOnline.net

Multi Theft Auto (mta) => Scripting MTA [Lua Center] => Discussion démarrée par: skyfoam le 21 Juin 2013, 18:22:25

Titre: [Résolu]Problême d'affichage GUI
Posté par: skyfoam le 21 Juin 2013, 18:22:25
bonjour tous le monde,
voici mon problême:
Losque je fait "start gui" pour démarrer mon petit script il m'affiche un message d'erreur, à la ligne 48. Je ne comprend absolument pas, j'ai revérifier des dizaines de fois cette ligne mais rien à faire...
voici mon code:outputChatBox("v1.0")
function createLoginWindow()
--création de la window de tchat
local X = 0.375
local Y = 0.375
local Width = 0.25
local Height = 0.25
tchatTo = guiCreateWindow(X, Y, Width, Height, "Please Log In", true)
--Coordonée pour le label
X = 0.0825
Y = 0.5
Width = 0.25
Height = 0.25
--création du label
guiCreateLabel(X, Y, Width, Height, "Message:", true, tchatTo)
--coordonnées pour la box
X = 0.415
Y = 0.5
Width = 0.5
Height = 0.15
--création de la box
Message = guiCreateEdit(X, Y, Width, Height, "", true, tchatTo)
guiEditSetMaxLength(Message, 50)
--création du boutton
X = 0.415
Y = 0.7
Width = 0.25
Height = 0.2
btnLogin = guiCreateButton(X, Y, Width, Height, "Submit", true, tchatTo)
--clic sur le boutton
addEventHandler("onClientGUIClick", btnLogin, clientSubmitLogin, false)
-- création de la "hitbox" du boutton
-- (these are passed automatically by onClientGUIClick)
function clientSubmitLogin(button,state)
-- si clique gauche:
if button == "left" and state == "up" then
-- enlevé le focus de la box
guiSetInputEnabled(false)
-- fermer la fenêtre
guiSetVisible(tchatTo, false)
-- caché la souris
showCursor(false)
local message = guiGetText(Message)
outputChatBox(message)
end
end
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()))
function ()
-- create the log in window and its components
createLoginWindow()
 
-- output a brief welcome message to the player
                outputChatBox("Welcome to My MTA:SA Server, please log in.")
 
-- if the GUI was successfully created, then show the GUI to the player
        if (tachatTo ~= nil) then
guiSetVisible(tachatTo, true)
else
-- if the GUI hasnt been properly created, tell the player
outputChatBox("An unexpected error has occurred and the log in GUI has not been created.")
        end
 
-- enable the players cursor (so they can select and click on the components)
        showCursor(true)
-- set the input focus onto the GUI, allowing players (for example) to press 'T' without the chatbox opening
        guiSetInputEnabled(true)
end
Merci d'avance pour vos réponses ;-)
ps: je suis débutant en scripting mta ( je crois que cela ce remarque...).
Titre: Re : Problême d'affichage GUI
Posté par: Citizen le 21 Juin 2013, 21:18:02
Bonsoir skyfoam,

L'erreur est relativement simple.
Remplace ceci:
Code: (lua) [Sélectionner]
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()))
function ()
...
end

par ceci:
Code: (lua) [Sélectionner]
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()),
function ()
...
end
)

Enfait, une notion assez poussé en LUA est utilisée ici, il utilise une fonction anonyme (comme tu peux le voir, la fonction qui est déclarée ne porte pas de nom).
Si je rappel les arguments dont à besoin la fonction addEventHandler, il a besoin d'une fonction en 3ème argument.

Donc si on regarde ma version corrigée, on a bien 3 arguments
Code: (lua) [Sélectionner]
"onClientResourceStart",
getResourceRootElement(getThisResource()),
function () ... end

Le code équivalent sans utiliser de fonctions anonymes:
Code: (lua) [Sélectionner]
function myAwesomeFunction()
...
end
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), myAwesomeFunction)

Au niveau optimisation, la version avec la fonction anonyme est légèrement plus optimisé, mais la différence est infime. Donc pour des questions de lisibilité, la 2ème version est conseillée.

J'espère que tu auras compris ET l'erreur, ET le principe des fonctions anonymes.

A bientôt.

Cordialement,
Citizen
Titre: Re : Problême d'affichage GUI
Posté par: skyfoam le 21 Juin 2013, 22:33:21
Voilà, ça fonctionne :biggrin: Celà m'apprendra à recopier un bout de code... Sinon merci de ta rapidité. J'aurais encore et celà très surement, beaucoup de question à posé (et oui tu va souffrir  :medieval_sword2:)! Mais, comme je dit, chaque chose en son temps.
Encore merci ;-)
Titre: Re : [Résolu]Problême d'affichage GUI
Posté par: skyfoam le 21 Juin 2013, 23:03:10
Je poste à peine le message que j'ai un nouveau problême! Mais la je pense que c'est que je suis fatiqué... il me marque ce message: "ERROR: gui\script.lua:6: attempt to call global 'guiCreateWindiw' <anil value>.
Cela veut surement dire que j'ai un mauvais chiffre pour définir la taille de la fenêtre or c'est juste, c'est en pourcentage...
Merci
Titre: Re : Re : [Résolu]Problême d'affichage GUI
Posté par: Aegoss le 22 Juin 2013, 09:23:39
Je poste à peine le message que j'ai un nouveau problême! Mais la je pense que c'est que je suis fatiqué... il me marque ce message: "ERROR: gui\script.lua:6: attempt to call global 'guiCreateWindiw' <anil value>.
Cela veut surement dire que j'ai un mauvais chiffre pour définir la taille de la fenêtre or c'est juste, c'est en pourcentage...
Merci

Lorsque tu auras bien dormi, réessaye, il se peut que tu le règles comme si de rien était.
Titre: Re : [Résolu]Problême d'affichage GUI
Posté par: Citizen le 22 Juin 2013, 14:09:30
Aegoss a raison  :laugh:
Néanmoins si tu ne trouve pas, je te donne un indice qui pourra te servir si jamais tu revois cette erreur:
attempt to call global 'xxXxxx' <a nil value>.
Ça veut dire qu'il essaye d’accéder à xxXxxx mais qu'il n'existe pas. Tu peux avoir cette erreur pour des variables ou des fonctions (comme c'est le cas ici)
Titre: Re : [Résolu]Problême d'affichage GUI
Posté par: skyfoam le 22 Juin 2013, 19:44:18
Yep,
voila, je viens de changer tous ça. Donc maintenant il n'y a plus de problême. Mais (et oui ^^), un nouveau apparait : je tape la commande message sur le jeu et là, rien ne se passe. Donc je vais voir ma console et elle m'affiche stack overflow à la ligne 8.
J'ai été m'informer sur des forums pour savoir ce que ça signifiait et je suis tombé sur une personne qui explique que c'est soit un dépassement de la mémoire vive aloué au programme soit une boucle infinie ou un truc du genre.
Pour mon cas, je penche pour le deuxième étant donné la taille de mon script...Ainsi, j'ai revérifier si il y avait une réinsertion de fonctions infini ou des boucles infines, or il n'y en a pas... je ne comprend pas.
Voici mon nouveau code un peu améliorer:
outputChatBox("v1.1")
function guiCreateWindow()
--création de la window de tchat
local X = 0.375
local Y = 0.375
local Width = 0.25
local Height = 0.20
outputChatBox("yop")
tchatTo = guiCreateWindow(X, Y, Width, Height, "Please Log In", true)
--Coordonée pour le label
X = 0.0825
Y = 0.5
Width = 0.25
Height = 0.25
--création du label
guiCreateLabel(X, Y, Width, Height, "Message:", true, tchatTo)
--coordonnées pour la box
X = 0.415
Y = 0.5
Width = 0.5
Height = 0.15
--création de la box
Message = guiCreateEdit(X, Y, Width, Height, "", true, tchatTo)
guiEditSetMaxLength(Message, 50)
--création du boutton
X = 0.415
Y = 0.7
Width = 0.25
Height = 0.2
btnLogin = guiCreateButton(X, Y, Width, Height, "Submit", true, tchatTo)
--clic sur le boutton
addEventHandler("onClientGUIClick", btnLogin, clientSubmitLogin, false)
guiSetVisible(tchatTo, false)
end
function clientSubmitLogin(button,state)
-- si clique gauche:
if button == "left" and state == "up" then
-- enlevé le focus de la box
guiSetInputEnabled(false)
-- fermer la fenêtre
guiSetVisible(tchatTo, false)
-- caché la souris
showCursor(false)
local message = guiGetText(Message)
outputChatBox(message)
end
end
function anonyme()
outputChatBox("yep")
guiCreateWindow()
if (tchatTo ~= nil) then
guiSetVisible(tchatTo, true)
else
-- si problême
outputChatBox("An unexpected error has occurred and the log in GUI has not been created.")
        end
-- afficher la souris
        showCursor(true)
-- définir le focus
        guiSetInputEnabled(true)
end
addCommandHandler("message", anonyme)

Merci!
Titre: Re : [Résolu]Problême d'affichage GUI
Posté par: Citizen le 24 Juin 2013, 20:29:28
soit un dépassement de la mémoire vive aloué au programme soit une boucle infinie... soit un appel récursif sans condition de fin de "ta" fonction guiCreateWindow().

Depuis quand à t'on le droit de créer des function qui porte le même nom que de vraies fonctions ?
Jamais, enfin on peut mais ducoups ça remplace la véritable fonction par la tienne.

Un moyen simple de corriger le problème est de nommer ta fonction autrement.

Fait plus attention à ce que tu fais et va pas trop vite.

Cordialement,
Citizen
Titre: Re : [Résolu]Problême d'affichage GUI
Posté par: Ssk le 24 Juin 2013, 20:37:41
Et bim, stack overflow.

Il faut savoir que quand tu as un stack (mémoire locale) overflow c'est à 90% à cause d'un appel récursif infini sur une fonction.
Par contre un heap (mémoire globale) overflow c'est un dépassement de la mémoire allouée.
Titre: Re : [Résolu]Problême d'affichage GUI
Posté par: Citizen le 24 Juin 2013, 20:55:34
Haha merci pour l'info Ssk je me coucherais moins bête ce soir, j'avoue que c'est le genre d'info que j'ai jamais eu à cherché  :laugh:
Titre: Re : [Résolu]Problême d'affichage GUI
Posté par: skyfoam le 24 Juin 2013, 23:59:14
Oh oui, quel imbécile je fait :huh:
En tout cas merci pour cette info! En plus, il est totalement opérationnel maintenant!  :biggrin: