Page 1 sur 1
tester une map
Publié : mer. 28/déc./2011 17:34
par blendman
salut
J'essaie d'ajouter des objets dans un inventaire et vérifier si la case est prise, mais je suis un peu coincé ^^.
Voici à quoi ressemble le code que je voulais utiliser :
Code : Tout sélectionner
Structure stObj
kaz.a
EndStructure
Global NewMap inventaire.stobj()
AddMapElement(inventaire(),"1")
inventaire("1")\kaz = 2
AddMapElement(inventaire(),"2")
inventaire("2")\kaz = 3
AddMapElement(inventaire(),"3")
inventaire("3")\kaz = 5
For nbreObj = 0 To 1 ; on va ajouter 2 objets
fin_list =0
ResetMap(inventaire())
NextMapElement(inventaire())
Debug "----------------------- objet : "+Str(nbreObj)+"-----------------------------"
For kaze = 1 To 8
fin_list =0
Debug kaze
ForEach inventaire()
fin_list+1
If kaze = inventaire()\kaz ; la case est prise
Debug "Case "+Str(kaze)+" drop déjà prise"
Break
Else
If fin_list = MapSize(inventaire())
Debug "on est à la fin de la liste - Case non prise ! Ajout de l'objet dans la case"+Str(kaze)
inventaire(Str(MapSize(inventaire())+1))\kaz = kaze
Break 2
EndIf
EndIf
Next
Next kaze
Next nbreObj
Normalement, je devrais tester les cases et trouver que la une est libre pour le 1er objet, puis la 4, mais ça ne marche pas.
Une idée de la boulette que j'ai faite ?

.
Merci
EDIT : j'ai modifié un peu le code, mais ça ne marche toujours pas. Mais au moins, on voit mieux que ça ne marche pas ^^.
EDIT 2 : bon, j'ai trouvé, mais je ne sais pas si c'est la meilleure technique, si vous avez une meilleure solution, n'hésitez pas

.
Re: tester une map
Publié : mer. 28/déc./2011 21:10
par Le Soldat Inconnu
Je t'avoue que je ne comprends pas bien ton système, c'est quoi que tu range dans Kaz ?
Re: tester une map
Publié : mer. 28/déc./2011 21:16
par blendman
Kaz, c'est la case sur laquelle se trouve l'objet, dans l'inventaire.
Par exemple, j'ai dans mon jeu :
Code : Tout sélectionner
inventaire()\id = 18 ; c'est l'identifiant de l'objet, il me permet d'avoir les informations souhaitées, lorsque je le veux.
inventaire()\nom ="Potion de vie" ; le nom de l'objet
inventaire()\kaz = 3 ; il est sur la 3ème case.
inventaire()\nb = 3 ; c'est le nombre d'objet du même "id" qu'on a dans l'inventaire
;etc...
Re: tester une map
Publié : mer. 28/déc./2011 22:05
par comtois
j'utiliserais le no de la case comme clé de la map. Pour savoir si une case est libre tu as juste à tester ainsi
If FindMapElement(inventaire(), drop$)
Code : Tout sélectionner
Global NewMap inventaire.i()
;la clé correspond au numéro de la Case
inventaire("1") = 2 ;No id de l'objet , si on a besoin de plus d'infos on se réfère à cet id !
inventaire("2") = 3
inventaire("3") = 5
;Tu parles de drop , donc tu connais déjà le no de la case souhaitée et donc à tester ?
;Dans ce cas pourquoi ne pas utiliser FindMapElement(inventaire(), drop$) ?
;Le joueur a choisi la case 3
Objet = 0
Drop$ = "3" ; Teste aussi avec "0"
;On teste si cette case est libre
If FindMapElement(inventaire(), drop$)
Debug "La case " + Drop$ + " est déjà prise"
Else
Debug "Case non prise ! Ajout de l'objet dans la case " +Drop$
inventaire(Drop$) = Objet
EndIf
inventaire()\nb = 3 ; c'est le nombre d'objet du même "id" qu'on a dans l'inventaire
Pour moi un id doit être unique, tu ne peux pas avoir 3 objets avec le même id, tu parles sans doute du type d'objet ? ou des objets ayant le même nom ?
Sinon pour un inventaire, un simple tableau ne suffirait pas ? Le nombre de cases doit être limité et figé non ?
Re: tester une map
Publié : jeu. 29/déc./2011 10:26
par blendman
comtois a écrit :j'utiliserais le no de la case comme clé de la map. Pour savoir si une case est libre tu as juste à tester ainsi
Code : Tout sélectionner
Global NewMap inventaire.i()
;la clé correspond au numéro de la Case
inventaire("1") = 2 ;No id de l'objet , si on a besoin de plus d'infos on se réfère à cet id !
inventaire("2") = 3
inventaire("3") = 5
;Tu parles de drop , donc tu connais déjà le no de la case souhaitée et donc à tester ?
;Dans ce cas pourquoi ne pas utiliser FindMapElement(inventaire(), drop$) ?[/quote]en fait, on ne connait pas forcément le numéro de la case à utiliser, car on teste justement pour voir si celle-ci est libre ou non.
Dans mon inventaire, on peut réorganiser nos objets, en drag and drop. Donc, on peut avoir des cases libres entre des cases prises, comme on le voit sur cette image :
http://www.3arks.com/arkeos/images/screen/arkeos0.10_3.jpg
Si on supprime un objet, on le supprime de la map, et la case se "libère" (on peut y mettre un autre objet).
Je pense que mon système est un peu inversé, je ne gère pas des cases sur lesquelles on peut mettre des objets, mais plus un groupe d'objets que l'on met sur des cases.
[quote][quote]inventaire()\nb = 3 ; c'est le nombre d'objet du même "id" qu'on a dans l'inventaire[/quote]
Pour moi un id doit être unique, tu ne peux pas avoir 3 objets avec le même id, tu parles sans doute du type d'objet ? ou des objets ayant le même nom ?[/quote]OUi, il est unique, mais on peut avoir plusieurs objet identiques (donc ayant le même id). Donc on n'a pas de duplicata de cet objet dans l'inventaire, mais on incrémente/décrémente son nombre plutôt. Du coup, 50 objet ayant le même id prennent une seule case et corresponde en réalité à un seul objet sur la map.
Par exemple, si l'id 1 représente : une potion de vie donnant 20 points de vie. On peut avoir 30 potions identiques. Donc, j'ai bien 1 seul objet dans l'inventaire ayant cet id et le nombre est alors de 30.
Cela me permet plusieurs objets identique (même id), et qui n'utilisent qu'une seule case et une seule place dans la map/liste.
[quote]Sinon pour un inventaire, un simple tableau ne suffirait pas ? Le nombre de cases doit être limité et figé non ?[/quote]j'y avais pensé, mais en fait, je gère plutôt une liste d'objet que des cases d'inventaire, car le nombre est certes limité(disons inférieur à 150 au départ), mais il peut évoluer, en fonction de certains paramètres (force, personnage choisi, bonus, etc..).
J'ai aussi pensé à utiliser une liste, car je pourrais la trier par type d'objet, par nombre, par nom, etc.. Et ce serait intéressant je pense :).
Cela dit, je vais peut être testé un tableau, mais je me demande si ça ne va pas être plus délicat à gérer.
Re: tester une map
Publié : ven. 30/déc./2011 0:29
par PAPIPP
Bonjour Blendman
et comme cela peut être
Code : Tout sélectionner
Structure stObj
kaz.a
EndStructure
Global NewMap inventaire.stobj()
AddMapElement(inventaire(),"2")
inventaire()\kaz = 2
AddMapElement(inventaire(),"3")
inventaire()\kaz = 3
AddMapElement(inventaire(),"5")
inventaire()\kaz = 5
For nbreObj = 0 To 1 ; on va ajouter 2 objets
fin_list =0
ResetMap(inventaire())
NextMapElement(inventaire())
Debug "----------------------- objet : "+Str(nbreObj)+"-----------------------------"
For kaze = 1 To 8
fin_list =0
Debug kaze
ForEach inventaire()
fin_list+1
If kaze = inventaire()\kaz ; la case est prise
Debug "Case "+Str(kaze)+" drop déjà prise"
Break
Else
If fin_list = MapSize(inventaire())
Debug "on est à la fin de la liste - Case non prise ! Ajout de l'objet dans la case"+Str(kaze)
inventaire(Str(MapSize(inventaire())+1))\kaz = kaze
Break 2
EndIf
EndIf
Next
Next kaze
Next nbreObj
Re: tester une map
Publié : jeu. 05/janv./2012 2:20
par case
ben... tu peux faire une liste qui ne contiens que les index des cases vides...
si tu as besoin de prendre une case vide tu prend celle en tête de liste. et tu la sort de la liste.
pour l'inverse si tu as une case pleine qui se vide, tu peux la mettre en fin de liste par exemple
et faire un tri pour que tes cases vides se remplissent dans l'ordre.
et si le joueur met un objet dans une case particulière tu teste si elle est vide ou pas, si elle est vide tu parcours ta liste et tu la vire des cases vides...