online faq recherche accueil
 

Il y a 138 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

escape -> slide et death terrains

 
n°4589661
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 18:10:04  profilanswer
 

   Revenons sur ce sujet que j'avais posté il y a très longtemps. On a deux possibilités : faire beaucoup de régions (qu'il faut de plus  placer avec beaucoup de précision) ou regarder périodiquement le terrain sur lequel se trouve le héros. (une période de 0.05 est l'idéal, en dessous c'est un peu juste). Juste à présent j'utilisais le periodic event mais c'est du gaspillage de ressources, et je n'ai pas non plus envie de perdre du temps à créer des centaines de régions. Mais je crois avoir trouvé une solution bien meilleure...
 
    Principe de mon idée : faire la méthode des régions, mais à la place de les créer soit-même, les faire générer par l'ordinateur au départ de la map. Ca ne fonctionne pas pour l'instant, je ne vois pas trop pourquoi... voila mon trigger (s'éxécutant à l'initialisation de la map ) :

Code :
  1. function Trig_init_terrain_changing_events_Actions takes nothing returns nothing
  2.     local real minX = GetRectCenterX( gg_rct_bas_gauche ) //bas_gauche est une région dont le centre se situe dans le coin inférieur gauche de la map
  3.     local real minY = GetRectCenterY( gg_rct_bas_gauche )
  4.     local real maxX = GetRectCenterX( gg_rct_haut_droite )//haut_droite idem sauf en haut à droite
  5.     local real maxY = GetRectCenterY( gg_rct_haut_droite )
  6.     local real x = minX
  7.     local real y = minY
  8.     local real ecart = 32 //la dimension de la plus petite région possible (je crois que c'est une cellule) est de 32 sur 32, donc la distance entre deux cellules adjacentes est de 32
  9.     local region slide_reg = CreateRegion()
  10.     local region death_reg = CreateRegion()
  11.     local region walk_terrain_reg = CreateRegion()
  12.     local integer terrain_type
  13. //on parcourt toutes les cellules possibles de la map :
  14.     loop
  15.         exitwhen x >= maxX
  16.        
  17.         loop
  18.             exitwhen y >= maxY
  19.             set terrain_type = GetTerrainType( x, y )
  20.             if terrain_type == udg_death_terrain then
  21.                 call RegionAddCell( death_reg, x, y )
  22.             else
  23.             if terrain_type == udg_slide_terrain then
  24.                 call RegionAddCell( slide_reg, x, y )
  25.             else
  26.                 call RegionAddCell( walk_terrain_reg, x, y ) //si le terrain n'est pas de glisse ou de mort, alors c'est le terrain classique où l'on marche
  27.             endif
  28.             endif
  29.             endif
  30.             set y = y + ecart
  31.  
  32.         endloop
  33.        
  34.         set y = minY //j'avais oublié de réinitialiser y ici  
  35.         set x = x + ecart
  36.     endloop
  37. //slide begin
  38.     call TriggerRegisterEnterRegion( gg_trg_debut_slide, slide_reg, null )
  39. //slide stopping
  40.     call TriggerRegisterEnterRegion( gg_trg_fin_slide, walk_terrain_reg, null )
  41. //death terrain
  42.     call TriggerRegisterEnterRegion( gg_trg_death_terrain, death_reg, null )//ds le trigger de mort, on tue le perso et on arrête éventuellement son slide
  43. endfunction
  44. //===========================================================================
  45. function InitTrig_init_terrain_changing_events takes nothing returns nothing
  46.     set gg_trg_init_terrain_changing_events = CreateTrigger(  )
  47.     call TriggerAddAction( gg_trg_init_terrain_changing_events, function Trig_init_terrain_changing_events_Actions )
  48.     call TriggerRegisterPlayerChatEvent( gg_trg_init_terrain_changing_events, Player(0), "test", true )
  49. endfunction


Je ne mets pas les déclo de slide et de mort, il n'ont rien de spécial (à moins que qqun le demande)


Message édité par Maximaxou le 21-04-2007 à 18:46:00

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589665
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 21-04-2007 à 18:34:49  profilanswer
 

Essaye de faire ta fonction permettant d'ajouter les cellules dans le custom script et appelle la périodiquement avec un timer, surement que le chien de garde montre ses crocs et stoppe l'éxécution de la fonction car elle met trop de temps.
Evidemment tu devras utiliser des globales à la place des locales


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589667
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 18:50:42  profilanswer
 

   Tu as partiellement raison. Je fais afficher "début" au début du déclo, et "fin" à la fin du déclo. "Fin" ne s'affiche pas si les régions sont très écartées, mais s'affiche si elles sont assez proches. Néammoins l'exécution est très rapide. 5 secondes seraient nécessaires pour faire toute la map. Je pense que c'est une boucle trop grande et que c'est pourquoi l'éditeur bloque. (cf explication d'Ayane quand tu me disais de faire une boucle vide) Par contre quand "fin" s'affiche, ça marche nikel :). (entre les deux régions bien sûr). Je ne comprends pas bien ce que tu veux dire. Qu'est ce que je dois faire périodiquement ? Je crois que si je mettais un wait(0.01) de temps en temps ça marcherait. Mais bon, ça augmenterait nettement le tps que ça prendrait à se faire. (surtout que ça attenderait pas 0.01 s mais bien plus)


Message édité par Maximaxou le 21-04-2007 à 18:53:21

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589668
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 21-04-2007 à 18:56:16  profilanswer
 

c'est ce que je voulais dire, j'ai tout à fait raison xD, si la boucle est trop longue à s'éxécuter l'éxécution du trigger est stoppé purement et simplement.
 
call TimerStart(Tontimer créé spécialement, 0.0,true, function AjouterDesCellules ).
 
Dans la fonction AjouterDesCellules tu n'oublies pas de mettre en pause le compteur et le detruire quand il faut.
 
Si tu ne le pause pas avant de le détuire il peut encore se terminer parfois.
 
De toute facon c'est la seule solution que j'ai à l'esprit pour empêcher la boucle de stopper, s'il faut tu fais patienter les joueurs avec une tite cinématique ^^
Mais je suis pas sûr qu'avec une valeur de 0 ca fonctionne, à tester, sinon bah tu mets 0.01 et là ca attendra bien à un poil prés 0.01, le temps nécessaire sera proportionnel au nombre de cellules à rajouter
 
Ah je suis bête dans la fonction AjouterDesCellules tu peux trouver le nombre de loops maxi que tu peux mettre ainsi tu gagneras énormément en temps, les joueurs n'y verront que du feu, le temps que l'ecran noir disparaisse, qu'ils sélectionnent leur unité et avancent, c'est réglé  :sol:  


Message édité par Troll-Brain le 21-04-2007 à 19:12:15

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589670
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 19:20:20  profilanswer
 

J'ai trouvé une méthode plus simple :

Code :
  1. function Trig_init_terrain_changing_events_Actions2 takes nothing returns nothing
  2.     local real minX = GetRectCenterX( gg_rct_bas_gauche )
  3.     local real minY = GetRectCenterY( gg_rct_bas_gauche )
  4.     local real maxX = GetRectCenterX( gg_rct_haut_droite )
  5.     local real maxY = GetRectCenterY( gg_rct_haut_droite )
  6.     local real x = minX
  7.     local real y = minY
  8.     local real ecart = 32
  9.     local region slide_reg = CreateRegion()
  10.     local region death_reg = CreateRegion()
  11.     local region random_turn_reg = CreateRegion()
  12.     local region walk_terrain_reg = CreateRegion()
  13.     local integer i = 0
  14.     local integer terrain_type
  15.     call DisplayTextToForce( GetPlayersAll(), "debut" )
  16.     loop
  17.         exitwhen x > maxX
  18.        
  19.         loop
  20.             exitwhen y > maxY
  21.             set terrain_type = GetTerrainType( x, y )
  22.             if terrain_type == udg_death_terrain then
  23.                 call RegionAddCell( death_reg, x, y )
  24.             else
  25.             if terrain_type == udg_slide_terrain then
  26.                 call RegionAddCell( slide_reg, x, y )
  27.             else
  28.  
  29.             if terrain_type == udg_random_turn_terrain then
  30.                 call RegionAddCell( random_turn_reg, x, y )
  31.             else
  32.                 call RegionAddCell( walk_terrain_reg, x, y )
  33.             endif
  34.             endif
  35.             endif
  36.             set y = y + ecart
  37.  
  38.         endloop
  39.  
  40.         set x = x + ecart
  41.         set i = i + 1
  42.         set y = minY
  43.         if i == 13 then
  44.             call DisplayTextToForce( GetPlayersAll(), "i = "+I2S(i))
  45.             call TriggerSleepAction( 0.00 )
  46.             set i = 0
  47.         endif
  48.     endloop
  49.     call DisplayTextToForce( GetPlayersAll(), "fin" )
  50. //slide begin
  51.     call TriggerRegisterEnterRegion( gg_trg_debut_slide_2, slide_reg, null )
  52.     call TriggerRegisterEnterRegion( gg_trg_debut_slide_2, random_turn_reg, null )
  53. //slide stopping
  54.     call TriggerRegisterEnterRegion( gg_trg_fin_slide_2, walk_terrain_reg, null )
  55. //random turn on/off
  56.     call TriggerRegisterEnterRegion( gg_trg_random_turn_deb, random_turn_reg, null )
  57.     call TriggerRegisterLeaveRegion( gg_trg_random_turn_fin, random_turn_reg, null )
  58. //death terrain
  59.     call TriggerRegisterEnterRegion( gg_trg_death_terrain_2, death_reg, null )
  60. endfunction


    Avec max i = 14 ça ne marche pas ^^. Maintenant ce qu'il faudrait, c'est réussir à optimiser le code afin de pouvoir augmenter i.
PS : random turn c'est un autre terrain, ne te demande pas à quoi il sert ^^.
 
Actuellement, avec une map d'une taille de 16 000 x 16000, le trigger met 10,5 secondes à s'exécuter. Mais ce que j'aimerais vraiment, c'est qu'il se fasse à l'initialisation, sans qu'il y ai besoin de wait :/. Je pourrais peut-être diviser cette grande boucle en plus petites boucles.. je vais essayer ça.


Message édité par Maximaxou le 21-04-2007 à 19:25:10

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589671
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 21-04-2007 à 19:28:34  profilanswer
 

nan c'est de la merde le trigger sleep action est beaucoup trop long au minimum 0.2 seconde il me semble.
 
Sinon il existe elseif je ne sais pas si ca va optimiser mais bon ...
Enfin faut pas oublier que I2S et display sont des actions trés longues (comparé au set de variables), enfin c'est peut être bon d'avoir un peu de marge pour les pc les plus lents ^^


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589672
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 19:33:02  profilanswer
 

Je pourrais quitter la boucle quand i = 13, et la recommencer après. Mais dans ce cas il faut que je fasse (j'ai compté) 46 fois la boucle. Il me faudrait une fonction qui contient cette boucle. Or je crois qu'il est impossible de faire des variables globales de type régions :/. Seulement rect. (je me trompe ?) Et une fonction ne peut retourner qu'une seule valeur en gui. Or ici j'ai besoin de mes 4 régions.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589673
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 19:36:42  profilanswer
 

Très longues ? Je ne peux même pas passer i à 14 en enlevant le display...


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589674
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 21-04-2007 à 19:39:45  profilanswer
 

bah oui le rapport doit bien être au minimum 1/10 mais on parle en nanosecondes surement xD.
 
Essaye avec we helper
 
au debut du code script personnalise tu fais :
 
globals
 
region Tavariable1=CreateRegion()
region Tavariable2=CreateRegion()
etc ..
 
 
endglobals


Message édité par Troll-Brain le 21-04-2007 à 19:42:56
n°4589675
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 19:47:07  profilanswer
 

Tu peux déclarer des variables globales comme ça avec we helper ? Tu peux me filer le lien stp, j'ai pas le bon ordi là :/
edit: ah c bon jai trouvé


Message édité par Maximaxou le 21-04-2007 à 19:48:58

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589676
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 21-04-2007 à 19:49:47  profilanswer
 

tu cherches sur wc3campaigns.net comme un grand garcon que tu es.
On peut déclarer des globales de cette manière par contre en effet je n'ai pas essayé avec des variables non disponibles avec le gui mais je ne penses pas que cela pose problème, on peut bien faire des local dans une structure gui ^^


Message édité par Troll-Brain le 21-04-2007 à 19:50:04

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589680
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 19:55:40  profilanswer
 

Citation :

on peut bien faire des local dans une structure gui ^^


J'avais raison sur le fait que local udg_... ne marche plus. Maintenant j'en suis sûr... mais peut-être qu'avec we helper, on peut le faire et dans ce cas on avait ts les deux raison ^^.  
 

Citation :

On peut déclarer des globales de cette manière par contre en effet je n'ai pas essayé avec des variables non disponibles avec le gui mais je ne penses pas que cela pose problème


erreur avec we normal, avec we helper c parfé..... putin ya les numéros des lignes et c en couleurs... et on peut même voir les fonctions natives.. plus besoin de jasscraft ? C'est trop génial (merci :D)


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589681
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 21-04-2007 à 19:57:12  profilanswer
 

MONTRE MOI TON UTILISATION DE L'ASTUCE CA MARCHE TOUJOURS SALE NOOB xD
sinon c'est normal le parseur n'est plus celui d'origine , la déclaration des globales de cette manière a été rajoutée


Message édité par Troll-Brain le 21-04-2007 à 19:58:08

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589682
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 20:04:25  profilanswer
 

Je ne comprends pas... quand je change le contenu du script perso, que je vais ds un déclencheur puis reviens, il est à nouveau comme avant !
 
A part ça chui content, j'ai enfin trouvé la technique ultime pour le terrain de mort et l'activation/désactivation du slide ! :D
 
PS : merci troll-brain, grâce à toi je sais maintenant qu'une region est un ensemble de rect, et sans ça j'aurais jamais pu trouver


Message édité par Maximaxou le 21-04-2007 à 20:09:32

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589689
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 21-04-2007 à 20:47:41  profilanswer
 

Jeune padawan ta formation achevée tout à fait n'est pas, mais les bases solides sont, sur cette lancée continue, car mon dernier jour de post cela est.
Désormais sur tes épaules de lourdes reponsabilitées péseront.
 
Faire preuve de patience tu devras.
Réfléchir avant de parler tu feras.
Tester avant d'affirmer tu penseras
 
Et du côté obscur de la force ne bascule pas, le chemin de la facilité, le gui.
 
Que la force soit avec toi.
 
Ultime post avant de rentrer dans la légende  :D


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4589691
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 20:53:50  profilanswer
 

lol. (TT) Mais jesper kon se verra sur msn... mais bordel pkoi jpe po modifier le custom script ?


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589692
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 20:54:58  profilanswer
 

ah ok. fo fer file --> save.. mais a koi ça sert au juste ?
 
--> à réparer ses conneries ok ^^
(bon jarete de dire nimp^^)


Message édité par Maximaxou le 21-04-2007 à 20:56:21

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589695
Maximaxou
rejoignez les fidèles du JASS
Posté le 21-04-2007 à 23:18:51  profilanswer
 

Alors, ce que j'ai fait provoque une erreur (fatal error : la mémoire ne pouvait pas être lue à un certain endroit)  :

Code :
  1. globals
  2.     region slide_reg = CreateRegion()
  3.     region death_reg = CreateRegion()
  4.     region random_turn_reg = CreateRegion()
  5.     region walk_terrain_reg = CreateRegion()
  6.     real t_minX = GetRectCenterX( gg_rct_bas_gauche )
  7.     real t_minY = GetRectCenterY( gg_rct_bas_gauche )
  8.     real t_maxX = GetRectCenterX( gg_rct_haut_droite )
  9.     real t_maxY = GetRectCenterY( gg_rct_haut_droite )
  10.     real t_ecart = 32
  11.     real t_x = t_minX
  12.    
  13. endglobals


Code :
  1. function AddTerrainInit takes integer nbLignes returns nothing
  2.    
  3.     local integer i = 0
  4.     local real y = t_minY
  5.     local integer terrain_type
  6.    
  7.     loop
  8.         exitwhen ( t_x > t_maxX ) or ( i >= nbLignes )
  9.         loop
  10.             exitwhen y > t_maxY
  11.             set terrain_type = GetTerrainType( t_x, y )
  12.             if terrain_type == udg_death_terrain then
  13.                 call RegionAddCell( death_reg, t_x, y )
  14.             elseif terrain_type == udg_slide_terrain then
  15.                 call RegionAddCell( slide_reg, t_x, y )
  16.             elseif terrain_type == udg_random_turn_terrain then
  17.                 call RegionAddCell( random_turn_reg, t_x, y )
  18.             else
  19.                 call RegionAddCell( walk_terrain_reg, t_x, y )
  20.             endif
  21.            
  22.             set y = y + t_ecart
  23.  
  24.         endloop
  25.  
  26.         set t_x = t_x + t_ecart
  27.         set i = i + 1
  28.         set y = t_minY
  29.     endloop
  30.    
  31. endfunction


Code :
  1. function Trig_init_terrain_changing_events_Actions2 takes nothing returns nothing
  2.     local integer nbLignes = 13
  3.     call DisplayTextToForce( GetPlayersAll(), "debut" )
  4.     call AddTerrainInit( nbLignes )
  5.     call AddTerrainInit( nbLignes ) //en appelant la fonction une seule fois ça ne marche pas non plus
  6.     call AddTerrainInit( nbLignes )
  7.     call DisplayTextToForce( GetPlayersAll(), "fin" )
  8. //slide begin
  9.     call TriggerRegisterEnterRegion( gg_trg_debut_slide_2, slide_reg, null )
  10.     call TriggerRegisterEnterRegion( gg_trg_debut_slide_2, random_turn_reg, null )
  11. //slide stopping
  12.     call TriggerRegisterEnterRegion( gg_trg_fin_slide_2, walk_terrain_reg, null )
  13. //random turn on/off
  14.     call TriggerRegisterEnterRegion( gg_trg_random_turn_deb, random_turn_reg, null )
  15.     call TriggerRegisterLeaveRegion( gg_trg_random_turn_fin, random_turn_reg, null )
  16. //death terrain
  17.     call TriggerRegisterEnterRegion( gg_trg_death_terrain_2, death_reg, null )
  18. endfunction
  19. //===========================================================================
  20. function InitTrig_init_terrain_changing_events_Copier takes nothing returns nothing
  21.     set gg_trg_init_terrain_changing_events_Copier = CreateTrigger(  )
  22.     call TriggerAddAction( gg_trg_init_terrain_changing_events_Copier, function Trig_init_terrain_changing_events_Actions2 )
  23.     call TriggerRegisterPlayerChatEvent( gg_trg_init_terrain_changing_events_Copier, Player(0), "test", true )
  24. endfunction


Je ne comprends vraiment pas le problème :/
Changer la valeur de nbLignes ne résout rien.
Je n'ai jamais eu ce type d'erreur auparavant donc je ne sais pas quoi faire :(.


Message édité par Maximaxou le 21-04-2007 à 23:26:16

---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589696
gro_shaman
Ah... World edit...
Posté le 22-04-2007 à 00:44:23  profilanswer
 

Tu as meme pas les informations qui te disent quelles lignes de code ne fonctionnent pas? (le fatal error est en jeu ou au lancement du test?)
 
Sinon ca va te prendre du temps mais tu peux regarder pas à pas chaque partie et regarder dans quelle zone/domaine ca à l'air de buger.


---------------
http://www.acathla.com/
n°4589697
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-04-2007 à 01:20:25  profilanswer
 


 
 
C'est exactement ce que j'ai fait ^^.
 

Citation :

globals
 
    region slide_reg = CreateRegion()
    region death_reg = CreateRegion()
    region random_turn_reg = CreateRegion()
    region walk_terrain_reg = CreateRegion()
    real t_minX = GetRectCenterX( gg_rct_bas_gauche )
    real t_minY = GetRectCenterY( gg_rct_bas_gauche )
    real t_maxX = GetRectCenterX( gg_rct_haut_droite )
    real t_maxY = GetRectCenterY( gg_rct_haut_droite )
    real t_ecart = 32
    real t_x = t_minX
   
endglobals


Premiere erreur, il fallait initialiser minX maxX minY maxY et x à 0, et leur donner leur bonne valeur au début de "Trig_init_terrain_changing_events_Actions2", ce que j'ai fait. Néammoins ça plante toujours pareil. Dans la fonction AddTerrainInit.

Code :
  1. function AddTerrainInit takes nothing returns nothing
  2.    
  3.     local integer i = 0
  4.     local real y = t_minY
  5.     local integer terrain_type
  6.         call DisplayTextToForce(GetPlayersAll(),"t_x = "+R2S(t_x)+"  y = "+R2S(y))
  7.         call TriggerSleepAction(1)
  8.     loop
  9.         exitwhen ( t_x > t_maxX ) or ( i >= t_nbLignes )
  10.         call DisplayTextToForce(GetPlayersAll(),"1" )
  11.        call TriggerSleepAction(1)
  12.         loop
  13.             exitwhen y > t_maxY
  14.                    call DisplayTextToForce(GetPlayersAll(),"2" )
  15.                    call TriggerSleepAction(1)
  16.             set terrain_type = GetTerrainType( t_x, y )
  17.                    call DisplayTextToForce(GetPlayersAll(),"3" )
  18.                    call TriggerSleepAction(1)
  19.             if terrain_type == udg_death_terrain then
  20.                      call DisplayTextToForce(GetPlayersAll(),"4" )
  21.                      call TriggerSleepAction(1)
  22.                 call RegionAddCell( death_reg, t_x, y )
  23.                      call DisplayTextToForce(GetPlayersAll(),"5" )
  24.                      call TriggerSleepAction(1)
  25.             else
  26.                      call DisplayTextToForce(GetPlayersAll(),"6" )
  27.                      call TriggerSleepAction(1)
  28.             if terrain_type == udg_slide_terrain then
  29.                      call DisplayTextToForce(GetPlayersAll(),"7" )
  30.                      call TriggerSleepAction(1)
  31.                 call RegionAddCell( slide_reg, t_x, y )
  32.             else
  33.                      call DisplayTextToForce(GetPlayersAll(),"8" )
  34.                      call TriggerSleepAction(1)
  35.             if terrain_type == udg_random_turn_terrain then
  36.                      call DisplayTextToForce(GetPlayersAll(),"9" )
  37.                      call TriggerSleepAction(1)
  38.                 call RegionAddCell( random_turn_reg, t_x, y )
  39.             else
  40.                      call DisplayTextToForce(GetPlayersAll(),"10" )
  41.                      call TriggerSleepAction(1)
  42.                 call RegionAddCell( walk_terrain_reg, t_x, y )
  43.                      call DisplayTextToForce(GetPlayersAll(),"11" )
  44.             endif
  45.             endif
  46.             endif
  47.             call TriggerSleepAction(0.5)
  48.             call DisplayTextToForce(GetPlayersAll(),I2S(i))
  49.            
  50.             set y = y + t_ecart
  51.  
  52.         endloop
  53.  
  54.         set t_x = t_x + t_ecart
  55.         set i = i + 1
  56.         set y = t_minY
  57.     endloop
  58.    
  59. endfunction


Sa affiche: 1, 2, 3, 6, 8, 10 et ça plante. Ce qui veut dire que c'est l'action "call RegionAddCell( walk_terrain_reg, t_x, y )" qui foire. J'ai vérifié, t_x et y ont les bonnes valeurs. Ca marchait avant, et là pourtant ça foire. Je ne comprends vraiment pas :/


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589698
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-04-2007 à 01:25:01  profilanswer
 

Ahhhhhhhh. L'initialisation des région à "CreateRegion()" ne fonctionne pas (va savoir pourquoi). J'ai rajouté set xx = CreateRegion() au début des actions, pour les 4 régions. 11 s'est affiché ^^.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589699
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-04-2007 à 01:38:56  profilanswer
 

Bon bin plusieurs appels de la fonction AddTerrainInit revient au même qu'une boucle :/. Va en effet faloir utiliser un compteur ou un périodic event.


---------------
Dota c'est bien, le slide c'est encore mieux !
n°4589762
Maximaxou
rejoignez les fidèles du JASS
Posté le 24-04-2007 à 01:47:25  profilanswer
 

J'ai donc utilisé un periodic event. J'ai deux déclo :

Code :
  1. globals   // Attention, we helper est nécessaire pour déclarer des variables globales de cette façon.
  2.     region slide_reg = CreateRegion()
  3.     region death_reg = CreateRegion()
  4.     region random_turn_reg = CreateRegion()
  5.     region walk_terrain_reg = CreateRegion()
  6.     real t_minX = 0
  7.     real t_minY = 0
  8.     real t_maxX = 0
  9.     real t_maxY = 0
  10.     real t_x = 0
  11.     integer t_nbLignes = 10
  12.     real t_ecart = 32
  13. endglobals
  14. function AddTerrainInit takes nothing returns boolean
  15.    
  16.     local integer i = 0
  17.     local real y = t_minY
  18.     local integer terrain_type
  19.    
  20.     //call DisplayTextToForce(GetPlayersAll(),"new" )     
  21.     loop 
  22.         if ( i >= t_nbLignes ) then
  23.             return false
  24.         endif
  25.        
  26.         if ( t_x > t_maxX ) then
  27.             call TriggerExecute( gg_trg_end_initTerr )
  28.             call DestroyTrigger( GetTriggeringTrigger() )
  29.             return false
  30.         endif
  31.        
  32.         //call DisplayTextToForce(GetPlayersAll(),"t_x = "+R2S(t_x))
  33.                  
  34.         loop
  35.             exitwhen y > t_maxY
  36.             set terrain_type = GetTerrainType( t_x, y )
  37.             if terrain_type == udg_death_terrain then
  38.                 call RegionAddCell( death_reg, t_x, y )
  39.             elseif terrain_type == udg_slide_terrain then
  40.                 call RegionAddCell( slide_reg, t_x, y )
  41.                
  42.             elseif terrain_type == udg_random_turn_terrain then
  43.                 call RegionAddCell( random_turn_reg, t_x, y )
  44.                
  45.             else
  46.                 call RegionAddCell( walk_terrain_reg, t_x, y )
  47.             endif
  48.                  
  49.             set y = y + t_ecart
  50.         endloop
  51.  
  52.         set t_x = t_x + t_ecart
  53.         set i = i + 1
  54.         set y = t_minY
  55.     endloop
  56.    
  57.     return false
  58. endfunction
  59. //===========================================================================
  60. function InitTrig_initTerr takes nothing returns nothing
  61.     set t_minX = GetRectCenterX( gg_rct_bas_gauche )
  62.     set t_minY = GetRectCenterY( gg_rct_bas_gauche )
  63.     set t_maxX = GetRectCenterX( gg_rct_haut_droite )
  64.     set t_maxY = GetRectCenterY( gg_rct_haut_droite )
  65.     set t_x = t_minX
  66.     set slide_reg = CreateRegion()
  67.     set death_reg = CreateRegion()
  68.     set random_turn_reg = CreateRegion()
  69.     set walk_terrain_reg = CreateRegion()
  70.    
  71.     set gg_trg_initTerr = CreateTrigger(  )
  72.     call TriggerRegisterTimerEventPeriodic( gg_trg_initTerr, 0.01 )
  73.     call TriggerAddCondition( gg_trg_initTerr, Condition( function AddTerrainInit ))
  74. endfunction


Code :
  1. function unpauseOne takes nothing returns nothing
  2.     call PauseUnit( GetEnumUnit(), false )
  3. endfunction
  4. function end_initTerr_Actions takes nothing returns nothing
  5.     call DisplayTextToForce( GetPlayersAll(), "fin à : " + R2S(TimerGetElapsed(udg_test_timer)) )
  6. //slide begin
  7.     call TriggerRegisterEnterRegion( gg_trg_debut_slide, slide_reg, null )
  8.     call TriggerRegisterEnterRegion( gg_trg_debut_slide, random_turn_reg, null )
  9. //slide stopping
  10.     call TriggerRegisterEnterRegion( gg_trg_fin_slide, walk_terrain_reg, null )
  11. //random turn on/off
  12.     call TriggerRegisterEnterRegion( gg_trg_random_turn_deb, random_turn_reg, null )
  13.     call TriggerRegisterLeaveRegion( gg_trg_random_turn_fin, random_turn_reg, null )
  14. //death terrain
  15.     call TriggerRegisterEnterRegion( gg_trg_death_terrain, death_reg, null )
  16.    
  17.     call ForGroupBJ( udg_heroes, function unpauseOne )
  18. endfunction
  19. //===========================================================================
  20. function InitTrig_end_initTerr takes nothing returns nothing
  21.     set gg_trg_end_initTerr = CreateTrigger(  )
  22.     call TriggerAddAction( gg_trg_end_initTerr, function end_initTerr_Actions )
  23. endfunction


    Le temps d'exécution de tout ceci est d'exactement 0,6 seconde, ce qui est bien inférieur qu'en utilisant le wait. Par contre le processeur bosse à fond pendant ce temps donc ça lag. Avec une période de 0.1 seconde ça lag un peu mais le temps d'exécution serait alors de 6 secondes. Pour éviter ça, il va faloir faire attendre les joueurs en début de game... avec une vidéo par exemple. Et en mettant une période suffisament grande pour que ça ne lag pas. Autrement ça marche nikel, beaucoup de travail pour l'ordi au début, mais après plus aucun :).
    J'invite tous les créateurs d'escapes à utiliser cette technique, elle rox. Si quelqu'un en connait une meilleure, qu'il me la communique svp. Elle a d'après moi deux défauts seulement : sa durée d'exécution et le fait de ne pouvoir modifier le terrain en cours de partie. Ce dernier peut néammoins s'arranger en ajoutant des régions en cours de jeu.


Message édité par Maximaxou le 24-04-2007 à 02:06:14

---------------
Dota c'est bien, le slide c'est encore mieux !

Aller à :
Ajouter une réponse