online faq recherche accueil
 

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

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

mourir sur un type de terrain précis

 
n°4587039
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-11-2006 à 19:10:41  profilanswer
 

Bonjour. Voila, j'aimerais que lorsqu'une unité arrive sur un type de terrain bien précis, elle meurt.
La seule solution que j'ai trouvée est la suivante :
E : toutes les 0.1 secondes
C : terrain at position of <unité> égal à <type terrain>
A : kill <unité>
Ceci marche parfaitement, mais est beaucoup trop lourd :(
J'aimerais savoir comment alléger ce trigger, si cela est possible.

n°4587042
lunatique
Posté le 22-11-2006 à 19:32:30  profilanswer
 

Je ne vois pas comment tu peux alléger ton déclencheur : Tu as uniquement 1 événement, 1 condition et 1 action. Je crois que c'est le minimum dans un déclencheur.

n°4587043
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-11-2006 à 19:44:11  profilanswer
 

1 : le minimum c'est deux : un évènement et une action
2 : il s'effectue 10 fois par seconde
3 : ce n'est pas que pour un perso que je le fais mais pour onze
 
en clair voici le trigger :
 
http://forum.judgehype.com/mesimages/20024/terrain mort.jpg
 

n°4587044
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-11-2006 à 19:47:31  profilanswer
 

remarque, pour un trigger, ya meme pas besoin d'évènement, une action suffit

n°4587048
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 22-11-2006 à 22:09:20  profilanswer
 

oui mais dans ce cas il faut un autre trigger pour lancer l'action  :D , mais cela peut être utile parfois

n°4587052
Maximaxou
rejoignez les fidèles du JASS
Posté le 22-11-2006 à 22:42:31  profilanswer
 

En fait un évènement du style :
"une unité entre sur un terrain de type <type>"
serait bien pratique ; mais n'existe pas  .

n°4587054
lunatique
Posté le 23-11-2006 à 02:15:05  profilanswer
 

Tu pourrais faire pleins pleins pleins de régions où ton "type de terrain" est présent. Ça peut parraître énorme comme travail mais de cette façon tu aurais un déclencheurs qui n'a pas à se répéter 10 fois par secondes, et tu n'aura qu'a faire cela:
 
Événement: Une unité enter Région 1
                 Une unité enter Région 2
                 ...
                 Une unité enter Région N
 
Conditions: Aucune
 
Actions: Unité - Kill (Entering unit)
 
Mais c'est peut-être long pour toutes les endroits où tu as mis de ton "type de terrain".

n°4587059
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 03:59:55  profilanswer
 

Effectivement j'avais pensé à cette technique, façon LimiteR. Cependant, elle peut entraîner de nombreux bugs (comme on peut le constater dans ses maps : le personnage ne meurt pas à certains endroits) et ça ne doit pas être facile de s'y retrouver dans l'éditeur avec des régions partout :o. Donc je préfèrerais éviter cette solution :p.

n°4587062
BlueBlood
Sang de monstre
Posté le 23-11-2006 à 04:22:59  profilanswer
 

Perso, je le metterais à 0.25 sec :p bcp moins de lag et je ne pense pas qu'avec 0.15 sec de plus, la personne réussisent à entrer et sortir du terrain :ack:


Message édité par BlueBlood le 23-11-2006 à 04:23:26

---------------
Si vous voulez sauver un bambou, mangez un panda ! Si vous voulez sauver un floodeur, mangez un modo !
[Trade List Of BlueBlood / SCL5]    
 
[:blueblood:6][:blueblood:8][:blueblood:7][:blueblood:9] by bonoboo :bisou: (¯`· ._.·» Twilight Princess own «·._. ·´¯) [:blueblood]
n°4587070
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 15:35:40  profilanswer
 

Je ne sais pas si vous connaissez les escapes avec de la glace, mais c'est ce que je suis en train de faire. J'ai essayé en fixant le temps à 0.2 seconde et c'est trop car quand ton perso est en train de glisser, il arrive assez fréquemment que tu puisses mordre le bord sans mourir, ou que tu mettes un certains temps à mourir lorsque tu arrive dans le terrain en question. Par contre avec 0.1 s, ça marche bien.

n°4587124
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 23-11-2006 à 18:58:35  profilanswer
 

Code :
  1. function Trig_test_Actions takes nothing returns nothing
  2. local integer I = 0
  3. local real X =0
  4. local real Y =0
  5. local unit array U
  6. loop
  7. set I = I+1
  8. set U[I]= udg_unite[I]
  9. set X = GetUnitX(U[I])
  10. set Y = GetUnitY(U[I])
  11. if ( GetTerrainType(X,Y) == 'Ldrt' ) then
  12. call KillUnit(U[I])
  13. endif
  14. exitwhen I == 10
  15. endloop
  16. endfunction
  17. function InitTrig_test takes nothing returns nothing
  18.     set gg_trg_test = CreateTrigger(  )
  19.     call TriggerRegisterTimerEventPeriodic( gg_trg_test, 0.1 )
  20.     call TriggerAddAction( gg_trg_test, function Trig_test_Actions )
  21. endfunction


 
Je te laisse comprendre tout seul c'est plus instructif, au besoin pose moi des questions.
Note : les espaces et les sauts de lignes ne sont pas nécessaires c'est juste pour que cela soit plus lisible.
avec cela tu n'as aucune fuite de mémoire tu peux même mettre le temps à 0.05 s si tu as envie, mais 0.1 s est un temps acceptable je trouves

n°4587134
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 21:17:55  profilanswer
 

Une question me vient tout de suite à l'esprit : pourquoi initialiser les variables X et Y à 0 ?
Et aussi pour la déclaration de tableaux : pourquoi tu ne spécifies pas de taille ? Comment ça marche lorsque tu ne lui en donnes pas ? Ca réserve la mémoire dynamiquement suivant les données que tu y mets ou ça donne au tableau une taille prédéfinie très grande ?


Message édité par Maximaxou le 23-11-2006 à 21:21:03
n°4587135
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 21:46:07  profilanswer
 

hé bah. C'est là qu'on voit les limites du gui !
 
Extrêmement joli programme !! J'adore :p
Tu as fais néammoins quelques petites erreurs. Voici le code corrigé :

Code :
  1. function Trig_terrain_en_jass_Actions takes nothing returns nothing
  2.     local integer I = 0
  3.     local real X = 0
  4.     local real Y = 0
  5.     local unit array U
  6.     loop
  7.     set U[I]= udg_ts_persos[I]
  8.     set X = GetUnitX(U[I])
  9.     set Y = GetUnitY(U[I])
  10.     if ( GetTerrainType(X,Y) == 'Idrt' ) then
  11.     call KillUnit(U[I])
  12.     endif
  13.     set I = I+1
  14.     exitwhen I == 11
  15.     endloop
  16. endfunction
  17. //===========================================================================
  18. function InitTrig_terrain_en_jass takes nothing returns nothing
  19.     set gg_trg_terrain_en_jass = CreateTrigger(  )
  20.     call TriggerRegisterTimerEventPeriodic( gg_trg_terrain_en_jass, 0.10 )
  21.     call TriggerAddAction( gg_trg_terrain_en_jass, function Trig_terrain_en_jass_Actions )
  22. endfunction


pour le terrain c'est 'Idrt' et non 'Ldrt' ^^
et concernant I, tu commences par le perso unite[1] (ou ts_persos[1] dans mon cas) au lieu de unite[0]. Par contre tu finnissais bien par le dernier perso : unite[10].
J'ai testé le code ci-dessus, ça marche parfaitement bien, pour tous les persos, merci de ton aide précieuse.

n°4587136
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 23-11-2006 à 22:02:59  profilanswer
 

je n'ai fait aucune erreur je t'ai simplement donné un modèle.  :lol:  
Je te maches bien assez le boulot ^^
Le terrain correspond au permier terrain qui s'affiche lorsque tu fais une nouvelle map sans rien spécifier: terre de été de Loarderon, j'éspérais bien que tu comprendrais.
Il sufisait de mettre -1 pour I et 9 pour l'exitwhen
 
Pour tes questions, a vrai dire je ne sais pas je supposes que cela ne prend pas de place si aucune variable n'est affectée mais que potentiellement tu as 8192 index possibles, comme les variables globales quoi
 
Pour la glisse je te conseille vivement d'utilser les fonctions natives du jass (common.j).
rien de bien sorcier tu changes périodiquement le x et le y de l'unité si elle est sur la glace en fonction de son orientation.
Un peu de math quoi  ;)


Message édité par Troll-Brain le 23-11-2006 à 22:14:57
n°4587137
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 22:24:43  profilanswer
 

S'inspirant grandement de ton très bon code, j'ai créé ce nouveau trigger pour la glisse. Je ne sais pas si tu connais, mais le principe c'est que quand ton personnage est sur la glace il glisse. Pour simuler l'effet de glisse, on déplace le personnage toutes les 0.01 secondes d'une certaine distance (proportionnelle à la vitesse qu'aura le perso), et ce en direction d'où regarde le personnage.

Code :
  1. function Trig_slide_jass_Actions takes nothing returns nothing
  2.     local integer I = 0
  3.     local real X = 0
  4.     local real Y = 0
  5.     local unit array U
  6.     loop
  7.     set U[I] = udg_ts_persos[I]
  8.     set X = GetUnitX(U[I])
  9.     set Y = GetUnitY(U[I])
  10.     if ( GetTerrainType(X,Y) == 'Iice' ) then
  11.     call SetUnitPositionLoc( U[I], PolarProjectionBJ(Location(X,Y), 4.00, GetUnitFacing(U[I])) )
  12.     endif
  13.     set I = I+1
  14.     exitwhen I == 11
  15.     endloop
  16. endfunction
  17. //===========================================================================
  18. function InitTrig_slide_jass takes nothing returns nothing
  19.     set gg_trg_slide_jass = CreateTrigger(  )
  20.     call TriggerRegisterTimerEventPeriodic( gg_trg_slide_jass, 0.01 )
  21.     call TriggerAddAction( gg_trg_slide_jass, function Trig_slide_jass_Actions )
  22. endfunction


 
Pour tourner sur la glace, j'ai fait le trigger ci-dessous en gui, et je ne sais pas s'il est très utile de l'améliorer.

Code :
  1. tourner
  2.     Evénements
  3.         Unité - A unit Reçoit un ordre avec point pour cible
  4.     Conditions
  5.         (Terrain type at (Position of (Triggering unit))) Egal à Glacier d'Icecrown - Glace
  6.         (Owner of (Triggering unit)) Différent de Joueur 12 (Marron)
  7.     Actions
  8.         Unité - Make (Triggering unit) face (Target point of issued order) over 0.00 seconds


n°4587138
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 22:26:52  profilanswer
 

ahhhhh très bonne idée ça fera moins de calcul. Je vais y réfléchir.

n°4587139
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 22:46:53  profilanswer
 

Comme nouveau trigger j'ai donc celui-ci, mais il m'est impossible de l'activer, ça fait planter l'éditeur. (plus maintenant)

Code :
  1. slide jass
  2.     Evénements
  3.         Temps - Every 0.01 seconds of game time
  4.     Conditions
  5.     Actions
  6.         Custom script:   local integer I = 0
  7.         Custom script:   local real X = 0
  8.         Custom script:   local real Y = 0
  9.         Custom script:   local real A = 0
  10.         Custom script:   local unit array U
  11.         Custom script:   loop
  12.         Custom script:   set U[I] = udg_ts_persos[I]
  13.         Custom script:   set X = GetUnitX(U[I])
  14.         Custom script:   set Y = GetUnitY(U[I])
  15.         Custom script:   if ( GetTerrainType(X,Y) == 'Iice' ) then
  16.         Custom script:   set A = GetUnitFacing(U[I])
  17.         Custom script:   call SetUnitPositionLoc( U[I], Location(X+4*CosBJ(A),Y+4*SinBJ(A)))
  18.         Custom script:   endif
  19.         Custom script:   set I = I+1
  20.         Custom script:   exitwhen I == 11
  21.         Custom script:   endloop


Message édité par Maximaxou le 23-11-2006 à 22:51:15
n°4587140
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 22:49:29  profilanswer
 

ah, au temps pour moi, j'ai oublié de faire d'utiliser la fonction Location a la ligne 17
Mais je me demande.. est-ce que ça ne fera pas laguer d'exécuter ce trigger toutes les 0.01 secondes ?


Message édité par Maximaxou le 23-11-2006 à 22:58:44
n°4587141
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 23-11-2006 à 22:53:51  profilanswer
 

par contre tu utilises encore des fonctions de blizzou les ...BJ utilises plutôt directement les fonctions natives

n°4587142
Maximaxou
rejoignez les fidèles du JASS
Posté le 23-11-2006 à 22:59:21  profilanswer
 

hm tu pourrais m'expliquer ce que sont les fonctions natives exactement et à quoi elles servent ?
Sinon j'aurais une question qui a rien à voir mais, est-ce qu'il est possible de spécifier la ou les unité(s) sélectionnées par un joueur ?


Message édité par Maximaxou le 23-11-2006 à 23:10:17
n°4587143
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 24-11-2006 à 09:27:56  profilanswer
 

la plupart des fonctions générés par le gui (blizzard.) sont en fait des sous fonctions utilisant les fonctions natives (common.j). Donc le temps d'éxécution est plus rapide en utilisant directement les fonctions natives
 
Oui bien sûr c'est dans événement unité spécific

n°4587147
Maximaxou
rejoignez les fidèles du JASS
Posté le 24-11-2006 à 20:24:23  profilanswer
 

OK. Et sinon est-ce qu'il est possible de spécifier un évènement à partir d'une chaîne de caractères ?

n°4587148
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 24-11-2006 à 21:00:12  profilanswer
 

non mais tu peux utiliser les ConvertXXXXXEvent(Entier), bien que je n'en vois pas l'intérêt

n°4587151
Maximaxou
rejoignez les fidèles du JASS
Posté le 25-11-2006 à 05:01:10  profilanswer
 

Les ConvertXXXXXEvent(Entier), c'est-à-dire ?


Message édité par Maximaxou le 25-11-2006 à 05:01:25
n°4587152
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 25-11-2006 à 11:17:10  profilanswer
 

ouvre le fichier common.j tu comprendras

n°4587176
Maximaxou
rejoignez les fidèles du JASS
Posté le 26-11-2006 à 14:31:42  profilanswer
 

Quelles fonctions que j'utilise ne sont pas natives ?

n°4587177
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 26-11-2006 à 14:52:22  profilanswer
 

le plus simple est de vérifier si elle sont ou non dans le fichier common.j

n°4587184
Maximaxou
rejoignez les fidèles du JASS
Posté le 27-11-2006 à 01:33:54  profilanswer
 

En fait il y a bien les CosBJ et SinBJ, mais si j'utilise les natives Cos et Sin, il faut que je convertisse mes angles en radians (via Deg2Rad). Et là, est-ce que ça ne prendra pas plus de temps que d'utiliser CosBJ et SinBJ ?

n°4587188
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 27-11-2006 à 17:21:16  profilanswer
 

non puisque cosbj fait la conversion justement

n°4587192
Maximaxou
rejoignez les fidèles du JASS
Posté le 27-11-2006 à 20:54:28  profilanswer
 

Voila :

Code :
  1. slide jass
  2.     Evénements
  3.         Temps - Every 0.01 seconds of game time
  4.     Conditions
  5.     Actions
  6.         Custom script:   local integer I = 0
  7.         Custom script:   local real X = 0
  8.         Custom script:   local real Y = 0
  9.         Custom script:   local real A = 0
  10.         Custom script:   local unit array U
  11.         Custom script:   loop
  12.         Custom script:   set U[I] = udg_ts_persos[I]
  13.         Custom script:   set X = GetUnitX(U[I])
  14.         Custom script:   set Y = GetUnitY(U[I])
  15.         Custom script:   if ( GetTerrainType(X,Y) == 'Iice' ) then
  16.         Custom script:   set A = Deg2Rad(GetUnitFacing(U[I]))
  17.         Custom script:   call SetUnitPosition( U[I], X+4*Cos(A),Y+4*Sin(A) )
  18.         Custom script:   endif
  19.         Custom script:   set I = I+1
  20.         Custom script:   exitwhen I == 11
  21.         Custom script:   endloop


Aller à :
Ajouter une réponse