2010-03-18 6 views
4

Je suis en train de créer un RPG en mosaïque 2D dans XNA et je suis dans la phase de conception initiale. Je pensais à la façon dont je voulais que mon moteur de carreaux fonctionne et j'ai fait un croquis. Fondamentalement, je veux une grille de tuiles, mais à chaque emplacement de tuiles, je veux être en mesure d'ajouter plus d'une tuile et avoir un décalage. J'aimerais cela afin que je puisse faire quelque chose comme ajouter des arbres individuels sur la carte du monde pour donner plus de flair. Ou mettre des bouteilles sur un bar dans une ville sans avoir à dessiner un tas de différents carreaux de bar avec des bouteilles différentes.Aide à la mise en œuvre de la conception de programmes C#: plusieurs tableaux de listes ou un meilleur moyen?

Mais peut-être que ma portée est plus grande que ma portée. Je suis allé à mettre en œuvre l'idée et avait quelque chose comme ça dans mon objet Carte:

List<Tile>[,] Grid; 

Mais alors j'ai pensé à ce sujet. Disons que j'avais une carte du monde de 200x200, qui serait en fait assez petite en ce qui concerne les RPG. Cela équivaudrait à 40 000 listes. À mon avis, je pense qu'il doit y avoir un meilleur moyen. Maintenant c'est une optimisation prématurée. Je ne sais pas si la façon dont j'arriverai à concevoir mes cartes et mon jeu sera capable de gérer cela, mais cela semble inutilement inefficace et quelque chose qui pourrait surgir si mon jeu devenait plus complexe. Une idée que j'ai est de rendre le décalage et les multiples tuiles facultatifs de sorte que je paye seulement pour eux en cas de besoin. Mais je ne suis pas sûr de savoir comment je ferais ça. Un tableau multiple d'objets?

object[,] Grid; 

Alors, voici mes critères:

  • Une grille 2D d'emplacements de tuiles
  • Chaque emplacement de la tuile a une tuile minimum de 1, mais peut éventuellement avoir plus
  • Chaque tuile supplémentaire peut éventuellement avoir un décalage x et y pour le placement précis

Quelqu'un peut-il aider avec quelques idées pour la mise en œuvre de tels un design (n'en a pas besoin fait pour moi, juste des idées) tout en gardant l'usage de la mémoire au minimum?

Si vous avez besoin de plus de fond est ici à peu près ce que mes objets Carte et tuile montant:

public struct Map 
{ 
    public Texture2D Texture; 
    public List<Rectangle> Sources; //Source Rectangles for where in Texture to get the sprite 
    public List<Tile>[,] Grid; 
} 
public struct Tile 
{ 
    public int Index; //Where in Sources to find the source Rectangle 
    public int X, Y; //Optional offsets 
} 
+0

Je veux voir votre jeu =] – Luiscencio

+1

Qu'en est-il un dictionnaire multi-entrée? quelque chose comme «Dictionnaire >' –

Répondre

4

Ce que vous pouvez faire est tout simplement avoir un tableau de Tile:

class Grid 
{ 
    Tile[,] grid; 
} 

... et ont cette Tile classe ont une List<Sprite> en elle:

class Tile 
{ 
    List<Sprite> sprites; 
} 

... et que Sprite classe aurait votre texture et décalage:

class Sprite 
{ 
    Vector2 offset; 
    Texture2D texture; 
} 

Finaliser un ll cela en ayant dessiner des méthodes:

class Grid 
{ 
    Tile[,] grid; 

    void Draw(GraphicsDevice graphics) 
    { 
     // call your tiles Draw() 
    } 


} 

class Tile 
{ 
    List<Sprite> sprites; 
    void Draw(GraphicsDevice graphics, int x, int y) 
    { 
     // call your sprites Draw() 
    } 
} 

class Sprite 
{ 
    Vector2 offset; 
    Texture2D texture; // or texture and rectangle, or whatever 

    void Draw(GraphicsDevice graphics, int x, int y) 
    { 
     // draw the sprite to graphics using x, y, offset and texture 
    } 
} 

Bien sûr, cela devient beaucoup plus compliqué que cela, mais vous devriez avoir l'idée.

Séparer toutes vos préoccupations dans différentes classes vous permet d'ajouter facilement de nouvelles fonctionnalités qui ne seront pas en conflit avec le code existant. Essayer d'écraser toutes vos données dans un seul objet tel que votre liste <Tile> [,] est de mauvaise forme et finira par vous mordre lorsque vous essayez de développer.

+0

Merci, vous m'a aidé à le voir sous un angle différent – Bob

1

Il semble que votre approche est source de confusion présentation avec le comportement. Si le comportement du jeu est basé sur une mosaïque, alors concevez pour cela fonctionnellement, puis codez une présentation comme le résultat de l'état du plateau.

1

Vous voulez essentiellement une matrice clairsemée pour représenter des "décorations" sur chaque tuile. Une matrice clairsemée est une structure matricielle dans laquelle tous les éléments n'ont pas besoin d'avoir une valeur. Il y a des bibliothèques C# là-bas qui les représentent. Une approche simple consisterait à utiliser un dictionnaire ordinaire où la clé est un numéro de mosaïque (numéro unique de chaque case) qui pourrait par exemple être calculé en utilisant le même type de formule utilisée pour adresser la mémoire vidéo: Y * MAXIMUM_X + X. Pour une tuile donnée, vérifiez s'il y a une entrée pour son numéro de tuile unique. Le dictionnaire devrait probablement contenir une liste de décorations pour cette tuile particulière:

Dictionary<int, List<Sprites>> spritesPerTile; 
// ... 
if (spritesPerTile.ContainsKey(tileNumber)) 
{ 
    List<Sprites> decorationsThisTile = spritesPerTile[tileNumber]; 
    // Proceed to render sprites on this tile. 
}