Hello!
J'ai parcouru ce site, et quelques autres, et je remet toute ma structure MAP actuelle en révision.
La petite histoire
Déjà, ma carte continent vient de maigrir drastiquement (7.500.000 cases => 48450).
A la base, la carte du continent permet de se déplacer rapidement entre villes, rien de plus. Chaque case est un lien vers une sous-carte.
Initialement prévues en 750*750, tuiles hexagonales.
Sur cette sous-carte, les actions, combats, recherche de matières premières (bois, pierres, plantes, etc...)
J'étais parti sur un truc lourd, pour limiter la place occupée en BDD, à savoir:
carte continent: X et Y stockées en smallint ( soit 4 octets pour repérer chaque case)... après réduction, je joue avec 2 octets par case. (deja ca de gagné (250*190 cases))
Pour la sous-carte, je ne pouvais stocker les 562 000 (* 7 500 000) cases en bdd). J'avais l'idée de générer ces sous-cartes à la demande (10 secs de freeze à l'accès initial)... pour ca, 9 carrés de 250 cases de coté... collés ensemble (en fonction des coordonnées x et y de la case continent), et hop, peuplage aléatoire suivant une table de rencontre.
1. sous-carte
Je revois ceci à la baisse actuellement, et je cherche une solution rapide, et souple pour y arriver.
Objectif: 50 à 75 cases de coté. (environ, pas plus petit, sinon, le coté "exploration" risque d'en prendre un coup... (genre: oh, j'avance de 20 cases, et j'ai fini le tour de ce gros coin de terre, merveilleux!))
Quelques infos sur la carte continent:
les cases mer: seront toutes les memes... de la flotte à perte de vue... c réglé.
les cases terre: arf, moins facile.
suivant le type de terrain, j'aimerais une sous-carte à thème différent (logique), mais faudrait pas que toutes les cases "foret" aient les memes arbres au meme endroit... ca fait un peu nul comme effet.
je pourrais stocker quelques sous-carte prédéfinies en bdd... et en prendre une "au hasard" (truqué, pour que ce soit tjs le meme qui sorte pour une X-Y continent donnée), ce qui me plait bien... mais je la load où?
en bdd? => ca risque d'encombrer la base, mais c'est le plus simple... (juste penser à libérer les ressources à l'occasion)
en fichier xml? => ouaip, a voir la rapidité de lecture, traitement, etc... (jamais testé réellement)... par contre, suivant la taille, ca prend plus ou moins de place... j'ai 1Go d'espace disque actuellement... faudrait que je vois la taille d'un fichier, pour voir. Ferai ca demain, si j'ai le temps.
autrement?
bref: première interrogation: comment gérer ces sous-cartes au niveau stockage selon vous?
-----------------------------------------------------------
2.pour la gestion des persos, etc.. en sous-carte.
table perso: pleins de champs, dont x / y / z sur la carte continent.
et pour relier le tout en évitant de reperdre mes anciens 4 octets, j'avais bidouillé un correspondance X/Y continent => ID_souscarte
et une table sous-carte ID/X/Y/Terrain
trois autres tables en plus:
mini_perso (ID_perso,ID_souscarte, X,Y, ...)
mini_monstre(ID_monstre,ID_souscarte, X, Y, ...)
mini_objets (ID, ID_souscarte, X, Y, ...)
pour gérer la position des persos, monstres et objets sur ces sous-cartes.
avec le recul, je me dis que je pourrais refusionner ces trois dernières tables en une seule, en rajoutant un champ "Type" enum (perso, monstre, objet).
d'autre part... ayant diminué le nombre de cases sur le continent... ne devrais-je pas leur donner à chaque un ID unique (0-50000, ca passe sur un smallint, si je me trompe pas...), et relier ca directement, sans passer par mes dernières tables citées? (bref, gérer au niveau de la table perso: ID_continent (l'ID de la case, plus besoin des coordonnées, je peux les retrouver par calcul simple), et X/Y pour la sous-carte? (et faire pareil pour les monstres, et les objets qui trainent).
En faisant ainsi, n'aurais-je pas des problèmes pour afficher la vue du continent? (un SELECT avec x between() et y between() plus facile que de chercher les ID des cases possibles? (niveau personnages .. niveau carte, j'ai tjs les X/Y en bdd))
Quoique: avec deux requetes: la premières me charge les tuiles en vue (ID, X, Y, Terrain)... je passe ca en tableau, je vire les doublons, et j'implode => liste des ID...
2e requete: SELECT .. form perso where ID_continent in (la liste)
[réflexion profonde]Bizarre, je réfléchi mieux en écrivant... j'avais jamais remarqué avec une feuille de papier... vive les forums!!![/réflexion profonde]
Bref: comment gérer au mieux la liaison entre les deux systèmes de carte? dans la table perso? une table à part? une autre idée?
---------------------------------------------------
3. les objets, etc...
Et oui, y a des objets qui tombent des cadavres, ou qui apparaissent tous seuls (les plantes...), ou que les PJ droppent de leur inventaire car trop chargés, etc...
En plus, ils doivent à terme pouvoir couper un arbre pour récupérer du bois, miner de la pierre, etc... bref: intéragir avec l'environnement.
Là aussi, je me demande comment gérer ca au mieux.
a priori, chaque objet peut etre ramassé... action de base.
le décor (arbre, rochers, ruisseau) devrait pouvoir offrir une action en adéquation (couper, tailler, pecher)...
une table action (ID, nom_action, lien_script), et mettre un champ "action possibles" sur les décors et objets, ca devrait etre le plus simple, non?
Au niveau du stockage (j'y reviens), mettre la liste d'actions possibles dans le ficher/bdd (bref: pour chaque tuile=> cet objet à telles actons possibles, bcp de doublons), ou seulement lier ca dans la table de référence, et donc:
fichier (pour faire court): x/y => décor arbre
=> accéder à la bdd, et aller voir table "décor"=> arbre... actions possibles=25,185,265. ( et donc, dans ce cas, je ne peux pas me passer de la bdd pour simplement afficher la sous-carte...)
et hop, ni vu ni connu, 3e truc à prévoir...
Où mettre les données d'actions possibles sur un objet/décor?
Bizarrement, je m'attends déjà aux réponses...
"ca dépend de ce que tu cherches: rapidité/simplicité/stockage réduit/autre..."
réponse: un bon équilibre entre tout.
Bon, sur ce, je vais dormir... la nuit porte conseil, y parait..
(message tapé, non relu)
PS: merci d'avoir lu ce gros pavé jusqu'au bout ^^
J'ai parcouru ce site, et quelques autres, et je remet toute ma structure MAP actuelle en révision.
La petite histoire
Déjà, ma carte continent vient de maigrir drastiquement (7.500.000 cases => 48450).
A la base, la carte du continent permet de se déplacer rapidement entre villes, rien de plus. Chaque case est un lien vers une sous-carte.
Initialement prévues en 750*750, tuiles hexagonales.
Sur cette sous-carte, les actions, combats, recherche de matières premières (bois, pierres, plantes, etc...)
J'étais parti sur un truc lourd, pour limiter la place occupée en BDD, à savoir:
carte continent: X et Y stockées en smallint ( soit 4 octets pour repérer chaque case)... après réduction, je joue avec 2 octets par case. (deja ca de gagné (250*190 cases))
Pour la sous-carte, je ne pouvais stocker les 562 000 (* 7 500 000) cases en bdd). J'avais l'idée de générer ces sous-cartes à la demande (10 secs de freeze à l'accès initial)... pour ca, 9 carrés de 250 cases de coté... collés ensemble (en fonction des coordonnées x et y de la case continent), et hop, peuplage aléatoire suivant une table de rencontre.
1. sous-carte
Je revois ceci à la baisse actuellement, et je cherche une solution rapide, et souple pour y arriver.
Objectif: 50 à 75 cases de coté. (environ, pas plus petit, sinon, le coté "exploration" risque d'en prendre un coup... (genre: oh, j'avance de 20 cases, et j'ai fini le tour de ce gros coin de terre, merveilleux!))
Quelques infos sur la carte continent:
- 26418 cases de "terre"
- 22032 cases de "mer"
les cases mer: seront toutes les memes... de la flotte à perte de vue... c réglé.
les cases terre: arf, moins facile.
suivant le type de terrain, j'aimerais une sous-carte à thème différent (logique), mais faudrait pas que toutes les cases "foret" aient les memes arbres au meme endroit... ca fait un peu nul comme effet.
je pourrais stocker quelques sous-carte prédéfinies en bdd... et en prendre une "au hasard" (truqué, pour que ce soit tjs le meme qui sorte pour une X-Y continent donnée), ce qui me plait bien... mais je la load où?
en bdd? => ca risque d'encombrer la base, mais c'est le plus simple... (juste penser à libérer les ressources à l'occasion)
en fichier xml? => ouaip, a voir la rapidité de lecture, traitement, etc... (jamais testé réellement)... par contre, suivant la taille, ca prend plus ou moins de place... j'ai 1Go d'espace disque actuellement... faudrait que je vois la taille d'un fichier, pour voir. Ferai ca demain, si j'ai le temps.
autrement?
bref: première interrogation: comment gérer ces sous-cartes au niveau stockage selon vous?
-----------------------------------------------------------
2.pour la gestion des persos, etc.. en sous-carte.
table perso: pleins de champs, dont x / y / z sur la carte continent.
et pour relier le tout en évitant de reperdre mes anciens 4 octets, j'avais bidouillé un correspondance X/Y continent => ID_souscarte
et une table sous-carte ID/X/Y/Terrain
trois autres tables en plus:
mini_perso (ID_perso,ID_souscarte, X,Y, ...)
mini_monstre(ID_monstre,ID_souscarte, X, Y, ...)
mini_objets (ID, ID_souscarte, X, Y, ...)
pour gérer la position des persos, monstres et objets sur ces sous-cartes.
avec le recul, je me dis que je pourrais refusionner ces trois dernières tables en une seule, en rajoutant un champ "Type" enum (perso, monstre, objet).
d'autre part... ayant diminué le nombre de cases sur le continent... ne devrais-je pas leur donner à chaque un ID unique (0-50000, ca passe sur un smallint, si je me trompe pas...), et relier ca directement, sans passer par mes dernières tables citées? (bref, gérer au niveau de la table perso: ID_continent (l'ID de la case, plus besoin des coordonnées, je peux les retrouver par calcul simple), et X/Y pour la sous-carte? (et faire pareil pour les monstres, et les objets qui trainent).
En faisant ainsi, n'aurais-je pas des problèmes pour afficher la vue du continent? (un SELECT avec x between() et y between() plus facile que de chercher les ID des cases possibles? (niveau personnages .. niveau carte, j'ai tjs les X/Y en bdd))
Quoique: avec deux requetes: la premières me charge les tuiles en vue (ID, X, Y, Terrain)... je passe ca en tableau, je vire les doublons, et j'implode => liste des ID...
2e requete: SELECT .. form perso where ID_continent in (la liste)
[réflexion profonde]Bizarre, je réfléchi mieux en écrivant... j'avais jamais remarqué avec une feuille de papier... vive les forums!!![/réflexion profonde]
Bref: comment gérer au mieux la liaison entre les deux systèmes de carte? dans la table perso? une table à part? une autre idée?
---------------------------------------------------
3. les objets, etc...
Et oui, y a des objets qui tombent des cadavres, ou qui apparaissent tous seuls (les plantes...), ou que les PJ droppent de leur inventaire car trop chargés, etc...
En plus, ils doivent à terme pouvoir couper un arbre pour récupérer du bois, miner de la pierre, etc... bref: intéragir avec l'environnement.
Là aussi, je me demande comment gérer ca au mieux.
a priori, chaque objet peut etre ramassé... action de base.
le décor (arbre, rochers, ruisseau) devrait pouvoir offrir une action en adéquation (couper, tailler, pecher)...
une table action (ID, nom_action, lien_script), et mettre un champ "action possibles" sur les décors et objets, ca devrait etre le plus simple, non?
Au niveau du stockage (j'y reviens), mettre la liste d'actions possibles dans le ficher/bdd (bref: pour chaque tuile=> cet objet à telles actons possibles, bcp de doublons), ou seulement lier ca dans la table de référence, et donc:
fichier (pour faire court): x/y => décor arbre
=> accéder à la bdd, et aller voir table "décor"=> arbre... actions possibles=25,185,265. ( et donc, dans ce cas, je ne peux pas me passer de la bdd pour simplement afficher la sous-carte...)
et hop, ni vu ni connu, 3e truc à prévoir...
Où mettre les données d'actions possibles sur un objet/décor?
Bizarrement, je m'attends déjà aux réponses...
"ca dépend de ce que tu cherches: rapidité/simplicité/stockage réduit/autre..."
réponse: un bon équilibre entre tout.
Bon, sur ce, je vais dormir... la nuit porte conseil, y parait..
(message tapé, non relu)
PS: merci d'avoir lu ce gros pavé jusqu'au bout ^^
attendez, je cherche...