2010-08-31 4 views
0

Je suis bloqué sur la création d'une architecture de classe pour ce faire:Accéder aux propriétés d'une classe de deux façons

J'ai beaucoup de types de bloc (environ 78). Le niveau du jeu est composé de ces blocs. Dans le ByteArray du niveau, il y a simplement des nombres, indiquant le type de bloc. Donc, pour la gestion des collisions, je peux simplement récupérer le nombre à la position voulue et obtenir les propriétés de ce bloc. (Solide, sélectionnable, visible, texture). MAIS. Je vais réorganiser cette liste de blocs, et ainsi, besoin également d'un moyen d'accéder aux propriétés d'un bloc par son nom.

Alors, je voudrais être en mesure d'accéder aux propriétés d'un bloc via

blocs [5] .PROPERTIES

&

Blocks.Rock.Properties

Soyez conscient que Ce ne sont pas des instances, et je ne devrais pas avoir à les instancier pour accéder à leurs propriétés.

+3

Quels sont-ils alors? –

+0

En d'autres termes, je ne devrais pas avoir à les instancier pour accéder à leurs propriétés. –

Répondre

1

Si vous voulez blocs [5] .PROPERTIES ainsi que Blocks.Rock.Properties, Les blocs doivent être une classe personnalisée avec un indexeur. La configuration est similaire à une opération:

public Block this[] (int index) 
{ 
    //getter logic here 
} 

indexeurs peuvent prendre des types ou des chaînes intégrées, vous pouvez donc utiliser des blocs pour envelopper une valeur de dictionnaire et d'accès par clé: Blocks["Rock"].Properties. Cela implique des «chaînes magiques», que le compilateur n'attrapera pas si vous avez mal orthographié.

Les getters nommés sont des propriétés en lecture seule simples:

public Block Rock { get{//getter logic here} } 

Si tel était ma demande, je créerais un singleton classe blocs. Les blocs font partie intégrante du jeu, utilisés tout au long de sa vie et vous ne voulez pas les instancier explicitement; définition d'un scénario singleton (et plus facile de passer à une instance de portée normale que si elle était statique). Cette classe Blocks enveloppait une collection d'objets Block, et cette implémentation est ensuite masquée derrière les accesseurs Blocks. Vous pouvez utiliser une liste et rechercher dans leurs propriétés en utilisant Linq (je suppose que les propriétés d'un bloc incluraient le BlockID ainsi que son nom), ou vous pouvez choisir l'index ou le nom d'un bloc comme clé d'un dictionnaire de Blocs Que voulez-vous dire par «ce ne sont pas des instances»?

+0

Pourriez-vous m'expliquer tout le dictionnaire? Je ne comprends pas ce que vous dites à propos du dictionnaire. –

+0

Un dictionnaire est une collection, comme une liste ou un tableau, mais ses objets sont des paires clé-valeur et vous pouvez extraire un élément de la collection en spécifiant une clé. La clé peut être n'importe quelle information d'identification que vous voulez pouvoir utiliser pour rechercher une valeur. Pensez-y comme un annuaire téléphonique; vous trouvez le numéro d'une personne en cherchant son nom.La plupart des implémentations de dictionnaire n'autorisent qu'une seule clé et ne supportent pas élégamment la récupération indépendante par index; Cependant, il est possible de le faire. – KeithS

0

Étant donné que différents types de blocs sont des entiers, vous pouvez utiliser un tableau associatif/dictionnaire/associatif.

Dictionary<string, int> BlockTypes = new Dictionary<string, int>(); 
BlockTypes["Rock"] = 1337; 
+0

Désolé pour une question mal comprise, mais le même concept s'applique avec Block au lieu de int comme valeur dans le dictionnaire. – Novikov

+0

Qu'en est-il des propriétés? Où sont-ils stockés/accédés? Cela explique simplement comment lister les choses avec des nombres. –