2012-12-15 8 views
1

Je voudrais récupérer les données par nom, identifiant (ID objet aléatoire) ou type.
C# a un dictionnaire.
mais il devrait être pur c/C++ ... pas quelque chose comme Sqlite ou quoi que ce soit dotnet.Gestion dynamique des données pour les jeux en C++

pSysBuffer = new D3DCOLOR[ winSizeX * winSizeY ]; // 3rd directx buffer 
    // all my 2d stuf gets rendered here 


    struct WorldInventory 
    { 
     Gameobject gameobject; 
     // more properties 
    } worldinventory[ winSizeX * winSizeY ]; 

    struct Gameobject 
    { 
     int[] x, y; 
     unsigned int id; 
     Wall* wall; 
     Enemy* enemy; 
     Bullit bullit; 
     Mine mine; 
     // more properties 
    } gameobject; 

La structure de GameObject est-elle une bonne conception? il peut s'agir d'un mur, d'un ennemi, d'un bullit ou autre chose et peut couvrir plusieurs coordonnées x, y.
Je ne veux pas utiliser un vecteur, deque ... car il change à peu près tous les cadres ...
comment garder une collection de GameObjects qui change ... mais il ne doit pas être lié à double ... Je suppose.
ma technique est précise au pixel et pas à base de mosaïque ou de vecteur mathématique.
Je veux réaliser ... quelque chose comme ... une base de données interne pour la collission d'objets et d'autres choses.
1 objet ie: pourrait interroger et demander si les coordonnées sont occupées et éviter de boucler le tableau.
cela me tenir occupé pendant un certain temps

vous remercie à l'avance

+0

Vous dites que vous voulez interroger sans boucle à travers la collection, mais en substance qui est juste ce qu'une requête est. La collection peut être triée ou partitionnée de manière à ce que la requête ait besoin de moins d'éléments qu'une recherche linéaire, mais il s'agit toujours d'une recherche. –

+0

peut-être que je devrais avoir un tableau de chaînes "id" en synchronisation avec le tableau struct et boucle le tableau de poids léger pour trouver l'objet lourd rapidement ... je ne sais pas c'est ma question – NaturalDemon

Répondre

0

Si vous envisagez de faire des recherches en fonction des coordonnées, vous pouvez indexer le tableau en fonction de ceux-ci et le tri en utilisant diviser & Conquer, qui devrait fournir une méthode de tri et de recherche rapide. Par exemple, si vous avez un maximum de 1000x1000 coordonnées, vous pouvez convertir ce nombre en un seul entier comme celui-ci 10001000. 64x33 deviendrait 640033. C'est un peu brut, mais cela devrait fonctionner. Tant que le tableau que vous triez avec D & C est bien randomisé, vous devriez recevoir de bonnes performances.

Ex. d'un tableau trié

 9720922 
    8500088 
     7770951 
5300033 
     450750 
    3500112 
     1200015 
      750099 

Dans cet exemple, si vous renseignez ce qui se passe avec coordonnées 64x33, vous comparer avec 640033 5300033 puis déplacez vers 3500112 puis vers 1.200.015 thne 750099. Ensuite, vous rendrez compte qu'il n'y a pas d'autres entrées afin que vous puissiez placer un pointeur sur cet objet dans object_750099.lower.

La structure de l'objet nécessiterait plus d'éléments.

GameObject struct { 
    ... 
    int greater; 
    int lower; 
} 

J'espère que vous comprenez ce que j'essaie de dire parce que je l'explique vraiment mal.

+0

en effet ... je l'ai déjà vu ... je vais essayer ... et rendre compte – NaturalDemon

0

Désolé, ce n'est pas exactement réponse directe à votre question parce que
bien je pense que vous plus penser ce que à ce sujet (travail pour moi tout le temps):

1.objets jeu

  • créer une liste d'ENUM de tous les GO (objet de jeu) types

    enum _go_type_enum 
    { 
    _go_type_none=0, 
    _go_type_wall, 
    _go_type_mine, 
    _go_type_tree, 
    _go_type_hole, 
    _go_type_roadNS, 
    _go_type_roadWE, 
    ... 
    _go_type_enum_end 
    }; 
    
  • créer la classe/struct pour chaque GO Type

  • figurent notamment la grille des données spécifiques (même les points de la classe peuvent avoir des valeurs différentes) comme:
  • points de vie, trous de balle, taches de sang, oxydation de souffle, orientation pour les objets tournants ...
  • et n'oubliez pas d'inclure le monde x, y !!!

2.GO stockage de données

  • créer des listes dynamiques de tous les GO types comme ceci:

    List<GO_class1> go1; 
    List<GO_class2> go2; 
    List<GO_class3> go3; 
    List<GO_class4> go4; 
    ... 
    
  • ou utiliser des tableaux statiques à la place (avec assez grand max)

    //   array  used GOs 
    GO_class1 go1[max]; int go1num=0; 
    GO_class2 go2[max]; int go2num=0; 
    GO_class3 go3[max]; int go3num=0; 
    GO_class4 go4[max]; int go4num=0; 
    ... 
    
  • créer la carte du monde

    int world_tp[winSizeX*winSizeY]; // _go_type_enum 
    int world_ix[winSizeX*winSizeY]; // index inside go?[]; 
    
  • quelconque GO est défini comme tp, IX

  • par exemple tp = _go_type_wall; ix = 5; signifie aller? [ix]
  • où aller? est le nom du tableau pour les murs classe

Maintenant, quand vous devez traverser les murs que la boucle juste à travers le tableau mural
si vous avez besoin de voir le regard de la zone voisine de wolrd (tp, ix) []
Je pense que c'est beaucoup mieux et plus vite qu'un moteur de recherche de classe/recherche/requête.
Vous utilisez également beaucoup moins de mémoire (si les listes dynamiques sont utilisées) car les classes GO contiennent uniquement des données spécifiques à la classe.
Pour la classe universelle GO, il contient toutes les données pour toutes les classes, ce qui constitue un gaspillage de mémoire et ralentit également le traitement.

Hope it helps