2009-02-02 5 views
0

Я пытаюсь сделать игру, подобную тетрису, в XNA, и в настоящее время я думаю о том, каким способом было бы лучше справиться с ней.Перемещение объектов внутри массивов

Это то, что у меня есть: У меня есть класс Block, который имеет, например, текстуру и оттенок цвета.

Тогда я планировал иметь все в двойной массив, как:

Block[,] blocks = new Block[10,20]; 

, который затем будет полной сетки.

И тогда, когда блоки двигаться вниз, я думал сделать так:

blocks[x,y+1] = blocks[x,y]; 

blocks[x,y] = null; 

Сначала я подумал, что это хорошая идея, но теперь, когда я думал, что я не так конечно. Как это работает с памятью и т. Д.? Создает ли он новый объект каждый раз, когда я это делаю или что? Может кто-нибудь объяснить, как это работает, когда я перемещаю объект внутри массива?

Я действительно не ищу ответ на Тетрис, меня просто интересует, как это работает.

Спасибо.

ответ

2

Нет, вы просто перемещаете указатели. Когда вы говорите:

blocks[x,y+1] = blocks[x,y]; 

Что вы в основном делаете, это замена указателя. Объект будет находиться именно там, где он есть, но теперь вместо него он будет иметь индекс x, y он будет иметь индекс x, y + 1. Когда вы говорите

blocks[x,y] = null; 

там вы удаляете ссылку на объект х, у, и если ничего не держит ссылку, Мусор Collecter будет очищать его.

0

Если вы сохраняли типы значений (например, int, string) внутри вашего массива, вы бы действительно создали копию данных при каждом копировании значения, потому что типы значений неизменяемы в C#. Поскольку вы храните класс (который является ссылочным типом) в вашем массиве, ваш код действительно просто копирует указатель, а не весь объект.

1

Первый ответ выше, почти правильный, но назначение не заменяет указатель, оно дублирует его. После первой строки кода есть две ссылки на объект, изначально ссылающийся на блоки [x, y]. Нулевое присваивание удаляет исходную ссылку, но у вас все еще есть новая ссылка, живущая в блоках [x, y + 1]. Нуль, что один и объект кучи будут честной игрой для GC.

Смежные вопросы