2010-03-18 68 views
4

我在XNA中创建了基于2D瓦片的RPG,并且处于初始设计阶段。我在想如何让我的瓷砖引擎工作,并提出一个粗略的草图。基本上我想要一个瓷砖网格,但在每个瓷砖位置,我希望能够添加多个瓷砖并具有偏移量。我喜欢这样做,这样我就可以在世界地图上添加单独的树木来增加天赋。或者在一些城镇的酒吧里放置瓶子,而不必用不同的瓶子画出一堆不同的酒吧瓷砖。帮助C#程序设计实现:多列数组还是更好的方法?

但是也许我的触及范围比我的掌握要大。我去实现这个想法,并在我的Map对象中有这样的东西:

List<Tile>[,] Grid; 

但是后来我想到了。比方说,我有一张200x200的世界地图,就RPG游戏而言,它实际上会非常小。这将达到40,000个列表。在我看来,我认为必须有更好的方法。现在这是预先优化。我不知道我碰巧设计我的地图和游戏的方式是否能够处理这个问题,但它似乎是不必要的低效率,而且如果我的游戏变得更加复杂,可能会出现一些问题。

我的一个想法是使偏移量和多个贴片可选,以便我只在需要时付钱。但我不知道我该怎么做。多个对象的数组?

object[,] Grid; 

因此,这里是我的准则:

    瓦位置
  • 二维网格
  • 每瓦位置具有最小的1瓦,但可以有选择有更多的
  • 每个额外的瓷砖可以选择有一个X和Y偏移精确定位

任何人都可以帮助一些想法实现这样的一个设计(不需要它为我完成,只是想法),同时保持内存使用率最低?

如果你在这里需要更多的背景是大致也是我的地图和图块对象量:

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

我想看看你的游戏=] – Luiscencio 2010-03-18 19:15:54

+1

怎么样多的条目解释?类似于'Dictionary >' – 2010-03-18 19:16:57

回答

4

你可以做的是简单的有Tile数组:

class Grid 
{ 
    Tile[,] grid; 
} 

...并有Tile类有List<Sprite>它:

class Tile 
{ 
    List<Sprite> sprites; 
} 

...那雪碧类会有你的纹理和偏移量:

class Sprite 
{ 
    Vector2 offset; 
    Texture2D texture; 
} 

敲定LL由具有绘画方法:

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 
    } 
} 

当然它变得更加复杂,比不过你应该明白我的意思。在不同的班级

分离你所有的顾虑,让您轻松添加新的fonctionnality不会与现有代码冲突。尝试在单个对象中混合使用所有数据,例如列表<Tile> [,]是不好的形式,当您尝试展开时最终会咬你。

+0

谢谢,你帮助我从不同的角度看待它 – Bob 2010-03-18 19:49:24

1

好像你的做法是混淆演示与行为。如果游戏的行为是基于瓦片的,然后为其设计功能,然后根据电路板的状态对演示进行编码。

1

您基本上需要一个稀疏矩阵来表示每个图块上的“装饰”。稀疏矩阵是一种矩阵结构,并非所有元素都需要一个值。有代表他们的C#库。

一个简单的方法是使用一个普通字典,其中的密钥是一个Tile#(每个图块的唯一编号),例如可以使用用于解决视频内存相同类型的公式计算:Y * MAXIMUM_X +十,对于一个给定的瓷砖,只需检查是否有一个条目是唯一的瓷砖#。字典或许应该包含特定瓦装饰的列表:

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