Как пометить экземпляр для удаления в XNA/Monogame

В моей игре Tower Defense, которую я делаю, когда мои враги умирают, я хочу, чтобы они умерли, верно? Значит, мне нужно их удалить. Я перешел с C++, где вы можете просто удалить экземпляры класса с помощью delete MyInstance;, но это не работает в C#. Я знаю, что в C# есть сборщик мусора, который удаляет вещи за вас, но как пометить экземпляр для удаления? Благодарю вас!!!


person Detinator10    schedule 12.12.2013    source источник
comment
Ответ @Mariano хорош, за исключением того, что не забудьте прекратить обновлять и рисовать врага после того, как вы установите для него значение null, чтобы гарантировать отсутствие ошибок.   -  person Battle_Pasture    schedule 12.12.2013
comment
Спасибо за все ответы, ребята! они оба были хороши! Мне пришлось пойти с marianos, потому что я новичок, и мне просто нужен был простой ответ. Спасибо вам обоим!   -  person Detinator10    schedule 12.12.2013


Ответы (2)


Вы можете явно установить для объекта значение null, которое пометит его для сборки мусора.

Enemy e = new Enemy();

// do stuff with enemy

// Set to null
e = null;
person Mariano    schedule 12.12.2013
comment
Хотя этот ответ по существу правильный, он также бессмысленен, потому что, как только экземпляр выйдет за пределы области видимости, он все равно будет помечен для удаления. Я рекомендую НЕ заводить привычку делать это для удобочитаемости кода. - person craftworkgames; 12.12.2013

Моя рекомендация - не удалять их. Хотя у вас есть сборщик мусора, чтобы помочь, отказ от его использования часто может быть лучшим выбором с точки зрения производительности.

Подумайте о максимальном количестве врагов, которые у вас потенциально могут быть.

Создайте круговой буфер объектов Enemy: по сути, массив объектов Enemy и последний указатель.

Добавьте флаг «IsActive» к каждому врагу.

Если вы хотите создать нового врага, пройдите вперед по круговому буферу от последнего указателя, пока не найдете врага, для которого флаг IsActive установлен на false. Установите последний указатель на этого врага, придайте этому врагу тот тип, который вам нужен, и установите для его флага IsActive значение true.

Когда враг умирает, установите для его флага IsActive значение false.

В циклах Update и Draw вы просто перебираете буфер и либо действуете, либо рисуете каждого врага, для которого IsActive установлено в true.

person RomSteady    schedule 12.12.2013