Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.phpMédailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Reçyclage d'index particulier

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 Vladadamm
Floodozaurus


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.


MessagePosté le: 30/04/13 10:17    Sujet du message: Reçyclage d'index particulier Citer

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 ?
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 kungfu-sheep
Anomalie floodiforme


Inscrit le: 14 Avr 2011
Messages: 1846
Sujets: 119
Spécialité en worldedit: fonctions paramétriques, équation de mouvement.


MessagePosté le: 30/04/13 10:28    Sujet du message: Citer

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
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 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...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 30/04/13 11:26    Sujet du message: Citer

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.


_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Vladadamm
Floodozaurus


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.


MessagePosté le: 30/04/13 12:46    Sujet du message: Citer

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)
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Ayane
Bot administrateur


Inscrit le: 17 Sep 2007
Messages: 2012
Sujets: 49

Médailles: 2 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1) Ayane (Quantité : 1)

MessagePosté le: 30/04/13 12:49    Sujet du message: Citer

Le plus simple et performant de surcroît est comme tu l'as dit:
Citation:
de baisser l'index de toutes les valeurs qui sont après cette suite de X

Liste chaînées cela aurait été pratique dans un langage tel que le C, en Jass il vaut mieux éviter.

Si on veut retirer un élément d'un tableau:
Code:

For i = targetIndexToRemove to (arrayLength - 2)
  Set array[i] = array[i + 1]


Dans ton cas c'est plus:
Code:

For i = 0 to (arrayLength - 1)
  If array[i] >= targetIndexToRemove Then
    Set array[i] = array[i] - 1

_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Troll-Brain
Ri1kamoua


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...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 30/04/13 17:48    Sujet du message: Citer

C'est quoi exactement le cas concret d'une telle utilisation ?
Je suis curieux, il y a peut être une meilleure approche du problème.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Vladadamm
Floodozaurus


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.


MessagePosté le: 30/04/13 18:09    Sujet du message: Citer

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).
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


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...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 30/04/13 19:11    Sujet du message: Citer

Mouai, ca doit piquer les yeux en GUI Razz

J'avoue que je n'ai pas vraiment compris ton binz, mais bon l'important c'est que ça te plaise après tout Wink

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.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
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


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com