JeuWeb - Crée ton jeu par navigateur
Création de map par l'utilisateur - 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 : Création de map par l'utilisateur (/showthread.php?tid=4139)

Pages : 1 2


Création de map par l'utilisateur - kilhom - 29-06-2009

Bonjour à tous !

Alors voilà le topo: J'aimerais que mes joueurs puissent créer des map (cartes) sur le jeu. (50x50 max, pas de très grandes map donc).

Pour le moment je suis partie pour tout stocker dans la base de données.
La map en elle-même est stockée sous cette forme :

Code :
*1*0*0*0*0*0*0*1*1*2*0*0*0*0*0

Petite explication :
*0= de l'herbe
*1= un arbre
*2= une maison

Donc là, on affiche un arbre, de l'herbe, de l'herbe et encore de l'herbe
retour à la ligne, encore de l'herbe , deux arbres, une maison, etc....


Ma grande question est la suivante : Est-ce vraiment la meilleure solution ( Dois je utiliser un système alternatif ? ) sachant qu'il y aura pas mal de map ?

Je pensais éventuellement me tourner vers le XML même si je ne l'ai jamais vraiment utilisé...


Voilà voilà, et merci de m'avoir lu ! Smile


RE: Création de map par l'utilisateur - Zamentur - 29-06-2009

Bon déjà je suis pas fan du format de stockage car il ne contient pas une seul information, mais bien plusieurs.

Ceci dit çà depend vraiment de plein de chose, pour répondre à çà je pense qu'on a besoin de savoir:
- la façon d'afficher les cartes (html, image, flash...)
- les actions possibles sur cette map, faudra t'il etre capable de verifier si on est sur de l'herbe etc...
- un nombre de carte (est ce que c'est 1 par joueur actif, 10,20,1000)

Et le plus important est ce que les questions précédentes sont ammené à changer avec une future évolution du jeu.

Sans ces infos je dirais qu'il faut enregistrer case par case dans une table de bdd. En prenant en compte que l'on peux aller jusqu'à 1 million d'enregistrements (fait des tests au pire) sans trop de soucis, mais qu'ensuite il faudra se poser des questions


RE: Création de map par l'utilisateur - Sephi-Chan - 29-06-2009

Tout dépend de tes besoins.

Il faut que tu décrives un peu plus la problématique : combien de joueurs jouerons sur cette carte ? Sera-t-elle instanciée (c'est le cas si elle est utilisée dans plusieurs parties, par exemple) ? La carte est-elle modifiable par les utilisateurs pendant la partie ?

Rien que ces quelques questions sont déterminantes : car ça permet de savoir si la carte pourra être mise en cache une fois crée, et par conséquent si tu peux utiliser une table map et une table tiles (avec une map qui possède plusieurs tiles), ce qui rend la carte bien plus simple à modifier.

Enfin, comme tu peux le voir : il nous faut des détails. Smile


Sephi-Chan


RE: Création de map par l'utilisateur - kilhom - 29-06-2009

Erf, désolés, je n'ai pas assez détaillé mon problème !
Merci de me rappeler à l'ordre Smile

Alors :
- la façon d'afficher les cartes (html, image, flash...)
Du bon vieux html.

- les actions possibles sur cette map, faudra t'il etre capable de verifier si on est sur de l'herbe etc...
Oui en effet il faut être capable de vérifier des actions par rapport à la case.

- un nombre de carte (est ce que c'est 1 par joueur actif, 10,20,1000)
Je table sur 10-20 cartes par joueur actif.

Et le plus important est ce que les questions précédentes sont ammené à changer avec une future évolution du jeu.
Pour la première et la deuxième : non
pour la dernière il est possible d'augmenter le nombre maximal de cartes autorisées par joueurs mais jamais plus de 30 (sauf cas extrême ).

combien de joueurs jouerons sur cette carte ?
De 1 à 20 joueurs max.

Sera-t-elle instanciée (c'est le cas si elle est utilisée dans plusieurs parties, par exemple) ?
Oui très bonne question, en effet elle sera instanciée et éventuellement utilisée dans plusieurs parties.

La carte est-elle modifiable par les utilisateurs pendant la partie ?
Alors la carte de base en elle-même non.
Quand la partie est finie, aucune modification définitive n'a été faite sur la carte.
Par contre durant la partie des modifications temporaires (qui ne sont en relation qu'avec l'instance en cours) peuvent être faites.
Par exemple: On à une carte avec un arbre.
Deux parties de cette carte en cours (La partie A et la partie B)
Un joueur coupe l'arbre sur la partie A.
La map de la partie A est modifiée, pas celle de la partie B.
Si on crée une partie C, l'arbre ne sera pas coupé.


J'espère avoir été clair ! Merci infiniment de votre aide rapide et très juste !
@ bientôt !


RE: Création de map par l'utilisateur - Sephi-Chan - 29-06-2009

Donc si tu utilises des cartes instanciées, il est probablement plus intéressant pour toi d'utiliser une base de données : ça te permettra d'utiliser des associations riches : des tables de jointure qui peuvent stocker l'état d'une ressource sur la carte (comme l'arbre coupé) ou même l'ajout de ressources (tel joueur a planté un arbre).

Je ne trouve pas d'intérêt majeur à utiliser des documents XML puisque c'est moins pratique à manipuler/modifier, à moins peut-être de bien maîtriser XPath et encore… Ça reste chiant pour l'écriture.

La chaîne de caractère me semble le pire choix puisqu'au final, elle requiert beaucoup de traitement pour la moindre petite opération.


Sephi-Chan


RE: Création de map par l'utilisateur - Ter Rowan - 29-06-2009

(29-06-2009, 02:01 PM)Zamentur a écrit : En prenant en compte que l'on peux aller jusqu'à 1 million d'enregistrements (fait des tests au pire) sans trop de soucis, mais qu'ensuite il faudra se poser des questions

j'ai été interpelé par ce point Smile

Et si plus d'un million, on fait comment ? passage a autre chose que bdd (texte, xml, etc...) ou éclatement en plusieurs tables suivant une distribution pertinente (fonction du jeu)


d'ailleurs on sera a plus d'un million pour ce jeu si il a vraiment du succes

50*50*20*nb joueurs


RE: Création de map par l'utilisateur - kilhom - 29-06-2009

(29-06-2009, 02:24 PM)Sephi-Chan a écrit : La chaîne de caractère me semble le pire choix puisqu'au final, elle requiert beaucoup de traitement pour la moindre petite opération.

D'accord mais alors du coup je fait comment ?

Si je fait tout par plusieurs lignes dans la base de données... je vais me retrouver avec énormément de lignes, n'est ce pas une solution qui va très vite surcharger le serveur ?

Merci encore de ta réponse Sephi-Chan !


RE: Création de map par l'utilisateur - Sephi-Chan - 29-06-2009

Bien sûr, tu auras beaucoup de lignes, mais le bon côté des choses, c'est que comme tu n'agis pas directement sur les cases pendant la partie, tu peux mettre en cache la plupart des données (sous forme d'un tableau d'objet Tile sérialisé, par exemple).

Donc au final, les performances ne sont pas forcément un problème.

Cela dit, j'ai réfléchis 5 minutes à ton problème… Puis j'ai fais autre chose.
Plus sérieusement, je pense à une alternative à base de superposition de caractères ASCII. J'illustre ce que je dis puis j'explique :

Code :
Illustration du principe

Le calque qui représente la "vraie" carte.

#########   /**
## x#####    * Les espaces représentent le sol, dégagé ;
##__#####    * Les # représentent des murs ;
##  #####    * Le x représente un coffre ;
##           * Les _ représentent des portes ;
#########    */


Un calque qui représente l'état des objets dans cette instance.

000000000   /**
000100000    * Le A représente un joueur ;
002200000    * Le 0 représente un état inerte de l'objet ;
000000000    * Les 1, 2 et 3 représentent des états particuliers d'un objet ;
000000300    *
000000000    */


Un autre calque qui positionne les personnages.

---------   /**
---------    * Le A et le B représentent des joueurs ;
--B------    * Le - représente le vide, c'est juste pour ne pas mettre d'espaces :p ;
---------    *
-----A---    *
---------    */

L'idée est donc d'avoir plusieurs calques : l'un représentant la carte (10 unités de large sur 6 de haut dans l'exemple) et les autres des masques indiquant respectivement l'état des objets et la position des joueurs.

En superposant ces calques, on peut déterminer l'état des objets. Ainsi, quand un chiffre superpose un objet, cela indique l'état de cet objet : 0 étant l'état inerte, et les autres états sont spécifiques à l'objet auxquels ils s'appliquent.

Ainsi, l'était 1 d'un coffre peut être l'état ouvert. Le 2 peut être l'était verrouillé.
Concernant les portes, le 1 symbolise l'ouverture (en supposant que l'état inerte d'une porte est l'état fermé), le 2 symbolise verrouillé et le 3 symbolise cassé.
Pour le sol, le 1 pourrait être l'état glissant, le 2 pourrait être bruyant et le 3 pourrait être un piège explosif.

A priori, chaque case ne pourrait avoir qu'un état, mais on peut compenser cette lacune en superposant autant de calque qu'on le souhaite.


Sephi-Chan


RE: Création de map par l'utilisateur - kilhom - 29-06-2009

Désolés mais je ne vois absolument pas comment ton idée se traduis en code o_o.
Et puis ça ne correspond pas vraiment à ce que je désire faire car dans mon jeu les joueurs peuvent aussi définir le type de palette qu'ils désirent utiliser et créer leurs propres actions (coffre, mine explosif, etc...).
Bref pas assez modulable à mon goût en somme.

Du coup je pense rester sur mon système de stockage par "champ"....


RE: Création de map par l'utilisateur - Holy - 29-06-2009

Y a pleins de solutions pour stocker une map. Et y en a une à laquelle vous n'avez pas pensé et qui est pourtant super pratique je trouve, la sérialisation de tableau.

Après, tout dépend de l'interface. Mais si tu comptes créer une interface en ligne, les tableaux multidimensionnel en PHP, c'est parfait. Avec un petit coup d'ajax, ça va tout seul. J'pourrais montrer l'interface que j'utilise si vous voulez.

Bête exemple de sérialisation "dans le code":
Code PHP :
<?php

$MAP
[0][0]['floor'] = 1;
$MAP[0][0]['object'] = 1;
$MAP[0][0]['building'] = 'stable';

file_put_contents('./map', serialize($MAP));

?>
Une fois que c'est dans le fichier, il suffit de déplier la carte, la copier coller pour les différentes parties (énorme avantage par rapport à la BDD puisque le traitement est "décentralisé" dans chaque fichier).

Le principal avantage que j'y vois, pour le traitement, c'est plus léger qu'une base de données, surtout si elle doit prévoir les "modifications ponctuelles".

En plus, vous pouvez cumuler les tableaux ($MAP, $OBJECT, $PERSO) pour spécialiser d'autant plus les cartes (comme dans une BDD en somme).