Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
Sapeur-Goblin Floodeur prématuré
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
|
Posté le: 24/01/13 18:41 Sujet du message: Problème de conception |
|
|
Plop,
Je suis en train de faire un système de "ComplexEvent", c'est à dire d'événements composés de sous-événements, se déclenchant quand chacun d'entre eux l'a été.
Dans ma structure j'ai un déclencheur t auquel j'attache tout les sous-événements, ce qui me permet de savoir combien doivent encore être déclenchés avant que le "ComplexEvent" soit exécuté.
Et j'ai un problème pour l'ajout de ces événements :
Soit je mets t en private, ce qui est plus sûr, mais l'utilisateur ne peut pas jouter n'importe quel event : il doit passer par une méthode de la struct. Et comme j'ai pas envie d'en faire une pour chaque type d'event, c'est limité.
Soit je met t en readonly. C'est moins sûr, mais au moins on peut ajouter n'importe quel type d'event. A la limite, ça m'aurais pas dérangé : il suffit de préciser de ne pas détruire t. Mais à chaque event ajouté, il faut que j'incrémente un entier dans ma struct. Ça devient donc vite embêtant pour l'utilisateur, et d'autant moins sûr pour le fonctionnement du système.
Quelqu'un a une solution pour avoir les avantages des deux systèmes ?
Ah et tiens, pendant que j'y pense : que pensez-vous de la bibliothèque Event? Je m'en sers pour cette struct, mais je la trouve pas génial parce qu'on peut pas détruire les Events. En fait j'ai pensé à l'arranger à ma manière, mais Nes n'est pas idiot (enfin, il me semble ), s'il n'a pas permis ça, c'est qu'il y a une raison non? _________________
|
|
Revenir en haut |
|
|
Ectelion Membre reconnu
Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
|
Posté le: 24/01/13 19:42 Sujet du message: |
|
|
Il faut... Non en fait j'ai pas d'idées. Quoique, peut-être que tu n'a qu'à mettre que l'on ajoute les events par des appels de functions à l'instance de ta struct
mais je doute que ce soit réellement une réponse à ton problème et que ça change réellement quelque chose. _________________
Inactif(Enfn presque) |
|
Revenir en haut |
|
|
Tirlititi
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
|
Posté le: 24/01/13 20:08 Sujet du message: |
|
|
Est-ce que tu as pensé aux methods operator? _________________
|
|
Revenir en haut |
|
|
Sapeur-Goblin Floodeur prématuré
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
|
Posté le: 24/01/13 20:21 Sujet du message: |
|
|
Bah, étant donné qu'une méthode opérator ne peut qu'assigner une valeur à une variable, je ne vois pas comment m'en servir pour ajouter un event à un déclencheur .
@Lord : C'est ce que j'essaie d'éviter de faire . _________________
|
|
Revenir en haut |
|
|
Ayane Bot administrateur
Inscrit le: 17 Sep 2007 Messages: 2009 Sujets: 49
Médailles: 2 (En savoir plus...)
|
Posté le: 24/01/13 20:46 Sujet du message: |
|
|
Jass: | constant native GetTriggerEventId () returns eventid |
Ou plus simplement créé un déclencheur par évènement et met en action une vérification que tous les évènements ont été déclenchés, si c'est le cas tu exécute la ComplexAction. _________________
|
|
Revenir en haut |
|
|
Tirlititi
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
|
Posté le: 24/01/13 21:09 Sujet du message: |
|
|
Ben je sais pas comment tu t'es débrouillé jusque là, mais tu peux utiliser l'opérateur "t" pour renvoyer le trigger auquel l'utilisateur rajoute l'event tout en incrémentant ton truc :
Jass: | struct ComplexEvent
private trigger t=CreateTrigger()
private integer i=0
....
method operator t takes nothing returns trigger
set this.i = this.i+1
return this.t
endmethod
....
endstruct |
Ensuite, l'utilisateur fait un "TriggerRegister(complexEventVariable.t, ....)" et pis voilà.
EDIT : Grillé par Ayane ^^. Je met trop de temps à répondre :O _________________
|
|
Revenir en haut |
|
|
Ayane Bot administrateur
Inscrit le: 17 Sep 2007 Messages: 2009 Sujets: 49
Médailles: 2 (En savoir plus...)
|
Posté le: 24/01/13 23:42 Sujet du message: |
|
|
S'il s'agit juste de savoir le nombre de fois qu'a été exécuté un déclencheur il y a:
Jass: | constant native GetTriggerEvalCount takes trigger whichTrigger returns integer
constant native GetTriggerExecCount takes trigger whichTrigger returns integer |
_________________
|
|
Revenir en haut |
|
|
Sapeur-Goblin Floodeur prématuré
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
|
Posté le: 25/01/13 12:58 Sujet du message: |
|
|
Pour l'instant j'utilise GetTriggerEventId qui me permet de savoir, à l'aide d'une hashtable, si l'événement déclenché ne l'a pas déjà été. Si c'est la première fois qu'il l'est, je décrémente une variable. Lorsque cette variable arrive à 0, je déclenche le ComplexEvent. Donc il vaut mieux utiliser une variable propre à la struct plutôt que GetTriggerEvalCount pour éviter les événements déclenchés deux fois, et qui ne doivent être comptabilisés qu'une seule fois.
Tirlititi, j'avoue que j'avais pas du tout pensé à ça . Je vais utiliser cette solution pour le moment, sauf si je trouve mieux. Parce qu'il faut quand même que l'utilisateur fasse attention : il ne doit utiliser cet opérateur que lorsqu'il ajoute un event. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 25/01/13 15:51 Sujet du message: |
|
|
Comme tu le sais il n'est pas possible de supprimer un event, seulement un trigger.
En fait en cas de nécessité d'avoir un event dynamique (qui est créé/détruit) il vaut mieux coder soit même la chose.
Le plus simple, et probablement la meilleure solution, est en effet de créer/détruire un trigger. C'est pour cela qu'Event ne propose pas la gestion de tels events.
Je l'ai fait pour UnitLL par exemple.
Par contre je ne suis pas spécialement convaincu de la nécessité d'une telle library, comparé à écrire directement le code nécessaire quand c'est besoin, à voir. _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
Sapeur-Goblin Floodeur prématuré
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
|
Posté le: 25/01/13 20:48 Sujet du message: |
|
|
Hum ça me paraît difficile de gérer ça sans Event : il peut y avoir plusieurs déclencheurs par instance : /.
A la base je comptais utiliser cette lib' pour une sorte de système de quête. Et devoir tout faire directement à chaque fois est assez embêtant, c'est pour ça que je l'ai faite. _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 25/01/13 21:27 Sujet du message: |
|
|
J'ai du mal à bien visualiser le truc, mais à priori oui une library Event "dynamique" serait intéressante dans ce cas ci.
Si tu veux je peux t'en faire une. (et si tu préfères le faire toi même, ca me va aussi) _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
Sapeur-Goblin Floodeur prématuré
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
|
Posté le: 25/01/13 21:39 Sujet du message: |
|
|
Citation: | J'ai du mal à bien visualiser le truc |
A quoi ça sert ou comment ça fonctionne ?
Citation: | Si tu veux je peux t'en faire une. (et si tu préfères le faire toi même, ca me va aussi) |
Je ne suis pas contre un peu d'aide. Pas forcément que tu fasses tout (sauf si t'en as l'envie et le temps ^^), mais que tu me donnes quelques pistes. Parce que je ne vois pas comment faire pour qu'une fois un event détruit, les triggers auxquels il est attaché ne se déclenche plus. Il faudrait utiliser un type d'event propre à chaque instance, pour qu'il ne soit plus déclenché une fois l'instance détruite (genre UnitDie, avec une unité différente pour chaque instance, mais ça serait pire que crade). _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 25/01/13 21:55 Sujet du message: |
|
|
Si on peut détruire l'event, le code associé ne sera plus déclenché.
Je ne te proposais pas de toute faire mais juste un Event like, sauf que l'on pourrait détruire les Event. _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
Sapeur-Goblin Floodeur prématuré
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
|
Posté le: 03/02/13 12:30 Sujet du message: |
|
|
Bon, je remonte le sujet .
Finalement cette lib' Event où les events seraient destructibles est indispensable pour finir mes systèmes.
Donc comment faire? Parce qu'il est de toute façon impossible d'enlever un Event d'un trigger.
Je me suis dit qu'au lieu de faire q = this (comme dans la lib' de Nes), on ferait q = this.r avec r un réel propre à chaque instance (une instance détruite puis recréée n'aura pas la même valeur). _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 03/02/13 20:11 Sujet du message: |
|
|
Ce n'est pas possible de faire ainsi, cet event ne fonctionne qu'avec les variables global non array.
Je n'y ai pas encore réfléchi, j'essaierais de me pencher là dessus demain. _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
|