JeuWeb - Crée ton jeu par navigateur
[Gestion inventaire] ID unique, ou non? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Gestion inventaire] ID unique, ou non? (/showthread.php?tid=2829)

Pages : 1 2 3 4 5


[Gestion inventaire] ID unique, ou non? - Ruz - 05-08-2008

Hello!
Petite question (avec grosse réponse, je suppose): Gestion d'inventaire.
Je possède une table contenant les types d'objets et leur caracs complètes
structure sans importance, du genre:
table `objets`
ID, Type, Sous-Type ...(pleins de caracs)

Dans mon inventaire, je préfère ne pas utiliser un ID par objet existant dans le monde... (Mes pièces d'or sont aussi des objets... si je commence à mettre 1 ID par pièce, je suis pas sorti...)
structure table `inventaire`
ID, ID_perso, ID_objet, Qtt, Equipe (0/1), Degat (valeur: 0 à 255)

Bref, j'ai pris le parti de me faire une clé reposant sur ces champs:
ID_perso, ID_objet... ce qui marche à merveille. Sauf que (évidemment), je dois gérer des dégats/usures sur certains objets (armes, armures)=> pour ceux là, j'ai rajouté un ID unique... (suis parti dans le système hybride) Chaque arme /armure étant limité à Qtt=1.

Problèmes:
1) c'est lourd niveau code
2) des trucs con, comme le "ON DUPLICATE KEY UPDATE" ne fonctionnent pas (ma clé est transférée sur l'ID, du coup)
3) Niveau équipement, le champ Equipe est a 1 ou 0 suivant équipé ou non.=> au chargement du perso (objet), je dois donc parcourir tout mon inventaire, jongler avec des variables temporaires, et vérifier que tout est bien là où il faut... et qu'il y a pas de doublons)=> lourd aussi.

Bref: je me retrouve avec de la lourdeur niveau code...
J'ai a priori plusieurs solutions:
1) mettre ID unique a tout, et tant pis pour les pièces d'or (voir mettre ca a part) (consommation bdd énorme, non?)
2) plus d'ID... les armes/armures traitées comme les autres, mais je dois modifier mon champs Degat... et concaténer les dégats des différentes armes en ma possession.
problème: quand mon perso fait "équiper"... quels dégats seront pris? (il en n'en équipe qu'un... ou je dois afficher une barre d'usure dans l'inventaire...)
3) des idées???


En dehors de ca... vaut-il mieux tester chaque emplacement d'inventaire au chargement du perso, et recontruire l'équipement à chaque appel... ou créer une table annexe, du genre:
ID_perso, Tete, Cou, Torse, Bras, main, Ceinture, Jambes, Pied
ou chaque champ contient l'ID de l'objet équipé?

Je dois dire que j'hésite entre ces possibilités...
Donc, si vous avez des avis/idées/propositions/benchmark, je suis grandement preneur ^^

Merci d'avance.
PS: je poste et je relis... y a un truc qui m'ennuie, dans cette question...


RE: [Gestion inventaire] ID unique, ou non? - keke - 05-08-2008

Coucou,

Je me permets d'utiliser le modèle de mon jeu pour te montrer comment j'ai fonctionné.
Dans magdales :

Table objet (id_objet, nom objet, nombre, id_equipement ...)
Table equipement (id_equipement)

Les personnages, les monstres, les coffres, les batiments ont un id_equipement unique.
Les objets ont un id_equipement associés à l'inventaire.

j'ai géré les pièces à part ... mais rien n'empècherais de les ajouter à la liste objet. La notion de nombre et de objet empillable permet de limiter la taille de la base, bien que, en fin de compte, il n'y a que les flèches qui utilisent réellement cette possibilité
Les objets qui ont un effet sont identifiés dans la table effet par l'id_objet. Si dans un inventaire il y a des flèches de feu et des flèches cassées, il s'agit de 2 lignes dans la tables objets avec des effets propres à chaque id_objet.

Certains objets ont un id_rangement qui permet d'indiquer où se place cet objet (une arme, une armure, une ceinture ...)
J'indique aussi si l'objet est utilisé avec le champs : utilise. 0 si non-utilisé ...


L'intéret que j'ai eu à fonctionner ainsi, c'est de permettre de faire des objets génériques : une torche, une épée, etc... puis de pouvoir unitairement modifier chaque objet ... la torche est plus lumineuse, l'épée s'appelle Vorpal et fait plus de dommage.

Salut !

Kéké
PS : voici les champs exactes de ma table objet ...
Table Objet : id_objet id_equipement id_position nom id_type_objet id_rangement id_competance mains poids encombrement prix_achat prix_vente generique id_parent_objet empillable id_sortilege utilise portee dommage protection nombre graphisme id_image id_lexique


RE: [Gestion inventaire] ID unique, ou non? - phenix - 05-08-2008

Personnellement, j'ai un système plutôt simple qui tient en 2 tables.

Une table "Objet", elle contient toutes les informations sur les objet (Dégat, poind, prix etc...), c'est pratique car elle sert souvent, pas uniquement pour l'inventaire.

Une table "Inventaire" qui contient 4 champs:

id: Pour supprimé un objet bien précis.
id_objet: il relie inventaire et Objet.
id_joueur: pour relier l'objet au joueur.
equip: Vaut 1 quand l'objet est équipé et 0 quand il est dans le sac.

C'est le système le plus simple que j'ai trouver et sa marche parfaitement Wink


RE: [Gestion inventaire] ID unique, ou non? - Satevis - 05-08-2008

Problème 2): Même en créant un INDEX sur les champs ID_perso/ID_objet ?
Problème 3): normalement tu ne devrait pas avoir à vérifier la validité des informations (je pense au doublon surtout) que te renvois la BDD, c'est avant l'ajout des informations dans la BDD qu'il faut les vérifier de cette manière tu ne vérifie qu'une seul fois et non pas à chaque fois.
Quand tu charge le perso, as tu besoin de tout l'inventaire ou seulement de ce qui est équipé ? Car à ce moment tu peux gagner sur la requête en y rajoutant un WHERE ou en séparant la vue des objets équipés des non équipés.

Solution 1): Rajouter un champs dans la table qui possède les informations du perso peut résoudre ton dilemme, je suppose que tu y fait appel au moins une fois presque partout donc pas énormément plus de consommation Smile.

Sympa comme système Kéké sauf si on n'aime pas les jointures ^^.


RE: [Gestion inventaire] ID unique, ou non? - Ruz - 05-08-2008

alors, merci pour les réponses...
l'index ID_perso, ID_objet fonctionne parfaitement, comme dit, sauf que dans ce cas, comment gérer les dégats? les 6 armures (oui, je vois large) avec 0,12,20,21,52,96 % de dégats en inventaire... je veux équiper celle a 22%, ok, le champ Equipe passe a 1... mais rien ne détermine quel armure j'ai sur le dos. (et je vois pas comment faire, sauf en séparant les différentes armures)

Quand je charge le perso, j'ai besoin de tout l'inventaire... si trop chargé => y a des malus.

Par contre, ta solution, je comprends pas... un champ à la table `perso`, ok , mais pour y mettre quoi?


RE: [Gestion inventaire] ID unique, ou non? - Satevis - 05-08-2008

oxman a écrit :Si on aime pas les jointures on fait pas de BDD :p
Faut bien commencer par quelque chose Smile.
*Brule les preuves compromettantes*
Ruz a écrit :alors, merci pour les réponses...
l'index ID_perso, ID_objet fonctionne parfaitement, comme dit, sauf que dans ce cas, comment gérer les dégats? les 6 armures (oui, je vois large) avec 0,12,20,21,52,96 % de dégats en inventaire... je veux équiper celle a 22%, ok, le champ Equipe passe a 1... mais rien ne détermine quel armure j'ai sur le dos. (et je vois pas comment faire, sauf en séparant les différentes armures)

Quand je charge le perso, j'ai besoin de tout l'inventaire... si trop chargé => y a des malus.

Par contre, ta solution, je comprends pas... un champ à la table `perso`, ok , mais pour y mettre quoi?

Pour l'histoire de tes armures je crois que t'a pas trop le choix il te faut une entrée par armure.
Si tu n'affiche pas l'inventaire complet ou que tu n'as pas besoin de connaitre précisément l'inventaire du joueurs et que tu as juste besoin de connaitre le nombre d'objets ou leur poids total (totaux ?) tu peux t'éviter le traitement en PHP en utilisant la fonction SUM() ou COUNT() dans ta requête SQL aprés ça ne correspond sans doute pas ce dont tu as besoin Smile.
Tu y met le nombre de pièces d'or que le perso dispose Wink.


RE: [Gestion inventaire] ID unique, ou non? - Ruz - 05-08-2008

ouaip...
c'est bien ce que je pense aussi...
donc, un ID unique par objet...

Vais devoir mettre les pièces d'or a part...

En moyenne, un joueur à combien d'objet, dans vos jeux?


RE: [Gestion inventaire] ID unique, ou non? - keke - 06-08-2008

une bonne quarantaine ... et quelques centaines de pièces sur eux.

Dans leurs coffre, ca peut monter à quelques milliers ...

Kéké.


RE: [Gestion inventaire] ID unique, ou non? - Cartman34 - 06-08-2008

perso, j'ai pas tropcompris le problème, un ID unique par objet c'est pas trop un probleme.
Si l'or a l'ID 1, que le joueur en ai 1 ou 50.000 ca change rien, son ID reste 1, le nombre est enregistré directement...
Ca c'est pour le développement des objets.
m'enfin comme vous etes pas trop clair sur le problème j'ai essayé de le voir autrement et il se pourrait que Ruz est eu la mauvaise ID(mouahahaha...bon ok => [] ) d'enregistrer dans une table les objets de tous les joueurs...ce qui ne se fait pas...(Mon dieu les requetes de oufs pour le serveur !!!)
J'espère qu'au moins une de ces interprétations est bonne Wink


RE: [Gestion inventaire] ID unique, ou non? - Satevis - 06-08-2008

Rohhh ta finis de te moquer, méchant Big Grin.

Je crois que tu as bien compris IGstaff Smile.