TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web multijoueurs, jeux par forum. En savoir +

Flux RSS des discussions du forum : pour les joueurs, et pour les créateurs et MJ
  Reply to this topicStart new topicStart Poll

> Maps: Gérer La Présence De Plusieurs Objets/case
Feadin
  Ecrit le : Vendredi 23 Novembre 2007 à 13h12
Quote Post


Newbie
*

Groupe : Membre
Messages : 5


bonjour.

Pour répondre d'avance à certaines remarques qui pourraient m'être faites (oui, en faisant ça je passe tout de suite pour un aigri qui s'imagine d'office qu'il va être critiqué, mais j'assume tongue.gif )

- je sais que ce forum n'est pas un forum de dev, mais au vu des questions/réponses déjà présentes sur différents topics, je pense que certaines personnes ici seront à même de répondre à mes questions

- je sais qu'il y a déjà plein de topics autour du sujet de la map, je les ai déjà tous lus je pense, et j'ai mis en marque-page quantité d'entre eux contenant des tips intéressants, mais à moins que je n'ai loupé des trucs (et dans ce cas je m'en excuse), le sujet que je voudrais aborder n'a pas encore été soulevé

Ceci dit, je passe à l'exposé du problème. ^^
Avec un ami, nous avons décidé de nous lancer dans le dev d'un jeu. Nous sommes tous deux étudiants, lui en info et moi en bio-ionfo, et fervents pratiquants de mmorpg au tour par tour asynchrone depuis quelques années déjà. Ce dev est pour nous une bonne occasion à la fois de mettre en oeuvre nos compétences, d'en acquérir de nouvelles, et de nous faire plaisir en faisant quelque chose qui nous passionne.
Nous en sommes au "tout début" de la conception (phase d'élaboration papier des futurs systèmes) et nous ne coderons pas avant un sacré bout de temps encore wink.gif (mieux vaut avoir quelque chose de propre, organisé et clair avant, surtout lorsque l'on est plusieurs à coder ^^ )

Mais arrivés à la discussion sur la map (ou plutôt les maps ^^), nos avis divergent sur la méthode à employer pour le stockage dans la base.
Ce qu'il faut d'abord savoir pour comprendre: l'idée de base est celle d'un mmo basé sur les donjons, chaque donjons comportant plusieurs niveaux (donc une map/niveau*nombre de donjons)
Les maps seront à l'affichage une simple succession d'images positionnées dans dans une div (système des tuiles carrées sans séparation entre les cases, du tout simple très classique en somme)

Bon, si nous choisissons au final de ne stocker qu'un (ou un nombre fini d')objet de chaque type/case, aucun problème.
Or nous tendons plutôt vers le cas ou plusieurs objets de chaque type (joueurs, mobs, coffres...) pourraient être présents, en quantité aléatoire variant dans le temps.

Là, je suppose que vous commencez à voir le souci: comment gérer ça niveau bdd?

mon collègue est d'avis de présenter chaque table map comme ceci:

champs: id_case x y image joueurs mobs ...

ensuite, dans la case mob par exemple, une chaîne de caractère présentée ainsi:
l,50-d,100-m,10
pour chaque couple, la première lettre correspond au type de mob dont les caracs sont indexées dans une table à part, et le chiffre ensuite correspond à son niveau de vie.
l'idée est ensuite de traiter les données récupérées de la façon suivante: lors de la détection, un script découpe la chaîne de caractères de façon intelligente en plusieurs variables globales, puis ces variables sont utilisées pour les processus de détection, d'attaque/soins etc.

mon avis là-dessus, c'est que si un tel système serait peut-être effectivement très light pour la bdd niveau données stockées, sa mise en oeuvre serait plutôt difficile niveau récupération des données/updates de la bdd (à moins que je ne me trompe, à vrai dire je n'ai pour l'instant ébauché les scripts correspondants que dans ma tête, pas sur le papier, et peut-être que je me rendrais compte en les écrivant que c'est plus simple à faire que je ne l'imagine. *Hou, le vilain, il nous pose déjà des questions alors qu'il n'a pas fini de bosser dessus, lynchons-le!* Non, non, non, pas taper, je plaide coupable, je préfère effectivement poser la question avant de me lancer dans des trucs tordus).
En plus je dois l'admettre, pour moi dans une base une "case" = une donnée, stocker plusieurs infos dans une case... hérésie! tongue.gif

Le souci, c'est que je ne vois qu'une alternative: pour chaque table map, avoir une table jointe fonctionnant sur le modèle

champs: id_entree id_case mob vie_mob joueur coffre contenu_coffre etc

(voire diviser cette table jointe en plusieurs tables jointes, une concernant les mobs, une les persos, une les coffres, histoire d'éviter redondances et champs vides dans les entrées)

à partir de là, chaque objet présent sur une case devient unique et facile à traiter (puisqu'il correspond à une entrée dans la table)

par contre, la simplicité du système se paie par un accroissement du volume de données à stocker. (et un grand nombres de tables dans notre cas, puisque nous avons plusieurs maps).

*bon, il nous fait un tas de descriptifs mais là on a compris alors qu'il la pose sa question, de toute façon on sait déjà ce qu'il va demander*

Désolé, je suis du genre assez loquace ^^
Donc les questions sont évidemment:

- est-ce que d'autres systèmes que ceux-ci, plus propres niveau code et auxquels nous n'aurions pas pensé peuvent être envisagés? (c'est sans doute le cas, il y a tellement de mmo qui ont déjà du répondre à cette problèmatique... ^^' )

- dans l'hypothèse ou aucun autre système ne pourrait être considéré, lequel des deux serait à votre avis le plus efficace?

Voilà, je m'arrête là en espérant avoir été suffisamment clair, et je vous remercie d'avance pour vos réponses wink.gif
PMEmail Poster
Top
Manest
Ecrit le : Vendredi 23 Novembre 2007 à 15h27
Quote Post


Ouf
*

Groupe : Membre
Messages : 503


Salut. Le forum programmer correspond tout à fait à ce genre de demande, il sert d'ailleurs spécifiquement à ça.

Je me suis un peu perdu dans ton texte, mais j'espère avoir compris.
Donc pour moi, non ce n'est pas une bonne idée de placer des chaines de caractère contenant les id concaténés dans un champs.
Ca va rapidement devenir l'enfer pour faire des jointures ou des mises à jour de ces données (après il y a p'tet moyen de créer les bons outils de traitement en amont, mais c'est du boulot).

Ensuite c'est comme toujours, il a plusieurs façon d'aboutir au même résultat, à vous de voir vos besoins, personnellement je fonctionnerais ainsi :

La table map : id_case, x, y, id_type
id_type renvoyant à un type de case (mer, plaine, montagne etc...), tu peux également ajouter d'autre param du genre id_altitude, is_forest, id_temperature ou ce qu'il te semble utile pour ton jeu. Bref c'est les info relative à la carte en elle même qui y seront stocké.
Pour l'affichage, tu le fera en fonction du type de case et des paramètres qui vont bien.
Aucun type de données correspondant aux objets ou persos présent sur cette case

les tables perso: id_perso, (...), id_case
L'id de la case (ou ses coordonnées) seront stocké dans les propriétés du personnage. C'est une info propre au perso, pas à la case. Un perso ne pouvant être que sur une case à la fois mais une case pouvant contenir plusieurs perso...

Tu fais de même pour ta table mob et tous les autres. Le niveau de vie devant être indiquer dans la table respective de l'objet. Pas du tout dans map.


Voila, ce ne reste que mon avis. Je me ferais peut être contredire par d'autre.
N'esite pas si tu as des questions.


--------------------
PMEmail PosterUsers Website
Top
Feadin
Ecrit le : Vendredi 23 Novembre 2007 à 20h57
Quote Post


Newbie
*

Groupe : Membre
Messages : 5


oui, j'admets avoir tendance à écrire des romans quand je poste, je comprends que cela puisse dérouter un peu, désolé ^^'

tu es donc un peu du même avis que moi sur ce coup là ^^ (mais en un tout petit peu différent, c'est vrai qu'autant inclure la position du joueur directement dans ses propres infos plutôt que de faire un truc à part ^^')

Après, cette solution amène à une entrée dans la bdd/mob-objet plutôt qu'un global, mais après tout les creeps et le coffres ne sont pas faits pour rester en place et s'accumuler tongue.gif (d'autant qu'après une "réunion" aujourd'hui, nous avons opté pour un % de chance de pop au déplacement du joueur, ce qui devrait fortement limiter la population de bestioles en jeu ^^)

en tout cas, merci pour ta réponse smile.gif



PMEmail Poster
Top
Kalan
Ecrit le : Samedi 24 Novembre 2007 à 09h23
Quote Post


Ouf
*

Groupe : Membre
Messages : 566


La réponse de Manest est celle que j'aurais faite aussi. Il ne faut dénormaliser la structure de la base de données que pour des raisons précises et objectives pas dès la conception.

Pour assurer la souplesse et l'évolutivité de votre jeu, je me permettrais tout de même de définir une table "objet" qui contiendrait une information "type" (le type défini si c'est un perso, un "mob" etc...).

Ca n'est possible que si l'ensemble des objet ont l'essentiel de leurs caractéristiques communes.
Ensuite, au niveau programmation, tous les objets héritent d'une classe de base "Objet" et, dans le futur, si vous ajoutez de nouveaux types d'objet, l'impact sera mineur.


PS: au niveau des tables Map et Objet, faites tout de même attention avec l'ID. Dans ce cas, moi je ferais une PK multiple sur les coordonnées pour faciliter les recherches ultérieurement ou au moins ajouter un index sur X et Y dans la table objet


--------------------
Kalan de Vitall - Eternel roi de Scandinavie et d'Europe
Gloire et Pouvoir

user posted image
PMEmail PosterUsers Website
Top
the-gtm
Ecrit le : Samedi 24 Novembre 2007 à 12h59
Quote Post


Pro
*

Groupe : Membre
Messages : 130


Si l'argument pour stocker les données comme ça (l,50-d,100-m,10) c'est que ça prend moins de place, je ne suis pas trop sûr que ce soit le cas. Une chaine de caractère utilise en général 4 octets par caractère, ça monte donc beaucoup plus vite que des nombres entiers (4 octets pour un nombre qui peut aller de 0 à 4 milliards).
PMEmail Poster
Top
zumba
Ecrit le : Lundi 26 Novembre 2007 à 14h05
Quote Post


Ouf
*

Groupe : Membre
Messages : 496


axiome zumbien : une bdd tabulaire n'est pas conçue ni appropriée pour stocker une donnée matricielle.
pour stocker une map, rien ne vaut un bon vieux binaire, ça n'a que des avantages.
(cf un vieux post de moi sur le sujet)


--------------------
Z
PMEmail Poster
Top
Feadin
Ecrit le : Lundi 26 Novembre 2007 à 19h08
Quote Post


Newbie
*

Groupe : Membre
Messages : 5


merci pour vos réponses ^^

Cela devrait pas mal nous aiguiller. De toute façon, nous avons encore largement le temps de nous décider wink.gif

@zumba: c'est un point de vue qui se défend, mais personnellement ce n'est pas ma tasse de thé... pour l'instant wink.gif
mais à l'usage, s'il s'avère qu'après tests (parce qu'il faut toujours tester pour être sûr ^^) le stockage en fichier me simplifie la vie, je me convertirai peut-être ^^ (et je convertirai mes données par la même occasion tongue.gif)
PMEmail Poster
Top
Sybler
Ecrit le : Jeudi 29 Novembre 2007 à 00h10
Quote Post


Ouf
*

Groupe : Membre
Messages : 453


Ce n'est pas la position qui a (contient) un objet, mais l'objet qui a (contient) une position.

Simple souci de modélisation wink.gif


Et je trouve triste de voir que certains sont rendu avec le réflexe de commencer leurs messages avec des ... craintes face aux réponses.


--------------------
user posted image
PMEmail PosterUsers Website
Top
Feadin
Ecrit le : Jeudi 29 Novembre 2007 à 16h24
Quote Post


Newbie
*

Groupe : Membre
Messages : 5


voui Sybler tu as raison ^^
c'est important d'utiliser les bons termes pour concevoir les choses clairement, mea culpa wink.gif

hum, pour les craintes face aux réponses, ce n'est pas spécifique à ce forum (ni a aucun forum en général d'ailleurs), il s'agit uniquement de ma personnalité un peu spéciale sweatdrop.gif ... mais je me soigne laugh.gif
PMEmail Poster
Top
selenia
Ecrit le : Jeudi 17 Janvier 2008 à 14h16
Quote Post


Pro
*

Groupe : Membre
Messages : 163


QUOTE (the-gtm @ Samedi 24 Novembre 2007 11h59)
Si l'argument pour stocker les données comme ça (l,50-d,100-m,10) c'est que ça prend moins de place, je ne suis pas trop sûr que ce soit le cas. Une chaine de caractère utilise en général 4 octets par caractère, ça monte donc beaucoup plus vite que des nombres entiers (4 octets pour un nombre qui peut aller de 0 à 4 milliards).

Hum, juste pour savoir es-tu certains qu'un caractère prend 4o ?

Ce qui ferait 32bits par caractères OO ?

C'est juste pour savoir hein smile.gif si c'est la cas j'ai une drôle d'idée qui me trotte dans la tête ^^
PMEmail Poster
Top
Sybler
Ecrit le : Vendredi 18 Janvier 2008 à 05h23
Quote Post


Ouf
*

Groupe : Membre
Messages : 453


Et quelle est cette idée qui semble si farfelue qu'elle pique vivement ma curiosité ... ?


--------------------
user posted image
PMEmail PosterUsers Website
Top
naholyr
Ecrit le : Samedi 19 Janvier 2008 à 00h20
Quote Post


Ouf
*

Groupe : Membre
Messages : 423


1 caractère = 1 octet dans 99% des cas (le 1% restant étant le cas de chaines Unicode avec caractères spéciaux, données plutôt rares dans les bdd).
PMEmail PosterUsers WebsiteICQYahoo
Top
selenia
Ecrit le : Dimanche 20 Janvier 2008 à 17h26
Quote Post


Pro
*

Groupe : Membre
Messages : 163


Je serais déjà plus en accord avec naholyr !

sachant que dans la table ascii nous avons 127 caractère pour coder tout ca 8 bits suffisent ^^ => 1o

Et oubliez l'idée farfelue au passage biggrin.gif (il s'agirait d'une concaténation des 3 chiffres des indices de caractères dans la table ascii ce qui ferait qu'on pourrait stocker n'importe quelle chaine de caractère dans des champs numériques .. mais bon bref oubliez ça ai-je dit ohmy.gif)
PMEmail Poster
Top
Draedrus
Ecrit le : Mercredi 27 Février 2008 à 18h12
Quote Post


Ouf
*

Groupe : Membre
Messages : 212


Arf non je sors d'un cours d'archi avec des additions, multiplications et soustractions binaires avec des compléments à 1 etc... Y en a qui veulent ma mort ^^'.

QUOTE
Sybler: Ce n'est pas la position qui a (contient) un objet, mais l'objet qui a (contient) une position.

Si j'ai bien compris ( enfin j'espère je suis un peu fatigué ), je pense comme Sybler.
Si vous faites une table par map, et que vous voulez avoir 36 maps, bonjour l'angoisse !

Personelement j'ai une table qui contient mes cartes: id_carte,nom_carte
une autre qui contient tel type d'objets id_obj,type_obj....x_obj,y_obj,map_obj.
une autre encore avec 3 autres coordonnées etc...

Du coup je gère tout à coup de 3 tables, ça fait ptet plein d'éléments ( une fois j'ai atteint 500 éléments pour 4 maps de 11x11 cases mais bref, on s'en fous ).


--------------------
user posted image

- Un jeu de rôles avec... Un peu d'Humour, un peu de médieval-fantastique, un peu de stratégie, un peu de délire profond, un peu de désign bon enfant... :)
PMEmail PosterUsers Website
Top
« Sujets + anciens | Programmer | Sujets + récents »

Reply to this topicStart new topicStart Poll