JeuWeb - Crée ton jeu par navigateur
[REGLE]Inventaire, differencier les objets - 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 : [REGLE]Inventaire, differencier les objets (/showthread.php?tid=1689)

Pages : 1 2


[REGLE]Inventaire, differencier les objets - Kassak - 31-08-2007

Bonjour, alors, ca fait deux moi que j'ai pas touché au php, et aujourd'hui je reprend le developement de mon jeu...comme vous pouvez le deviner j'ia quelque souci de memoire, 2 mois sans toucher a rien pour moi cest fatal!^^


Bref, pour mon systeme d'inventaire, j'ia une table item, qui contient la liste de tous les objets existant :

exemple : id_item 1, nom Armure, force 8 etc....

Une ligne pour chaque item donc et un id qui va avec.


Ensuite j'ia la table inventaire, qui contient ben l'inventaire des objets du joueurs, donc il y a par exemple :

KassaK, id_item 5, nombre 4
Pierre, id_item 6, nombre 8
Pierre, id_item 8, nombre 3
etc....

Et c'est la que vient mon probleme, comme differencier (je prend le cas de KassaK), les 4 objets different?
Par exemple, j'ai les 4 objets dans mon inventaire, et je souhaite en equiper un, ben la je ne peux que equiper les 4 en meme temps.


Je pense que comme dab, c'est un problème tout con, mais je ne vois pas la soluce, vivement que je me remette dans le bain moi.


Merci


RE: Inventaire, differencier les objets - Sephi-Chan - 31-08-2007

Je te conseille d'associer un couple Possesseur (joueur) Arrow Possédé (objet). La notion de nombre d'exemplaires d'un objet ne doit pas exister en BdD.

En effet, si le joueur Kassak (id_oueur : 1) à 4 Barres d'Aéracier (id_objet : 124) et 1 Arme Gangrenée (id_objet : 37), et le joueur Pierre (id_joueur : 2) possède 1 Ceinture de mailles oxydées (id_objet : 6).
Tu auras 6 entrées dans la table inventaire :

id_joueur Arrow id_objet
1 Arrow 124
1 Arrow 124
1 Arrow 124
1 Arrow 124
1 Arrow 37
2 Arrow 6

Ensuite lors de l'affichage pour empiler les objets, tu ajoute un COUNT à ta requête avec un GROUP BY id_objet.

Ensuite si tu veux équiper, sois tu mets un champs equipe dans ta table, qui serait un champs de type ENUM avec les choix OUI ou NON, sois tu utilises une table equipement.


Sephi-Chan


RE: Inventaire, differencier les objets - uriak - 31-08-2007

Je vais devoir passer par le même travail. Donc avec une table d'objets et une table d'inventaire

Mais pour moi ce sera simple : chaque objet à son entrée dans la table d'inventaire, + un nombre permettant pour certains de former des "tas". Eventuellement un mécanisme en jeu permettra de réunir/diviser ces tas, mais en tout état de cause ils seront présentés comme un objet indivisible en jeu.

Donc si mon personnage à 3 casques sur lui (qui sait ce qu'on trouve dans les poubelles d'un forgeron ?) ça fera trois entrée dans la table inventaire

id_player, id_item, nb
457 , 37 ,1
457, 37, 1
457, 37, 1

Un peu de gâchis pour l'utilisation de l'espace. Mais si tu n'as pas besoin du tout de différencier ces items, alors le plus simple reste pour toi de faire une fonction d'éclatement pour intéragir.

Tu fais un select sur la table inventaire avec WHERE id_player = $id et tu récupère N entrées du type id_object, nb_object. A toi de faire des boucles for sur nb_objects pour afficher 3 object par ex, en équiper un, etc. Si tu as unet able d'objets équipés tu mettras celui qu'il faut et selon le cas:
- soustraira à nb_objets au groupe d'objets du même genre s'il était > 1
- détruira la ligne de l'objet dans la table inventaire.

et l'inverse quand un objet arriuve dans l'inventaire : création d'une ligne ou modification du nombre selon le cas.

EDIT : sephi est passé avant... mais je te propose les deux alternatives ^^


RE: Inventaire, differencier les objets - Kassak - 31-08-2007

Et si il y a 500 joueurs qui chacun a 500 exemplaires de 500 objets ca fera vite un gros bordel non? c'est pas grave ca?

Sinon oui il y a un champ port, avec comme valeur oui non.


RE: Inventaire, differencier les objets - uriak - 31-08-2007

500 objets par joueur ? Donc tu penses surtout à des consommables : matériaux, etc. Définis donc pour chaque objet dans la table objects le nb_max (1 pour des armures par ex, et 10, 20, 30... pour les trucs à empiler) Ensuite utilise donc le système de liaison id_player, id_item, nb_item. Il faut juste que tu fasses le traitement dont je parlais : soustraire ou augmenter nb_item de l'entrée de la table inventaire quand un objet est équipé, déséquipé, gagné, perdu... ou supression de l'entrée quand nb_items doit tomber à 0 ou ajout d'une nouvelle entrée quand nb_items doit dépasser nb_max


RE: Inventaire, differencier les objets - Kassak - 31-08-2007

Oki merci a vous deux, je vais voir caWink

Ca va me prendre la journée voir peut etre la nuit, le tems que je comprenne ce que j'avais codé, et le temps que je modifie tout^^

Allez bonne chance a moi


RE: Inventaire, differencier les objets - Sephi-Chan - 31-08-2007

A la limite recommence depuis le début, tu seras moins perdu.

Je trouve la méthode que je propose plus pratique (sinon je ne la proposerai pas en même temps :p) car elle permet une gestion plus facile de chaque objet.

D'autant qu'en choisissant bien les types de colonnes ça ne prends pas spécialement beaucoup de places. Cf. Capacités des colonnes et les Types numériques (bas de page).

Par exemple si le jeu compte moins de 254 objets différents, tu peux mettre un simple TINYINT auquel tu donnes la constante UNSIGNED, ce qui te permet d'étendre son intervalle de validité de [-127;127] à [0;254] tout en ne pesant qu'1 octet. Si tu en as plus que 254, tu passes au SMALLINT, qui suffira forcément car il va jusqu'à 65534.

La technique que je te propose te permet même de faire un système de coffre où le personnage peut déposer des objets. Tu les indique alors avec un champ ENUM nommé coffre qui à pour valeur OUI ou NON.


Sephi-Chan


RE: Inventaire, differencier les objets - Kassak - 31-08-2007

Pour le moment il n'y a que 15 objet different, mais dans 5 ans il y en aura peut etre 5000 ^^

Deja a la sortie du jeu, en comptant tous les equips, objet, objet de quete, materiaux et j'en passe j'aurais largement depassé les 254..

Moi tous mes champ je les met en INT (11), ca fait mal ou pas de faire ca?


RE: Inventaire, differencier les objets - NicoMSEvent - 31-08-2007

Pour moi, chaque possibilité d'équiper un objet est un champ sur le perso (torse, bras_gauche,bras_droit, jambes, tete).
Lorque j'équipe quelque chose sur mon perso, l'objet disparait de l'inventaire --> le lien est fait sur le perso.
Chaque objet a un identifiant unique (on peut retracer son histoire grace au log, ça permet de voir si il a eu vol ou autre magouille). Ce qui permet aussi d'avoir plusieurs objets du meme type, avec des états différents (un a moitié usé et un autre cassé par exemple)

Seul l'or est un champ qui contient une quantité (je ne retrace pas le trajet de chaque piece, ça serait insensé... l'argent n'a pas d'odeur Wink )
Par contre les transactions entre joueurs sont enregistrées.


RE: Inventaire, differencier les objets - Sephi-Chan - 31-08-2007

HS @ NicoMSEvent :
Tu stockes les transactions entre joueurs dans une table ou bien dans un fichier ? Car je pense introduire ça pour aider à déceler les doubles comptes, mais j'hésite sur la manière de l'implémenter.

Pour revenir au sujet, je fais la même chose, une table inventaire, qui me permet un meilleur contrôle sur les emplacements des pièces sur les personnages et donc une meilleur gestion de la récolte d'information sur l'équipement d'un personnage, à l'occasion d'un combat par exemple.

Kassak a écrit :Moi tous mes champ je les met en INT (11), ca fait mal ou pas de faire ca?
Oui. Avec INT tu vas jusqu'à 2147483647 (le double si tu mets UNSIGNED) et pèse 4 octets, c'est généralement trop.

L'optimisation se fait beaucoup par le choix des colonnes. Jette un oeil à ses liens et tu verras en quoi c'est important, et à la fois facile de bien choisir. Ça vaut le coup d'être fait, non ? Wink

UNSIGNED a écrit :UNSIGNED (non-signé, en français). Les valeurs non-signées peuvent être utilisées pour n'autoriser que des valeurs positives dans une colonne, ou bien pour exploiter un intervalle de validité plus haut.


Sephi-Chan, ok l'argent n'a pas d'odeur, mais paye ton goût ! *mastique 50€*