Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1699 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Résolu] MMORPG en java

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] MMORPG en java

n°1453000
milootoolo​o
Posté le 05-10-2006 à 18:24:15  profilanswer
 

Bonjour,
 
Je developpe un MMORPG en java (un jeu en reseau quoi).
 
J'ai une question dont j'aimerais bien vous faire part car je commence à serieusement faire chauffer me neuronnes en ce qui concerne le stockage des objets du jeu. J'ai décidé de les stocker en mémoire vive et pas dans une base de donnée.
 
En fait, pour stocker ces objets (qui sont autant des personnages que des batiments ou des pieces de batiment) que j'apellerais Item, j'ai d'abord prit le parti que certains objets qui peuvent en contenir d'autres seront marqués ItemContainer et implémenteront des méthodes d'ajout et de retrait.
Il me faut souvent acceder au conteneur parent d'un objet et donc chaque objet contient une référence sur son conteneur parent du type ItemContainer.
 
Je transfère mes objets en les sérialisant, donc à l'arrivée chez le client, ce lien sur le conteneur parent n'est plus valable (les objets ont d'autres références).
Pour pallier à ce problème, j'ai utilisé une fonction qui recherche le bon conteneur (en comparant l'ID de l'Item) à chaque fois que j'ai un nouvel objet.
 
Ce systeme me pose beaucoup de problèmes, j'ai des erreurs de synchronisation inextricables, et j'ai pensé à autre chose.
 
Pourquoi ne pas me servir d'une table de hashage ou les ID des Items seraient les clefs et les Items les objets dans la table.
Ca résoud completement mes problèmes des parents parce que je référence des IDs.
 
Seulement, je commence à implémenter ce systeme, en faisant en sorte que tout mes objets et conteneurs d'objets soient dans la meme table et facilement repêchables par leur ID, mais le problème qui se pose, c'est que je dois souvent repérer ces objets par leur position (leur position dans le monde, dans le jeu), et énumérer cette liste à chaque fois pour retrouver un ensemble d'Items bien positionnés peut finir par être énorme.
 
Par exemple pour trouver les personnes dans un certain rectangle:
 

Code :
  1. public VisibleItems getVisiblesItemsOf(Personnage per){
  2.                 //Container pour l'ensemble des Items visibles
  3.  VisibleItems visibleItems=new VisibleItems();
  4.                 //Pour manipuler la position du personnage facilement
  5.  Position p=per.position;
  6.                 //On détermine les bords
  7.  int minX=p.x-per.getParentItem(this).getClientNombreCaseX()/2;
  8.  int minY=p.y-per.getParentItem(this).getClientNombreCaseY()/2;
  9.  int maxX=p.x+per.getParentItem(this).getClientNombreCaseX()/2;
  10.  int maxY=p.y+per.getParentItem(this).getClientNombreCaseY()/2;
  11.  //On récupère l'itérateur sur la Hashtable  
  12.                 //(qui pourra itérer sur des 10 aines de milliers d'éléments c'est pas bien)
  13.                 Iterator<Item> i = items.iterator();
  14.                 //On itère et on teste tout un tas de conditions pour ajouter l'objet
  15.  while(i.hasNext()){
  16.   Item item=i.next();
  17.   if(!item.equals(per))
  18.    if(item.position.x>=minX && item.position.x<=maxX)
  19.     if(item.position.y>=minY && item.position.y<=maxY)
  20.      if(item.getParentItem(this).equals(per.getParentItem(this)))
  21.       visibleItems.items.add(item);
  22.  }
  23.  return visibleItems;
  24. }


 
 
Alors voila, je commence à m'étouffer quand je pense que je suis bêtement en train de réinventer la base de données.
 
Donc mes questions après ce court état des lieux sont:
-n'y a t'il pas moyen d'utiliser des structures avec des clefs multiples? (clef Id, Clef Position, Objet Item)?
-suis-je vraiment obligé d'utiliser une base de donnée?
-que pensez vous qu'il soit le mieux entre séparer les conteneurs et tout mettre dans le même?
 
Voila, merci de votre lecture et de vos réponses.


Message édité par milootooloo le 06-10-2006 à 07:16:23
mood
Publicité
Posté le 05-10-2006 à 18:24:15  profilanswer
 

n°1453023
flo850
moi je
Posté le 05-10-2006 à 18:51:06  profilanswer
 

1- tu peux concaténer tes 3 clefs en une seule  
2- il y a toujours moyen d'eviter les BDD , mais honnetement, les BDD ont ete inventé pour rendre service, s'en priver
3- je sais pas

n°1453031
milootoolo​o
Posté le 05-10-2006 à 19:16:39  profilanswer
 

flo850 a écrit :

1- tu peux concaténer tes 3 clefs en une seule  
2- il y a toujours moyen d'eviter les BDD , mais honnetement, les BDD ont ete inventé pour rendre service, s'en priver
3- je sais pas


 
 
Pour concatener les clef ca marche pas parce que je veux pouvoir retrouver vite un objet dont je n'ai que la position et pas l'id.
Elles doivent etres séparées, c'est comme si je croisait deux hashtable avec le meme set d'objets.
 
En fait pour ceux que ca interesse, j'ai trouvé ma solution:
 
Je créé un conteneur spécial qui etend la hashtable, et quand j'ajoute un objet, je retient dans quelle zone il est. Une zone est un rectangle.
Les zones se superposent. Chaque position correspond donc à deux zones au maximum.
 
Voila, merci pour vos tentatives d'aide. Comme quoi ca sert de dormir.


Message édité par milootooloo le 06-10-2006 à 07:16:05

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Résolu] MMORPG en java

 

Sujets relatifs
passage variables de java a flashclient SFTP en java
control d'edition ...[RESOLU] Header() en php
[PHP] [Résolu]Pb apostrophe sous windows et pas sous linux[RESOLU] ungetc: propre ou pas...
Code retour Java sous Unix[Resolu] Requete tableau croisé
[Resolu] Envoi de plusieurs trames sans attendre l'ACK[résolu] Supprimer toutes les lignes d'une feuille
Plus de sujets relatifs à : [Résolu] MMORPG en java


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR