Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 30/04/13 10:17 Sujet du message: Reçyclage d'index particulier
Je voudrais recycler un index, sachant que j'ai des suites de valeurs dans mon tableau, suites qui doivent rester dans un ordre précis, et que le nombre de valeurs dans les suites est variable (peut y avoir des suites de 3 valeurs qui vont ensemble comme des suites de 10 valeurs). Les suites se placent automatiquement après les suites déjà existantes dans le tableau lors de la création, et les suites sont enlevées du tableau dans un ordre variable (une suite étant plus récente qu'une autre peut être enlevée avant par exemple).
Schématisation :
0-1-2--3-4-5-6-7--8-9-10-11--12-13
Une couleur = une suite distincte.
Le nombre = l'index auquel se trouve la valeur
Est-ce qu'il y aurait pas un truc plus pratique que quand une suite de X valeurs est enlevée, et de baisser l'index de toutes les valeurs qui sont après cette suite de X ? _________________
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 30/04/13 10:28 Sujet du message:
des listes chainées. on en avait djéà parlé dans un tuto (celui que j'ai fait sur la gestion d'instance, tb et tir avaient fait un speach dessus) _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 30/04/13 11:26 Sujet du message:
Oui, listes chaînées.
Bon, j'avais commencé à apporter une explication, mais c'est assez complexe à faire en gui, parce que tu n'a pas les fonctions, ni l'abstraction apportée par le vJass (les structs, qui permettent de faire des listes chaînées très simplement, sans comprendre le mécanisme interne).
Si tu veux tout de même te lancer dedans :
Secret:
Il y a plusieurs choses à expliquer, je commence par les listes chaînées avec des variables à déploiement.
Une liste peut être vue comme une suite de nombre, chacun de ces nombres étant des indexs, qui vont servir à retrouver une valeur dans une variable à déploiement. Pour créer des listes d'indexs le truc c'est d'avoir une variable à déploiement (8191) qu'on va appeler next. A partir du premier index de la suite (n), tu peux retrouver tous les autres. Avec next[n], tu obtiens le suivant. A partir de ce dernier, tu peux retrouver le troisième, en ce servant de ce premier terme comme index du deuxième : next[next[n]] sera donc le troisisème terme de la suite. next[next[next[n]]] le quatrième, et ainsi de suite.
Tu remarqueras que les nombres stockés sont des indexs, et ne doivent pas dépasser 8191. Ils ne sont là que pour créer la liste en elle même. Ensuite, on peut s'en servir pour retrouver d'autres valeurs. De plus, ils doivent être uniques pour éviter les conflits. L'index 0 ne doit pas exister, la valeur 0 annonçant la fin de la liste.
Donc, lorsque tu veux créer une nouvelle liste, il suffit de cherche un nouvelle index x. Ce nouvelle index est le premier terme de la suite. Si tu veux rajouter un autre membre à la suite, il suffira de chercher un autre nouvel index y, et de faire
set next[x] = y
Le problème que tu vas rencontrer, c'est lorsque tu veux un nouvel index. Tu ne peux pas le choisir au hasard, il faut en prendre un qui n'est pas encore utilisé. Pour obtenir à chaque fois un index unique, on peut se servir d'une variable entière (count initialisée à 0) et d'une autre variable à déploiement recycle. Cette dernière variable permet de recycler les indexs (puisqu'on qu'ils ne doivent pas dépasser 8191, il est nécessaire de les détruire lorsqu'on en a plus besoin. C'est une liste, d'ailleurs. Elle fonctionne selon le même principe que celui expliqué plus haut).
Lorsque tu veux obtenir un index, il y a deux possibilités : soit il y en a un dans la liste d'attente des recyclés, soit il faut en créer un tout nouveau. La première chose à faire est donc de vérifier si recycle[0] est différent de 0. S'il l'est, l'index correspond à recycle[0]. Dans ce cas, il faut retirer recycle[0] de la liste de recyclage, en faisant recycle[0] = recycle[recycle[0]]. Dans le cas où recycle[0] = 0, il faut créer un tout nouvel index. Dans ce cas, il suffit d'incrémenter count, et ton index correspond à la valeur de count.
Regardons maintenant comment recycler les indexs quand t'en as plus besoin. Tu as un index x, et il faut le rajouter dans la liste de recyclage. Pour cela, il suffit de faire :
set reycle[x] = recycle[0]
puis
set recycle[0] = x
Voilà comment faire des suite d'indexs compris entre 1 et 8191.
Ces indexs peuvent servir à retrouver d'autres valeurs (des entiers dans ton cas) stockés dans une autre variable à déploiement.
Là j'ai seulement expliqué les listes simplement chaînées, mais tu peux, en plus de la variable next, rajouter une variable prev permettant de retrouver la valeur précédente.
Dans ton cas, le plus approprié serait de faire une liste de liste de nombre. Je pense que si tu as compris le principe des listes, tu comprendra aussi celui des listes de listes. Il suffit de stocker le premier index de chaque liste dans une autre variable à déploiement.
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 30/04/13 12:46 Sujet du message:
Sapeur-Goblin a écrit:
Oui, listes chaînées.
Bon, j'avais commencé à apporter une explication, mais c'est assez complexe à faire en gui, parce que tu n'a pas les fonctions, ni l'abstraction apportée par le vJass (les structs, qui permettent de faire des listes chaînées très simplement, sans comprendre le mécanisme interne).
Si tu veux tout de même te lancer dedans :
Secret:
Il y a plusieurs choses à expliquer, je commence par les listes chaînées avec des variables à déploiement.
Une liste peut être vue comme une suite de nombre, chacun de ces nombres étant des indexs, qui vont servir à retrouver une valeur dans une variable à déploiement. Pour créer des listes d'indexs le truc c'est d'avoir une variable à déploiement (8191) qu'on va appeler next. A partir du premier index de la suite (n), tu peux retrouver tous les autres. Avec next[n], tu obtiens le suivant. A partir de ce dernier, tu peux retrouver le troisième, en ce servant de ce premier terme comme index du deuxième : next[next[n]] sera donc le troisisème terme de la suite. next[next[next[n]]] le quatrième, et ainsi de suite.
Tu remarqueras que les nombres stockés sont des indexs, et ne doivent pas dépasser 8191. Ils ne sont là que pour créer la liste en elle même. Ensuite, on peut s'en servir pour retrouver d'autres valeurs. De plus, ils doivent être uniques pour éviter les conflits. L'index 0 ne doit pas exister, la valeur 0 annonçant la fin de la liste.
Donc, lorsque tu veux créer une nouvelle liste, il suffit de cherche un nouvelle index x. Ce nouvelle index est le premier terme de la suite. Si tu veux rajouter un autre membre à la suite, il suffira de chercher un autre nouvel index y, et de faire
set next[x] = y
Le problème que tu vas rencontrer, c'est lorsque tu veux un nouvel index. Tu ne peux pas le choisir au hasard, il faut en prendre un qui n'est pas encore utilisé. Pour obtenir à chaque fois un index unique, on peut se servir d'une variable entière (count initialisée à 0) et d'une autre variable à déploiement recycle. Cette dernière variable permet de recycler les indexs (puisqu'on qu'ils ne doivent pas dépasser 8191, il est nécessaire de les détruire lorsqu'on en a plus besoin. C'est une liste, d'ailleurs. Elle fonctionne selon le même principe que celui expliqué plus haut).
Lorsque tu veux obtenir un index, il y a deux possibilités : soit il y en a un dans la liste d'attente des recyclés, soit il faut en créer un tout nouveau. La première chose à faire est donc de vérifier si recycle[0] est différent de 0. S'il l'est, l'index correspond à recycle[0]. Dans ce cas, il faut retirer recycle[0] de la liste de recyclage, en faisant recycle[0] = recycle[recycle[0]]. Dans le cas où recycle[0] = 0, il faut créer un tout nouvel index. Dans ce cas, il suffit d'incrémenter count, et ton index correspond à la valeur de count.
Regardons maintenant comment recycler les indexs quand t'en as plus besoin. Tu as un index x, et il faut le rajouter dans la liste de recyclage. Pour cela, il suffit de faire :
set reycle[x] = recycle[0]
puis
set recycle[0] = x
Voilà comment faire des suite d'indexs compris entre 1 et 8191.
Ces indexs peuvent servir à retrouver d'autres valeurs (des entiers dans ton cas) stockés dans une autre variable à déploiement.
Là j'ai seulement expliqué les listes simplement chaînées, mais tu peux, en plus de la variable next, rajouter une variable prev permettant de retrouver la valeur précédente.
Dans ton cas, le plus approprié serait de faire une liste de liste de nombre. Je pense que si tu as compris le principe des listes, tu comprendra aussi celui des listes de listes. Il suffit de stocker le premier index de chaque liste dans une autre variable à déploiement.
En gros, ça reviens à faire beaucoup plus compliqué, et peut-être moins bien. Si j'utilise des variables à déploiements, y a la limite des 8192 (c'est possible qu'une limite comme ça sois atteinte avec mon système, avec recyclage). Et si j'utilise des hashtables, ça doit être plutôt lent au final. Et puis aussi y a le boulot derrière x) _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 30/04/13 18:09 Sujet du message:
C'est dur à expliquer ^^'
J'ai nommé ça l'OTE, OverTimeEffects. Les effets sur la durée ont très souvent des caractéristiques communes, si on les fait par trigger. L'idée est donc de faire un tout-en-1 pour les effets sur la durée. Enfin, pas vraiment tout-en-1 car tout passe par des "modules" qu'on attache au système même, comme des modules Stun, DoT, Knockback, etc... Le coeur du système s'occupe de l'indexing des différentes instances des modules qui sont appliquées pour chaque unité, de les déclencher (dans le cas d'un DoT infliger les dégâts par exemple) et d'y mettre fin si besoin (fin de la durée de l'effet ou autre condition). _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 30/04/13 19:11 Sujet du message:
Mouai, ca doit piquer les yeux en GUI
J'avoue que je n'ai pas vraiment compris ton binz, mais bon l'important c'est que ça te plaise après tout
Si je comprends bien, tu lies les infos nécessaires pour les buffs à chaque unité, moi j'aurais plutôt fait l'inverse, lier aux buffs en cours d'application les unités affectées. _________________
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