Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 27/06/12 11:56 Sujet du message: déclencheur qui se se lance pas
salutation, oui c'est mon nouveau problème à la mode. ce déclencheur veut pas se lancer, c'est assez étrange et pour le coup j'n'ai aucune piste particulière.
Jass:
globals
real COLLISION_HEROS = 70
group array Group_check_unit
group Group_jump = CreateGroup()
group Group_transporteur = CreateGroup()
group Group_teleporteur = CreateGroup()
integer JUMP = 'o001'
integer TRANSPORTEUR = 'o000'
integer TELEPORTEUR = 'o002'
endglobals
function Null takes nothing returns boolean
return true
endfunction
function CheckUnit takes nothing returns nothing
local unit u
local integer n = GetTimerData(GetExpiredTimer())
local unit heros = Heros_j[n]
local group G = Group_check_unit[n]
local integer max = CountUnitsInGroup(G)
local integer i = 0
call BJDebugMsg("ii")
loop
exitwhen i > max
call BJDebugMsg("iiiiiii")
set u = GroupPickRandomUnit(G)
if IsUnitInGroup(u, Group_jump) then
call JumpUnit(Heros_j[n], u)
call BJDebugMsg("ii")
elseif IsUnitInGroup(u, Group_transporteur) then
// call TransporteurUnit(Heros_j[n], u)
elseif IsUnitInGroup(u, Group_teleporteur) then
// call TeleporteurUnit(Heros_j[n], u)
endif
call GroupRemoveUnit(G, u)
set i = i + 1
set u = null
endloop
set heros = null
endfunction
function Trig_checkunit_Actions takes nothing returns nothing
local integer i = 0
local timer t = NewTimer()
call BJDebugMsg("i")
loop
exitwhen i > 11
call BJDebugMsg("iiiiiii")
if Is_activ_j[i] then
call GroupEnumUnitsInRange(Group_check_unit[i], GetUnitX(Heros_j[i]), GetUnitY(Heros_j[i]), COLLISION_HEROS, Filter(function Null))
call SetTimerData(t, i)
call TimerStart(t, 0, false, function CheckUnit)
endif
set i = i + 1
endloop
call DestroyTimer(t)
endfunction
//===========================================================================
function InitTrig_checkunit takes nothing returns nothing
set gg_trg_checkunit = CreateTrigger( )
call TriggerRegisterTimerEvent(gg_trg_checkpath, 0.05, true)
call TriggerAddAction( gg_trg_checkunit, function Trig_checkunit_Actions )
call DisableTrigger(gg_trg_checkunit)
endfunction
voici la suite du déclos même si pour le problème en question il n'est pas très nécessaire :
Secret:
Jass:
library Jump uses TimerUtils
struct Parabole
unit u
real a
real b
real c
real incrementation
real x = 0
static method Jumping takes nothing returns nothing
local Parabole p = GetTimerData(GetExpiredTimer())
local real a = p.a
local unit u = p.u
local real b = p.b
local real c = p.c
local real incrementation = p.incrementation
local real x = p.x
set x = x + incrementation
if GetUnitFlyHeight(u) > 0 then
call SetUnitFlyHeight(u, a * Pow(x, 2) + b * x + c, 0)
call SetTimerData(GetExpiredTimer(), p)
function JumpUnit takes unit slider, unit jumper returns nothing
local real height = LoadReal(HASHTABLE_JUMPING, GetHandleId(jumper), 1)
local real time = LoadReal(HASHTABLE_JUMPING, GetHandleId(jumper), 2) // pour avoir la vitesse pour une période de 0.05
local real speed = (height * 0.05) / time
local real a = height / 40;Pow40;time, 2) / 4 - Pow40;time, 2) / 2)
local real b = -1 * a * time
local real c = GetUnitFlyHeight40;slider41;
local Parabole p = Parabole.create40;41;
local timer t = CreateTimer40;41;
set p.u = slider
set p.a = a
set p.b = b
set p.c = c
set p.incrementation = speed
call SetTimerData40;t, p41;
call TimerStart40;t, 0.05, true, function Parabole.Jumping41;
call DestroyTimer40;t41;
endfunction
endlibrary
voila j'vous prierais de ne pas trop vous concentrer sur l'aspect rudimentaire de ma structure et de son utilisation, je débute et j'ai pas encore fini de l'optimiser sur ce que sapeur m'a déjà dit dessus.
pour l'info, j'n'ai aucun texte qui s'affiche.
sinon je le met enable dans un autre déclos qui se lance très bien (le même qui crée mon héros en début de partie, et il est très bien créé) enfin je vous le met quand même en spoiler aussi :
function Trig_create_heros_Actions takes nothing returns nothing
local real dist_angle = 360 / Nb_player
local real dist_unit = 30
local real rayon
local real ordonate
local integer i = 0
local real angle = 0
set ordonate = SinBJ((180 - dist_angle) / 2) * dist_unit
if SinBJ(dist_angle) == 0 or ordonate == 0 then
set rayon = dist_unit
else
set rayon = ordonate / SinBJ(dist_angle)
endif
set Slide_j[0] = gg_trg_slide_j0
set Slide_j[1] = gg_trg_slide_j1
set Slide_j[2] = gg_trg_slide_j2
set Slide_j[3] = gg_trg_slide_j3
set Slide_j[4] = gg_trg_slide_j4
set Slide_j[5] = gg_trg_slide_j5
set Slide_j[6] = gg_trg_slide_j6
set Slide_j[7] = gg_trg_slide_j7
set Slide_j[8] = gg_trg_slide_j8
set Slide_j[9] = gg_trg_slide_j9
set Slide_j[10] = gg_trg_slide_j10
loop
exitwhen i > Nb_player
if Is_activ_j[i] then
set Heros_j[i] = CreateUnit(Player(i), HEROS, GetRectCenterX(LVL_DEPART[0]) + rayon * CosBJ(angle), GetRectCenterY(LVL_DEPART[0]) + rayon * SinBJ(angle), 0)
set Invis_unit_j[i] = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), INVIS_UNIT, GetRectCenterX(LVL_DEPART[0]) + rayon * CosBJ(angle), GetRectCenterY(LVL_DEPART[0]) + rayon * SinBJ(angle), 0)
set angle = angle + dist_angle
endif
set i = i + 1
endloop
call EnableTrigger(gg_trg_checkpath)
endfunction
//===========================================================================
function InitTrig_create_heros takes nothing returns nothing
set gg_trg_create_heros = CreateTrigger( )
call TriggerRegisterTimerEvent(gg_trg_create_heros, 1, false)
call TriggerAddAction( gg_trg_create_heros, function Trig_create_heros_Actions )
endfunction
de toute façon j'ai essayé sans le disable/enable ça change rien (j'l'ai mi car sinon les variable sutilisé dans checkunit ne sont pas définis) _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 27/06/12 14:58 Sujet du message:
Jass:
function InitTrig_checkunit takes nothing returns nothing
set gg_trg_checkunit = CreateTrigger( )
call TriggerRegisterTimerEvent(gg_trg_checkpath, 0.05, true)
call TriggerAddAction( gg_trg_checkunit, function Trig_checkunit_Actions )
call DisableTrigger(gg_trg_checkunit) // Loul?
endfunction
Sinon, par pitié, sers-toi des initializers. Ça va te simplifier la vie.
J'ai aussi remarqué que dans ta struct, tu détruit le timer juste après l'avoir lancé, ça ne risque pas de fonctionner . Il faudrait que tu le détruise dans ta méthode Jumping si tu en utilises plusieurs. De même qu'il n'est pas nécessaire que redéfinir la data du timer à chaque fois dans la méthode Jumping. _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 27/06/12 15:19 Sujet du message:
Ah oui, j'ai pas lu jusqu'à la fin ^^.
J'ai testé le code et ça marche chez moi. Cela vient peut-être de TimerUtils. J'ai eu un bug similaire un jour avec. Essaye de mettre CreateTimer au lieu de NewTimer pour voir ce que ça donne. S'il renvoie une variable de type timer qui n'est pas définie (même pas null), les actions suivantes ne seront pas exécutées. _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 27/06/12 15:43 Sujet du message:
Euh, bah alors je vois pas où peut être le problème . Mets un BJDebugMsg dans la fonction d'initialisation pour voir si elle crée bien le déclencheur. _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 27/06/12 15:51 Sujet du message:
Ok, c'est bon.
Tu assigne l'événement à la variable gg_trg_checkpath mais l'action à gg_trg_checkunit. Donc à la place de TriggerRegisterTimerEvent(gg_trg_checkpath, 0.05, true) mets plutôt TriggerRegisterTimerEvent(gg_trg_checkunit, 0.05, true).
Un initialisateur aurait tout évité, t'aurais créé un trigger manuellement . _________________
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 27/06/12 18:50 Sujet du message:
ce sont les même déclos donc j'me suis dit que j'allais pas refair eun sujet même si il le faudrait, mais voila (probablement un problème dans ma structure)
à la première exécution tout ce passe bien l'unité décolle et réatterrie, seulement quan dje retourne pour sauter bin ça ne veut plus se faire. des idées ? faut-il détruire l'instance de la structure créé ?
édit >> d'après mes recherches ça vient de l'utilisation de TimerUtils que je fais, je vais créer un nouveau topic. _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Page 1 sur 1 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