Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
Posté le: 18/07/09 03:58 Sujet du message:
Troll-Brain a écrit:
Jass:
call ForGroupBJ2( GetUnitsOfTypeIdAll2('hfoo'), function Trig_test_Func003A )
"ForGroup" s'affiche après "GetUnitsOfTypeIdAll2"
Ce qui fait que dans l'enum du group bj_wantDestroyGroup est encore égal à true, et au premier GroupAddGroup le groupe g est détruit...
Aaaah c'est donc ça ! Tout s'explique
Tu as trouvé pourquoi seules les unités de rouge sont prises en compte dans les actions. Je me méprenais, je croyais que ce qu'il se passait était que le groupe était bien entièrement créé, mais qu'il était supprimé après les pick des unités du joueur rouge. Alors qu'en fait c'est plutôt le contraire, non seulement le groupe n'est pas entièrement créé, mais il n'est pas supprimé puisque bj_wantDestroyGroup a déja servi et est repassé à false (donc ça leak). C'est comme si on avait un pick every unit dans un autre pick every unit, il y a conflit.
Troll-Brain a écrit:
Moi pas comprendre pourquoi les fonctions sont appelées dans cet ordre ...
C'est logique qu'elles soient appelées dans cet ordre, c'est la base de la programmation.
call FunA( FunB() )
La fonction FunB est appelée en premier, puisque la fonction FunA a besoin du résultat de FunB pour pouvoir être exécutée.
Prenons un exemple très simple :
RacineCarrée( Carré(x) ) -> il nous faut le carré de x pour pouvoir calculer la racine carrée du carré de x ^^.
Maintenant que l'on a compris le problème, on voit que dans ma map de démo on peut utiliser bj_wantDestroyGroup de la façon suivante :
Gui:
Trigger:
test pick
Evénements
Temps - Elapsed game time is 2.00 seconds
Conditions
Actions
Partie - Display to (All players) the text: removed Set aGroup = (Units of type Fantassin) Custom script: set bj_wantDestroyGroup = true
Groupe unité - Pick every unit in aGroup and do (Actions)
Boucle - Actions
Unité - Remove (Picked unit) from the game
On doit dans le cas présent obligatoirement passer par une variable. Le code précédent revient exactement au même que le suivant (pour l'ordi, l'une ou l'autre des méthodes, ça revient au même, il n'y en a pas de meilleure) :
Gui:
Trigger:
test pick
Evénements
Temps - Elapsed game time is 2.00 seconds
Conditions
Actions
Partie - Display to (All players) the text: removed Set aGroup = (Units of type Fantassin)
Groupe unité - Pick every unit in aGroup and do (Actions)
Boucle - Actions
Unité - Remove (Picked unit) from the game
Custom script: call DestroyGroup(udg_aGroup)
Pour les deux on est obligé de passer par un custom script. Alors ici, choisir l'une ou l'autre des deux méthodes est uniquement une question de préférences... _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 18/07/09 09:37 Sujet du message:
ForGroup est appelé quelques lignes après le display text "ForGroup", il n'y a aucune logique là dedans si ce n'est un bug de compilation du jass ... _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 18/07/09 13:36 Sujet du message:
Regarde les fonctions gui que j'ai modifié et le trigger de test.
Le message "ForGroup" ne s'affiche qu'après "GetUnitsOfTypeIdAll2". _________________
Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
Posté le: 18/07/09 15:24 Sujet du message:
Mais c'est tout à fait normal :
GetUnitsOfTypeIdAll2 est appelée en premier et ses actions exécutées jusqu'à la dernière action return result qui nous permet d'obtenir le groupe premier paramètre de l'appel de la fonction ForGroupBJ2.
Ensuite seulement la fonction ForGroupBJ2 peut être appelée, prenant donc deux paramètres, le groupe précédemment obtenu grâce à la fonction GetUnitsOfTypeIdAll2 (il lui faut absolument ce groupe obtenu par l'action "return result" pour pouvoir commencer à s'exécuter), et le code contenu dans la fonction Trig_test_Func003A.
C'est la même chose qu'un simple calcul mathématique :
RacineCarrée( 20 + 5 )
-> RacineCarrée( 25 )
-> 5
On calcule d'abord l'intérieur des parenthèses. _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 18/07/09 16:02 Sujet du message:
o_O je ne voyais pas comme cela.
Jass:
library Test initializer init
globals
private group Grp
endglobals
function ForGroupBJ2 takes group whichGroup, code callback returns nothing
// If the user wants the group destroyed, remember that fact and clear
// the flag, in case it is used again in the callback.
local boolean wantDestroy = bj_wantDestroyGroup
call BJDebugMsg("ForGroupBJ2")
set bj_wantDestroyGroup = false
call BJDebugMsg("avant for group")
call ForGroup(whichGroup, callback)
call BJDebugMsg("apres for group")
// If the user wants the group destroyed, do so now.
if (wantDestroy) then
call DestroyGroup(whichGroup)
endif
endfunction
private function ReturnGrp takes nothing returns group
call BJDebugMsg("return group")
return Grp
endfunction
private function test takes nothing returns nothing
call BJDebugMsg("test")
endfunction
private function init takes nothing returns nothing
local trigger trig = CreateTrigger()
set Grp = CreateGroup()
call TriggerRegisterPlayerEventEndCinematic(trig,Player(0))
call GroupAddUnit(Grp,CreateUnit(Player(0),'hfoo',0.,0.,0.))
call TriggerAddAction(trig,function Actions)
endfunction
endlibrary
Affiche :
Code:
"return group"
"ForGroupBJ2"
"avant for group"
"test"
"apres for group"
Mais moi je voyais plutôt comme cela :
Citation:
"ForGroupBJ2"
"avant for group"
"return group"
"test"
"apres for group"
Étant donné que le code en paramètre n'a pas besoin d'être utilisé tout de suite.
Mais du coup cela change carrément ma vision des choses ...
Merci de m'avoir appris cela.
Donc pour résumer Blizzard a faillit en codant les BJ, ils auraient du utiliser un GroupAddGroup supplémentaire. (ou peut être que ce n'est pas possible, la flemme d'y réfléchir ...)
Quitte à rendre le gui convertit en jass encore plus incompréhensible. _________________
Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
Posté le: 18/07/09 16:35 Sujet du message:
Jass:
function ForGroup takes group whichGroup, code callback returns nothing
L'ordinateur lui n'a aucune idée du moment à partir duquel on va lui demander d'utiliser le paramètre "whichGroup". Ca pourrait très bien être en première action.
Cependant ta précédente vision des choses est tout à fait compréhensible et logique. Je pense que beaucoup de gens font cette erreur là car c'est peu intuitif. On lit de la gauche vers la droite
Troll-Brain a écrit:
Donc pour résumer Blizzard a faillit en codant les BJ, ils auraient du utiliser un GroupAddGroup supplémentaire.
Quitte à rendre le gui convertit en jass ecore plus incompréhensible.
Jass:
function GetUnitsOfTypeIdAll takes integer unitid returns group
Nous avons ici une fonction prédéfinie de blizzard, prenant un typeUnité et retournant un groupe unité. Nous utilisateurs ne sommes pas censés avoir besoin de savoir comment cette fonction est implémentée (définie) pour l'utiliser. On donne un type d'unité, on récupère toutes les unités de ce type, c'est tout simple (normalement...). Donc oui, je pense que blizzard a fait une erreur en ne prévoyant pas ce problème de conflit (développeur numéro 6492 gare à vous !). _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 18/07/09 16:44 Sujet du message:
Citation:
Cependant ta précédente vision des choses est tout à fait compréhensible et logique. Je pense que beaucoup de gens font cette erreur là car c'est peu intuitif. On lit de la gauche vers la droite Razz
Ceci n'incite pas au racisme, c'est tout simplement une mauvaise blague :
Toutes les heures sont au format GMT + 1 Heure Aller à la page Précédente1, 2
Page 2 sur 2 La question posée dans ce topic a été résolue !
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum