.NET: запись одного 2D-массива в другой

Было бы достаточно легко создать собственную систему для этого, но я полагаю, что в библиотеке .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

Мне бы хотелось иметь возможность просто дать каждому спрайту и тайлу свой собственный 2D-массив данных об обнаружении попаданий (определяющих, какие пиксели объекта сплошные, опасные и т. д.), которые можно напрямую записать в TiHD или SpHD с заданным смещением.

Готов поспорить, что в .NET есть класс, который может сделать это за меня.
Предположительно, мне нужно будет просто передать конструктору TiHD или SpHD, и тогда я смогу использовать объект для косвенного изменения объекта. массив с расширенной функциональностью (аналогично использованию объекта Graphics для изменения растрового изображения). Есть ли такой класс?


person Exp HP    schedule 07.09.2009    source источник


Ответы (2)


Пробовали ли вы использовать Buffer.BlockCopy?

person Jon Skeet    schedule 07.09.2009
comment
Buffer.BlockCopy мог бы упростить задачу создания моей собственной системы для записи одного 2D-массива в другой, но есть две проблемы: мне все равно придется перебирать каждую строку, и даже тогда я не думаю, что это можно использовать на моем 2D массив. Мне пришлось бы использовать зубчатый массив, чтобы я мог вводить строку как массив. - person Exp HP; 08.09.2009
comment
Просто к вашему сведению, если вы когда-нибудь обнаружите, что скорость поиска вызывает проблему в ваших 2D-массивах, скорость поиска в неровном (или «рваном») массиве почти в два раза выше, чем при поиске в 2D-массиве, связанном с вызовом метода. - person Ed S.; 08.09.2009

Array.Copy работает (извините, это С#):

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-массив как один большой массив (размер1 X размер2), поэтому использование Array.Copy со смещением не работает так, как вам нужно. Вы правы, вам нужно использовать это или BlockCopy построчно.

Обновление 2: это полное предложение взлома (и, вероятно, более болезненное, чем простое написание собственного построчного кода Array.Copy или BlockCopy), но вместо использования 2D byte[,] массивы для хранения этой информации, вы можете просто использовать для этого фактические объекты Bitmap, где вы интерпретируете 32-битные значения каждого пикселя как ваше перечисление вместо того, чтобы использовать их как фактические цвета. Затем вы можете просто использовать Graphics.DrawImage для копирования меньших массивов в больший.

Вы даже можете заставить эти растровые изображения использовать Format4bppIndexed, исходя из теории (я не поддерживаю эту), что будет использоваться только 2 байта на пиксель вместо 4. Я понятия не имею, правда это или нет.

person MusiGenesis    schedule 07.09.2009
comment
Извините, но это не совсем подходит для этой цели, потому что там, где я его использую, массив назначения больше исходного массива. Поскольку строки в целевом массиве намного шире, чем в исходном массиве, он будет копировать в основном весь исходный массив поэлементно в одну непрерывную строку в целевом массиве, а не в аккуратный прямоугольник. - person Exp HP; 08.09.2009
comment
Ой, вы это уже отметили. Я действительно должен обновить страницу, прежде чем оставить комментарий. - person Exp HP; 08.09.2009
comment
@Exp HP: вы совершенно правы, я только что обновил свой ответ после тестирования этого сценария. Немного раздражает, что Array.Copy обрабатывает такие 2D-массивы. - person MusiGenesis; 08.09.2009