Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
Max Floodeur prématuré
Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
|
Posté le: 15/07/09 17:05 Sujet du message: bj_wantDestroyGroup ? |
|
|
Pour aider un pote, je lui ai fait un déclo de slide en GUI que voici :
"set bj_wantDestroyGroup = true" sert à supprimer le groupe créé, pour éviter le leak. Cependant, alors que je pensais que le groupe serait supprimé à la fin des actions de la boucle, il est apparemment supprimé juste après le premier pick (la première unité). Si c'est comme ça que cela fonctionne, je ne vois pas l'intérêt de la variable "bj_wantDestroyGroup". J'ai dû raté quelque chose...
Edit : si je remplace les actions du pick every unit par un simple affichage d'un texte, l'affichage ne se fait qu'une seule fois... _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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: 15/07/09 18:29 Sujet du message: |
|
|
Jass: | function ForGroupBJ 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
set bj_wantDestroyGroup = false
call ForGroup(whichGroup, callback)
// If the user wants the group destroyed, do so now.
if (wantDestroy) then
call DestroyGroup(whichGroup)
endif
endfunction |
Tu confirmes qu'en désactivant le custom script tu ne boucles toujours que sur une unité alors qu'il y a en plusieurs de ce type non masquées et sur la map ?
Bien que je ne me rappelle plus si le fait d'avoir la compétence infestation et être hide empêche une unité d'être énumérée par son id, ou non, à tester. _________________
|
|
Revenir en haut |
|
|
Keitaro_Ura Floodozaurus
Inscrit le: 21 Aoû 2007 Messages: 2073 Sujets: 38 Spécialité en worldedit: Oui Médailles: 1 (En savoir plus...)
|
Posté le: 15/07/09 19:11 Sujet du message: |
|
|
La fonction bj_wantDestroyGroup annule les effets d'un groupe qui a (Units of type), il faut que tu passes par une variable groupe unité que tu définira et détruira (fonction DestroyGroup) après l'avoir utilisé pour éviter le leak. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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: 15/07/09 19:12 Sujet du message: |
|
|
Keitaro_Ura a écrit: | La fonction bj_wantDestroyGroup annule les effets d'un groupe qui a (Units of type), il faut que tu passes par une variable groupe unité que tu définira et détruira (fonction DestroyGroup) après l'avoir utilisé pour éviter le leak. |
Je me rappelle avoir dit une merde du genre, mais après relecture de la fonction gui je crois que je m'étais simplement trompé car pour ce cas précis, le gui utilise 2 groupes. _________________
|
|
Revenir en haut |
|
|
Keitaro_Ura Floodozaurus
Inscrit le: 21 Aoû 2007 Messages: 2073 Sujets: 38 Spécialité en worldedit: Oui Médailles: 1 (En savoir plus...)
|
Posté le: 15/07/09 19:18 Sujet du message: |
|
|
Sauf que je fais ça tout le temps et ça fonctionne à chaque fois. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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: 15/07/09 19:19 Sujet du message: |
|
|
Keitaro_Ura a écrit: | Sauf que je fais ça tout le temps et ça fonctionne à chaque fois. |
Et si tu emploies le custom script à la place cela ne fonctionne pas ? _________________
|
|
Revenir en haut |
|
|
Keitaro_Ura Floodozaurus
Inscrit le: 21 Aoû 2007 Messages: 2073 Sujets: 38 Spécialité en worldedit: Oui Médailles: 1 (En savoir plus...)
|
Posté le: 15/07/09 19:22 Sujet du message: |
|
|
Pas toujours non, donc pour être sûr, j'utilise la méthode que j'ai citée. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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: 15/07/09 19:25 Sujet du message: |
|
|
Keitaro_Ura a écrit: | Pas toujours non, donc pour être sûr, j'utilise la méthode que j'ai citée. |
Hmm cela semble plus être une faute de ta part, mais par souci d'exactitude je ferais des tests et regarderais le code plus attentivement pour en être certain. _________________
|
|
Revenir en haut |
|
|
Keitaro_Ura Floodozaurus
Inscrit le: 21 Aoû 2007 Messages: 2073 Sujets: 38 Spécialité en worldedit: Oui Médailles: 1 (En savoir plus...)
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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...)
|
|
Revenir en haut |
|
|
Max Floodeur prématuré
Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
|
Posté le: 15/07/09 23:02 Sujet du message: |
|
|
Troll-Brain a écrit: | Tu confirmes qu'en désactivant le custom script tu ne boucles toujours que sur une unité alors qu'il y a en plusieurs de ce type non masquées et sur la map ?
Bien que je ne me rappelle plus si le fait d'avoir la compétence infestation et être hide empêche une unité d'être énumérée par son id, ou non, à tester. |
Si je désactive le custom script, le déclo fonctionne bien et les 11 héros présents slident bien. Et si je remplace toutes les actions par l'affichage d'un texte, celui-ci est bien affiché 11 fois. Autrement dit ce n'est pas la création du groupe le problème, mais le moment de sa destruction.
Keitaro_Ura a écrit: | La fonction bj_wantDestroyGroup annule les effets d'un groupe qui a (Units of type), il faut que tu passes par une variable groupe unité que tu définira et détruira (fonction DestroyGroup) après l'avoir utilisé pour éviter le leak. |
Je ne comprends pas en quoi un groupe créé par la fonction (Units of type) pourrait se comporter différemment de groupes créés par d'autres fonctions oO. L'intérêt du bj_wantDestroyGroup est justement censé être il me semble, de ne pas avoir besoin d'utiliser une variable pour éviter le leak.
edit : et pourtant c'est le cas. En remplaçant (Units of type) par (Units in region), ça fonctionne très bien, ça boucle pour chaque unité concernée.
J'ai une supposition à faire : peut-être que lors du pick every unit d'un groupe créé par la fonction (Units of type), il y a entre chaque pick d'unité, un certain temps qui s'écoule, comme si ça prenait plus de temps à l'ordinateur de récupérer l'unité suivante du groupe.. du coup le groupe serait détruit avant le démarrage des actions pour la deuxième unité. Cette supposition est basée sur le fait que "toutes les actions seraient exécutées séquentiellement (dans l'ordre), sauf dans le cas de délai d'attente, comme lors de l'action wait" (cette phrase est de moi, tirée de mon expérience, peut-être que je me trompe ou que ce n'est pas si simple). _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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: 16/07/09 20:08 Sujet du message: |
|
|
Je peux avoir une map de démo ?
La seule différence c'est que j'utilise une valeur pour l'offset au lieu d'une variable serait ce la goutte d'eau qui ne fait pas déborder le vase ?
J'ai vraiment du mal à le croire ...
Surtout qu'en fait non j'utilise en plus une fonction plus couteuse, le display text.
Mais même avec l'event périodique 0.01s il semble que j'ai bien le nombre de "loop" correct affiché.
J'ai testé avec 12 fantassins sur la map. _________________
|
|
Revenir en haut |
|
|
Max Floodeur prématuré
Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
|
Posté le: 17/07/09 04:14 Sujet du message: |
|
|
Map de démo : test bj_wantDestroyGroup.w3x
Tu as oublié une différence... je suppose que tes 12 fantassins doivent appartenir au joueur rouge. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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: 17/07/09 16:56 Sujet du message: |
|
|
Max a écrit: | Tu as oublié une différence... je suppose que tes 12 fantassins doivent appartenir au joueur rouge. |
"Tu n'as pas deviné " convient mieux,
Étrange je ne loop que sur les unités du joueur rouge, quel que soit le joueur que je choisisse d'incarner et le nombre de fantassins.
Et en effet ne pas utiliser le custom script mais utiliser une variable résout le problème, strange very strange. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
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: 17/07/09 18:56 Sujet du message: |
|
|
*Musique d'X-file*
La vérité est ailleurs
Fonctions gui modifiées pour afficher du texte
Jass: | function GetUnitsOfTypeIdAllFilter2 takes nothing returns boolean
call BJDebugMsg("evaluated")
return GetUnitTypeId(GetFilterUnit()) == bj_groupEnumTypeId
endfunction
function GetUnitsOfTypeIdAll2 takes integer unitid returns group
local group result = CreateGroup()
local group g = CreateGroup()
local integer index
local unit u = CreateUnit(Player(0),'hpea',0.,0.,0.)
call BJDebugMsg("GetUnitsOfTypeIdAll2")
set index = 0
loop
set bj_groupEnumTypeId = unitid
call GroupClear(g)
call BJDebugMsg(I2S(index))
call GroupAddUnit(g,u)
if IsUnitInGroup(u,g) then
call BJDebugMsg("added")
else
call BJDebugMsg("not added")
endif
call GroupRemoveUnit(g,u)
call GroupEnumUnitsOfPlayer(g, Player(index), Filter(function GetUnitsOfTypeIdAllFilter2))
if bj_wantDestroyGroup == true then
call BJDebugMsg("wtf ?!")
else
call BJDebugMsg("normal")
endif
call GroupAddGroup(g, result)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call DestroyGroup(g)
call BJDebugMsg("destroyed")
call RemoveUnit(u)
return result
endfunction
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
set bj_wantDestroyGroup = false
call BJDebugMsg("ForGroup")
if bj_wantDestroyGroup == true then
call BJDebugMsg("bj == true ?!!!!!")
else
call BJDebugMsg("bj == normal ")
endif
call ForGroup(whichGroup, callback)
call BJDebugMsg("FG2")
// If the user wants the group destroyed, do so now.
if (wantDestroy) then
call DestroyGroup(whichGroup)
endif
endfunction |
trigger de test :
Jass: | function Trig_test_Func003Func001Func003C takes nothing returns boolean
if ( not ( GetTerrainTypeBJ(udg_heroLoc) == 'Ldrt' ) ) then
return false
endif
return true
endfunction
function Trig_test_Func003Func001C takes nothing returns boolean
if ( not ( IsUnitAliveBJ(GetEnumUnit()) == true ) ) then
return false
endif
return true
endfunction
function Trig_test_Func003A takes nothing returns nothing
if ( Trig_test_Func003Func001C() ) then
call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_006" )
set udg_heroLoc = GetUnitLoc(GetEnumUnit())
if ( Trig_test_Func003Func001Func003C() ) then
call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_007" )
set udg_heroNewLoc = PolarProjectionBJ(udg_heroLoc, 256, GetUnitFacing(GetEnumUnit()))
call SetUnitPositionLoc( GetEnumUnit(), udg_heroNewLoc )
call RemoveLocation(udg_heroNewLoc)
else
endif
call RemoveLocation(udg_heroLoc)
else
endif
call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_001" )
call DisplayTextToForce( GetPlayersAll(), GetPlayerName(GetOwningPlayer(GetEnumUnit())) )
endfunction
function Trig_test_Actions takes nothing returns nothing
call DisplayTextToForce( GetPlayersAll(), "test" )
set bj_wantDestroyGroup = true
call ForGroupBJ2( GetUnitsOfTypeIdAll2('hfoo'), function Trig_test_Func003A )
endfunction
//===========================================================================
function InitTrig_test takes nothing returns nothing
set gg_trg_test = CreateTrigger( )
call TriggerRegisterPlayerEventEndCinematic( gg_trg_test, Player(0) )
call TriggerRegisterPlayerEventEndCinematic( gg_trg_test, Player(7) )
call TriggerAddAction( gg_trg_test, function Trig_test_Actions )
endfunction |
"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 ...
Et donc seules les unités du joueur rouge (Player(0)) sont énumérés.
Moi pas comprendre pourquoi les fonctions sont appelées dans cet ordre ...
Faudra que je fasses plus de tests à ce propos. _________________
|
|
Revenir en haut |
|
|
|