代码之家  ›  专栏  ›  技术社区  ›  Michael Buschmann

C#只读多维数组和波浪图

  •  0
  • Michael Buschmann  · 技术社区  · 10 年前

    我创建了一个平铺贴图类,它只包含获取或设置平铺的数据和方法。 现在我有一个问题,我想制作一个平铺贴图渲染器。 但我认为调用GetTile(int layerIndex,int x,int y)方法不是很快;迭代时会抛出平铺并绘制它们。 所以我想给出一种可能性,即获得包含所有数据的完整数组。 在本例中,tiledMapData。 但问题是,我希望有人不能更改数组的值,因为我希望生成用于更改物理平铺的事件。 我怎么能做到这一点。

    public class TiledMap
    {
        public int LayerCount
        {
            get;
            private set;
        }
        public int TileCountX
        {
            get;
            private set;
        }
        public int TileCountY
        {
            get;
            private set;
        }
        public int TotalTileCount
        {
            get;
            private set;
        }
    
        private int[,] tiledMapData;
    
    
        public TiledMap(int layerCount, int tileCountX, int tileCountY)
        {
            LayerCount = layerCount;
            TileCountX = tileCountX;
            TileCountY = tileCountY;
            TotalTileCount = TileCountX * TileCountY;
    
            tiledMapData = new int[LayerCount, TotalTileCount];
            for (int layerIndex = 0; layerIndex < TotalTileCount; layerIndex++)
            {
                for (int tileIndex = 0; tileIndex < TotalTileCount; tileIndex++)
                {
                    tiledMapData[layerIndex, tileIndex] = 0;
                }
            }
        }
    
    
        public int  GetTile(int layerIndex, int x, int y)
        {
            return tiledMapData[layerIndex, y * TileCountX + x];
        }
        public void SetTile(int layerIndex, int x, int y, int tileType)
        {
            tiledMapData[layerIndex, y * TileCountX + x] = tileType;
        }
    }
    

    一般来说,您将如何设计一个平铺100 x 100平铺16位图形和可销毁/可构建平铺,如何处理物理播放器交互等等。。。。? 也许有人知道好的教程(语言不重要)

    谢谢你帮助我:)

    1 回复  |  直到 10 年前
        1
  •  2
  •   ZoolWay    10 年前

    好吧,我不得不拒绝这个,当不直接使用长度时,它会产生不同的事件。

            const int countX = 100;
            const int countY = 100;
            const int countLayer = 5;
            TiledMap tm = new TiledMap(countLayer, countX, countY);
    
            const int testRuns = 10000;
    
            Console.WriteLine("Run 1, start");
            DateTime start1 = DateTime.Now;
            for (int test = 0; test < testRuns; test++)
            {
                for (int i = 0; i < countLayer; i++)
                {
                    for (int j = 0; j < countX; j++)
                    {
                        for (int k = 0; k < countY; k++)
                        {
                            int data = tm.GetTile(i, j, k);
                            data++;
                        }
                    }
                }
            }
            DateTime end1 = DateTime.Now;
            Console.WriteLine(String.Format("Run 1, time: {0}", end1-start1));
    
            Console.WriteLine("Run 2, start");
            DateTime start2 = DateTime.Now;
            for (int test = 0; test < testRuns; test++)
            {
                for (int i = 0; i < countLayer; i++)
                {
                    for (int j = 0; j < countX; j++)
                    {
                        for (int k = 0; k < countY; k++)
                        {
                            int data = tm.DirectArray[i, k*countX + j];
                            data++;
                        }
                    }
                }
            }
            DateTime end2 = DateTime.Now;
            Console.WriteLine(String.Format("Run 1, time: {0}", end2 - start2));
    
            Console.ReadLine();
    

    阵列访问变体的性能要好得多。仍然不确定当你使用某种 只读阵列 。所以一定要检查一下。