Posté le: 17/12/08 12:03 Sujet du message: Problème du mur de ronces
Je sais, j'ai du mal
Suite à une excellente idée de Caske Lebohaume, pour mon druide, j'ai fait un sort qui créé un mur de ronces.
Le petit souci, c'est que ça marche, à part un petit détail; les ronces se créent n'importe comment.
J'ai un problème soit de concept soit parce que je suis nul, au choix
Exemple ici: les ronces (entourées par les ellipses rouges) sont crées en 2 rangées parallèles. Alors qu'elles devraient former un genre de ">" autour du héros, la pointe du ">" étant située à l'endroit du point ciblé par la capacité.
Secret:
Les deux déclencheurs sont:
Initialisation
Secret:
Gui:
Trigger:
S D0 Mur de Ronces start Events Unit - A unit Begins casting an ability
Conditions
(Ability being cast) Equal to D0 Mur de Ronces
Actions
Set Sort_D0_Caster = (Casting unit) Set Sort_D0_Point_Caster = (Position of Sort_D0_Caster) Set Sort_D0_Point_Target = (Target point of ability being cast) Set Sort_D0_Point_1_A = (Sort_D0_Point_Target offset by 100.00 towards ((Angle from Sort_D0_Point_Caster to Sort_D0_Point_Target) + 45.00) degrees) Set Sort_D0_Point_1_B = Sort_D0_Point_1_A Set Sort_D0_Point_2_A = (Sort_D0_Point_Target offset by 100.00 towards ((Angle from Sort_D0_Point_Caster to Sort_D0_Point_Target) - 45.00) degrees) Set Sort_D0_Point_2_B = Sort_D0_Point_2_A Trigger - Turn on S D0 Sort <gen> Wait 0.50 seconds Trigger - Turn off S D0 Sort <gen> Custom script: call RemoveLocation( udg_Sort_D0_Point_Caster ) Custom script: call RemoveLocation( udg_Sort_D0_Point_Target ) Custom script: call RemoveLocation( udg_Sort_D0_Point_1_A ) Custom script: call RemoveLocation( udg_Sort_D0_Point_1_B ) Custom script: call RemoveLocation( udg_Sort_D0_Point_2_A ) Custom script: call RemoveLocation( udg_Sort_D0_Point_2_B )
Action
Secret:
Gui:
Trigger:
Events Time - Every 0.03 seconds of game time Conditions
Actions
Unit - Create Un Dummy_type[7] for (Owner of Sort_D0_Caster) at Sort_D0_Point_1_B facing Default building facing (270.0) degrees Unit - Add a 30.00 second Force Of Nature expiration timer to (Last created unit) Unit - Create Un Dummy_type[7] for (Owner of Sort_D0_Caster) at Sort_D0_Point_2_B facing Default building facing (270.0) degrees Unit - Add a 30.00 second Force Of Nature expiration timer to (Last created unit) Set Sort_D0_Point_1_B = (Sort_D0_Point_1_B offset by 100.00 towards (Angle from Sort_D0_Point_1_A to Sort_D0_Point_1_B) degrees) Set Sort_D0_Point_2_B = (Sort_D0_Point_2_B offset by 100.00 towards (Angle from Sort_D0_Point_2_A to Sort_D0_Point_2_B) degrees)
Je pense que c'est la défénition de tes angles qui n'est pas bonne. (sans rire -->[ ] ) Et est-ce que tu pourrais mettre le point ciblé sur l'image stp? _________________
Les variables: il parait que ça évite le leak, alors j'ai pris l'habitude
En fait ca suit une logique de suffixe.
La Variable Concerne_Le type concerné_La variable_si plusieurs un numéro/une identité
Exemple
Sort_D1_Point_Caster
Sort=>il s'agit d'un sort
D=>druide
1=>le sort numéro 1 de l'unité
Point=>bon bah c'est un point
Caster=>Le point correspondant au lanceur de sort.
Dans le gestionnaire d'objet, je n'ai que 224 variables (sans compter les déploiements donc=]
Revenons à nos moutons. Même déclencheurs que dans mon message précédent, j'ai juste mis le héros ailleurs pour que l'on voit mieux.
Ellipse rouges: le résultat obtenu.
Traits verts: le résultat escompté.
Cercle avec croix bleue: la cible du sort. (Correspond au Sort_D0_Point_Target)
Secret:
Ici tu remarque que j'ai 2 points de déplacement (Identifiés Sort D0_Point_1 et D0_Point_2) pour la création des ronces parce esthétiquement je trouve mieux que les ronces partent ensemble du point ciblé, chaque banche dans sa direction propre. _________________
Inscrit le: 22 Nov 2007 Messages: 677 Sujets: 27 Spécialité en worldedit: Jamais sortir ses projets ?
Posté le: 17/12/08 15:49 Sujet du message:
J'ai fait un équivalent de se que tu voulait en jass , a la base c'était au cas où tu voulait , en t'expliquant à coté comment faire en gui , mais quand j'ai vu les leaks de ton script.
Jass:
function Periodic takes nothing returns nothing
call UnitApplyTimedLife(CreateUnit(Player(0),'type',( ( udg_AngleX1Spell * udg_DistSpell) + udg_OffSetSpellX ), ( ( udg_AngleY1Spell * udg_DistSpell) + udg_OffSetSpellY ),0),'BEfn',30) //Création de l'unité de la premiere droite
call UnitApplyTimedLife(CreateUnit(Player(0),'type',( ( udg_AngleX2Spell * udg_DistSpell) + udg_OffSetSpellX ), ( ( udg_AngleY2Spell * udg_DistSpell) + udg_OffSetSpellY ),0),'BEfn',30) //Création de l'unité de la seconde droite
set udg_DistSpell = udg_DistSpell + 100 // Deplacement sur les droite des création
if(udg_DistSpell == 1600)then // + précis qu'un wait
call PauseTimer(udg_TimeSpell) // arret de la création
endif
endfunction
function TriggSpell takes nothing returns nothing
local real r = (bj_RADTODEG * Atan2(GetOrderPointY() - GetUnitY(GetTriggerUnit()), GetOrderPointX() - GetUnitX(GetTriggerUnit()))) + 180 //Calcul de l'angle entre l'unité et le point cible + 180°
set udg_OffSetSpellX = GetOrderPointX()
set udg_OffSetSpellY = GetOrderPointY()
set udg_AngleX1Spell = CosBJ(r + 30) //Calcul de la premiere droite
set udg_AngleY1Spell = SinBJ(r + 30) //Idem
set udg_AngleX2Spell = CosBJ(r - 30) //Calcul de la seconde droite
set udg_AngleY2Spell = SinBJ(r - 30) //Idem
set udg_DistSpell = 0 //Remise a zero de la distance
call TimerStart(udg_TimeSpell,0.03,true,function Periodic) //Lamcement du timer
endfunction
J'ai testé le résultat est similaire a celui que tu voulait , et n'a pas l'air d'être lourd du tout.
Pour précisé le type d'unité (sinon sa ne marchera pas) il faut que tu change les deux 'type' par le type id de l'unité (ctrl + d dans l'editeur d'objet) , par exemple 'hpea' pour le paysan.
Les variables utilisé sont:
Un timer :TimeSpell
Des réel:
- AngleX1Spell
- AngleY1Spell
- AngleX2Spell
- AngleY2Spell
- OffSetSpellX
- OffSetSpellY
- DistSpell
Pour s'en servir il suffit d'appelé la fonction. (call TriggSpell() en custom script)
J'ai laissé pas mal de commentaire sur mon script si tu veut comprendre comment il fonctionne. _________________
Edit: sur le miens, leak à part, tu aurais fait comment en GUI pour les angles?
Edit2: Merci, beaucoup
Edit3: je sais je suis incompétent en jass
Donc tes variables sont de type?
set udg_OffSetSpellX Réel
set udg_OffSetSpellY Réel
set udg_AngleX1Spell Réel
set udg_AngleY1Spell Réel
set udg_AngleX2Spell Réel
set udg_AngleY2Spell Réel
set udg_DistSpell = 0 Réel
C'est ça?
Edit 5: encore merci, ça fonctionne. Et en plus je commence à comprendre le jass. Mais comment trouve-t-on la bonne fonction -_- _________________
Y'a un bug: le sort ne se lance que dans ma ville d'origine. Pas ailleurs. En plus il a tendance à leaker passé le lancement, de plus en plus, jusqu'à planter W3.
-_-
PS: l'id unité, ca ne sert à rien de la remplacer par sa variable? (ici dummy_type|quelquechose] ) _________________
Après plusieurs test: ton script ne fonctionne pas non plus. L'intersection des deux droites n'apparait pas forcément à l'endroit ciblé, et les deux droites n'apparaissent pas toujours -_-. _________________
Inscrit le: 22 Nov 2007 Messages: 677 Sujets: 27 Spécialité en worldedit: Jamais sortir ses projets ?
Posté le: 17/12/08 19:54 Sujet du message:
Edit(Reponse a ton post au dessus): Quand j'avais testé sa fonctionné , sa prenait en compte l'orientation entre l'unité et le point ciblé ainsi que comme centre le point ciblé.
" Mais comment trouve-t-on la bonne fonction -_- " = ?
Citation:
PS: l'id unité, ca ne sert à rien de la remplacer par sa variable? (ici dummy_type|quelquechose] )
Ben il vaut mieux une valeur direct , mais si sa a son utililité.
Si tu cherche a appliqué mon script Jass , tu as l'air de l'avoir correctement implanté , et si je me suis pas planté (ni toi) , il suffit de faire " call TriggSpell() " en custom script pour faire l'effet.
Veut tu que je t'explique comment se servir de mon script ou comment réalisé "l'équivalent" GUI ?
Ben pour comment s'en servir j'ai déjà expliqué plus haut , pour l'équivalent je vais tenté de t'expliqué.
(Concentre toi j'ai l'impression d'avoir vraiment mal expliqué )
Si tu n'en est pas conscient , je t'invite à lire ce post.
Expliquant les projections polaires.
A priori en voyant ton trigger tu en a l'air assez conscient.
Ce que tu a l'air de faire (en regardant rapidement) est de deplacé le point par rapport a lui même , se qui n'est pas très optimisé.
Le plus optimisé est de gardé les résultats en mémoire de façon à évité les calcul inutile.
Premièrement ont a deux point , celui de l'ordre et celui de l'unité , ont fait donc l'angle entre les deux pour définir "l'orientation" de l'effet.
Une fois qu'ont a l'orientation , ont calcul les angle des deux droite , soit 210° et 150° si ont prend 30°. (180° +- 30°) (sa s'approche plus de ton dessin).
Après qu'ont a ses deux angle ont calcul les Cosinus et Sinus de ses angles qu'ont met dans des variable.
Ont lance le timer periodic.
Ont commence a la distance 0 (donc ont remet la distance a 0 avant) puis augmente la distance a chaque fois , calculant le nouveau point avec se qu'ont a enregistré dans les variable.
" ( ( udg_AngleX1Spell * udg_DistSpell) + udg_OffSetSpellX ) "
Ensuite je préfère personnellement la condition sur la distance qu'un wait , le wait donnera par moment des résultat différent que d'habitude.
Donc pour la distance il te suffit de mettre en pause (ou turn off trigger) si la distance est égal à 'x'.
Je te conseil le pause timer (puis relancé le timer) au turn off trigger , à mon avis c'est moins lourd mais j'en ai pas la preuve.
Puis théoriquement si ta compris sa devrait fonctionné.
Regarde la map que je t'ai mis en téléchargement, joue là, le pouvoir est dans les capacités de base du héros.
Tu verras que selon l'endroit où tu fais le sort, ça ne marche pas :s
Si tu veux vérifier le trigger (je n'ai fait que modifier les noms des variables )...
Dans le déclencheur d'évènements, rubrique sort, paragraphe druide pour le call...
Jass: code de la carte, sous le paragraphe "affichage des dégâts" (ou en partant du bas, les deux premières fonctions).
Unité: unité classée en Personnalisé/Orc/Unités/Dummy Mur de Ronces o006:oeye _________________
Inscrit le: 22 Nov 2007 Messages: 677 Sujets: 27 Spécialité en worldedit: Jamais sortir ses projets ?
Posté le: 17/12/08 20:11 Sujet du message:
Effectivement les angle donné sont mauvais dans ta map , je vais chercher a quoi c'est du.
Edit: Le problème vient que j'utilise GetOrderPointX / Y , Utilisable pour les ordre mais pas pour ton événement.
Edit(2):
Jass:
function Periodic takes nothing returns nothing
call UnitApplyTimedLife(CreateUnit(Player(0),'o006',( ( udg_Sort_D0_AngleX1Spell * udg_Sort_D0_DistSpell) + udg_Sort_D0_OffSetSpellX ), ( ( udg_Sort_D0_AngleY1Spell * udg_Sort_D0_DistSpell) + udg_Sort_D0_OffSetSpellY ),0),'BEfn',30) //Création de l'unité de la premiere droite
call UnitApplyTimedLife(CreateUnit(Player(0),'o006',( ( udg_Sort_D0_AngleX2Spell * udg_Sort_D0_DistSpell) + udg_Sort_D0_OffSetSpellX ), ( ( udg_Sort_D0_AngleY2Spell * udg_Sort_D0_DistSpell) + udg_Sort_D0_OffSetSpellY ),0),'BEfn',30) //Création de l'unité de la seconde droite
set udg_Sort_D0_DistSpell = udg_Sort_D0_DistSpell + 100 // Deplacement sur les droite des création
if(udg_Sort_D0_DistSpell == 1600)then // + précis qu'un wait
call PauseTimer(udg_Sort_D0_TimeSpell) // arret de la création
endif
endfunction
function TriggSpell takes nothing returns nothing
local location l = GetSpellTargetLoc()
local real r = (bj_RADTODEG * Atan2(GetLocationY(l) - GetUnitY(GetTriggerUnit()), GetLocationX(l) - GetUnitX(GetTriggerUnit()))) + 180 //Calcul de l'angle entre l'unité et le point cible + 180°
set udg_Sort_D0_OffSetSpellX = GetLocationX(l)
set udg_Sort_D0_OffSetSpellY = GetLocationY(l)
call RemoveLocation(l)
set l = null
set udg_Sort_D0_AngleX1Spell = CosBJ(r + 30) //Calcul de la premiere droite
set udg_Sort_D0_AngleY1Spell = SinBJ(r + 30) //Idem
set udg_Sort_D0_AngleX2Spell = CosBJ(r - 30) //Calcul de la seconde droite
set udg_Sort_D0_AngleY2Spell = SinBJ(r - 30) //Idem
set udg_Sort_D0_DistSpell = 0 //Remise a zero de la distance
call TimerStart(udg_Sort_D0_TimeSpell,0.03,true,function Periodic) //Lamcement du timer
endfunction
Sa fonctionne avec ce nouveau script.
Réponds pour que je sache si je doit up ou non. _________________
L'inconvénient des Edit...Je n'avais pas vu ta modification.
Alors j'ai copié le code et j'ai ça à l'enregistrement
Syntax Error
function Trig_I_Start_Actions takes nothing returns nothing
Ca c'est mon premier déclencheur tout mignon.
Ca ne plante que quand j'ai mis ton script
Secret:
Gui:
Trigger:
Events Time - Elapsed game time is 0.01 seconds Conditions
Actions
Player - Turn Gives bounty On for Neutral Hostile
For each (Integer A) from 1 to 12, do (Actions)
Loop - Actions Set Joueur_perso[(Integer A)] = (Player((Integer A)))
For each (Integer A) from 1 to 12, do (Actions)
Loop - Actions Player - Make Joueur_perso[(Integer A)] treat Player 1 (Red) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 2 (Blue) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 3 (Teal) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 4 (Purple) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 5 (Yellow) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 6 (Orange) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 7 (Green) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 8 (Pink) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 9 (Gray) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 10 (Light Blue) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 11 (Dark Green) as an Ally with shared vision Player - Make Joueur_perso[(Integer A)] treat Player 12 (Brown) as an Ally with shared vision Hero - Make Joueur_perso[(Integer A)] Heroes gain 100.00% experience from future kills Player - Set the current research level of Niveau du Héros to 1 for Joueur_perso[(Integer A)] Visibility - Create an initially Enabled visibility modifier for Joueur_perso[(Integer A)] emitting Visibility across NG1 <gen> Visibility - Create an initially Enabled visibility modifier for Joueur_perso[(Integer A)] emitting Visibility across NG2 <gen> Visibility - Create an initially Enabled visibility modifier for Joueur_perso[(Integer A)] emitting Visibility across NG3 <gen>
Animation - Play Forge 0051 <gen>'s stand work animation Animation - Play Atelier 0034 <gen>'s stand work animation Animation - Play Scierie 0052 <gen>'s stand work animation Unit - Order Paysan 0114 <gen> to Harvest Ravitaillement 0113 <gen> Unit - Order Paysan 0116 <gen> to Harvest Ravitaillement 0113 <gen> Unit - Order Paysan 0115 <gen> to Harvest Ravitaillement 0113 <gen> Unit - Order Paysan 0117 <gen> to Harvest Ravitaillement 0113 <gen> Unit - Order Paysan 0127 <gen> to Harvest Ravitaillement 0113 <gen> Unit - Order Paysan 0128 <gen> to Harvest Ravitaillement 0113 <gen> Unit - Order Paysan 0129 <gen> to Harvest Ravitaillement 0113 <gen> Unit - Order Paysan 0130 <gen> to Harvest Ravitaillement 0113 <gen> Game - Set the time of day to 8.00 Environment - Set sky to Lordaeron Winter Sky (Pink)
Merci, tout fonctionne (en copiant collant le texte de la map, parce que en copiant celui d'ici j'ai du faire une erreur). Vraiment sympa de ta part _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page 1, 2Suivante
Page 1 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