.NET:将一个2D数组写入另一个

时间:2009-09-07 21:17:05

标签: .net vb.net multidimensional-array

为此制作我自己的系统会很容易,但我认为.NET库虽然规模庞大,但可能已经为此目的制作了一个类。

对于命中检测,我的VB.NET游戏使用两个2D数组来存储关卡中每个像素的状态。这些数组中的每个元素都是字节(或者更准确地说,是基于字节的标志枚举类型的值)。

Public TiHD(,) As HitDT ''//State of each pixel in the level based on
                        ''// its underlying tile.
Public SpHD(,) As HitDT ''//State of each pixel in the level based on
                        ''// sprite occupation.

<Flags> _
Public Enum HitDT As Byte
    Solid = 1
    Danger = 2
    Water = 4
    Healing = 8
    Restore = 16
    AreaExit = 32
End Enum

我很乐意能够给每个精灵&amp;平铺其自己的2D阵列命中检测数据(定义对象的哪些像素是实心的,危险的等),可以在指定的偏移处直接写入TiHD或SpHD。

我愿意打赌.NET有一个可以为我做这个的课程 据推测,我只需要将TiHD或SpHD传递给构造函数,然后我就可以使用该对象间接修改具有扩展功能的数组(类似于使用Graphics对象来修改Bitmap)。有没有这样的课程?

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用Buffer.BlockCopy

答案 1 :(得分:0)

Array.Copy有效(抱歉这是C#):

int[,] i1 = new int[10, 10];
int[,] i2 = new int[10, 10];
Array.Copy(i1, i2, i1.GetLength(0) * i1.GetLength(1));

更新:没关系,这不像我想象的那样有效。 Array.Copy显然将2D数组视为一个大的(dimension1 X dimension2)数组,因此使用带偏移量的Array.Copy不能像您需要的那样工作。你是对的,你需要逐行使用这个或BlockCopy。

更新2:这是一个完整的黑客建议(可能更多的是痛苦,而不仅仅是编写自己的逐行Array.Copy或BlockCopy代码),而不是使用2D字节[,]数组用于存储此信息,您可以使用实际的Bitmap对象,将每个像素的32位值解释为枚举,而不是将它们用作实际颜色。然后你可以使用Graphics.DrawImage将较小的数组复制到较大的数组中。

你甚至可以让这些位图使用Format4bppIndexed,理论上(我不是站在这个位置)它每个像素只使用2个字节而不是4个。我不知道这是不是真的。