Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 05/03/12 16:06 Sujet du message: Projectile automatisé
Plop,
J'essaie de faire une fonction pour qu'en faisant juste un truc du style "call CreateProjectile(unit u, unit c, effect fx...)", l'unité u envoie un projectile sur l'unité c.
J'ai fais un code, il marche, mais j'aimerais que lorsque le projectile atteigne sa cible, la fonction faisant déplacer le projectile appelle une autre fonction, de sorte que l'on puisse choisir les effets qui surviennent à ce moment là.
Voilà comment j'ai procédé :
- Ma fonction "CreateProjectile" a besoin d'un argument de type string, faisant référence à la fonction à appeler (appelé ty).
- Lorsque le projectile meurt, j'utilise "call ExecuteFunc(ty)". Sauf que cette fonction ne permet de passer aucun argument à la fonction à exécuter...
- J'ai donc "déprivatisé" la structure enregistrant toutes les informations sur le projectile, et crée une variable globale de type integer (appelée InstanceId). Lorsque le projectile meurt, la variable InstanceId adopte la valeur de l'instance de structure enregistrant les infos sur le proejctile.
- Ce qui me permet de faire "call ExecuteFunc(ty)", puis de récupérer les infos de cette manière (la struct s'appelle "Projectile" et la globale y faisant référence "Ar") :
Jass:
function Impact takes nothing returns nothing
local Projectile pr = Ar[InstanceId]
local unit u = pr.u
local unit c = pr.c
//Et ensuite les actions habituelles
endfunction
Mon problème c'est que j'aimerais trouver un autre moyen parce que, même si celui-là marche, il y a quelques défauts que j'aimerais corriger :
- La fonction à appeler en fin de vie du projectile ne doit pas être privée
- La structure Projectile ne doit pas être privée
- La globale Ar ne doit pas être privée
- C'est chiant de devoir procéder comme ça
Voilà
Secret:
C'est quand même fou que la fonction "ExecuteFunc" ne permette pas de passer des arguments... Ca aurait été trop beau
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 05/03/12 16:43 Sujet du message:
Huhu.
Tu peux utiliser un mot-clé vJass (function interface) qui permet de passer une fonction en argument pour pouvoir l'exécuter ensuite.
Un exemple :
Secret:
Jass:
library SYSTEM
// "private" ou pas.
private function interface CollisionFunction takes unit caster, unit target returns nothing
function RunFunction takes CollisionFunction func, unit caster, unit target returns nothing
call func.execute(caster, target)
// Tu peux aussi utiliser ".evaluate", c'est plus rapide
// mais ça n'ouvre pas de nouveau thread ;
// on ne peut pas utiliser "TriggerSleepAction" dans la fonction, par exemple.
// call func.evaluate(caster, target)
endfunction
endlibrary
scope TEST
// private ou pas.
// les arguments et le return doivent être les mêmes que
// la fonction interface "CollisionFunction".
private function CollisionFunctionExample takes unit caster,unit target returns nothing
call UnitDamageTarget(caster, target, 100, false, false, null, null, null)
endfunction
function Example takes nothing returns nothing
// Inflige 100 dommages à "GetSpellTargetUnit()"
call RunFunction( CollisionFunctionExample, GetTriggerUnit(), GetSpellTargetUnit() )
endfunction
endscope
Dans ton cas, il te suffit de mettre un champs de type "CollisionFunction" dans ta structure de projectile.
J'espère que c'est clair ^^. _________________
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