На этот вопрос сложно ответить - потому что есть много способов сделать это. И у каждого метода есть свои плюсы и минусы. Я просто дам обзор:
В качестве общего дизайна вам необходимо отслеживать: исходную текстуру, примененную «темноту» и примененную «прозрачность». Почти наверняка я могу сказать одно: вы хотите «накапливать» результаты взрывов где-то, а вы не хотите вести список всех взрывов, которые когда-либо происходили.
Итак, у вас есть поверхности для текстуры, темноты и прозрачности. Возможно, вы могли бы объединить тьму и прозрачность в одну поверхность с одним каналом, в котором хранятся «нормальный», «темный» (или уровень темноты) и «прозрачный».
Поскольку вы, вероятно, не хотите, чтобы темные кольца становились все темнее в местах их пересечения, когда вы применяете взрыв к слою тьмы с помощью функции max
(Math.Max
в C #).
Чтобы получить окончательную текстуру, вы можете просто написать текстуру темноты / прозрачности в исходную текстуру или ее копию (вам нужно только обновить область, к которой прикасается каждый взрыв).
Или вы можете использовать пиксельный шейдер для их объединения - детали которого выходят за рамки этого вопроса. (Также пиксельный шейдер не будет работать на XNA 4.0 на Windows Phone 7.)