2013-03-21 3 views
0

Я уже давно использую XNA, и мне очень нравится использовать его интерфейс. Сейчас мы пытаемся создать систему «тумана войны». Мы делаем RTS, и мы в основном пытаемся скрыть карту. Единицы на карте имеют влияние и показывают, что происходит. Они показывают конкретную область на карте. Раньше мы использовали интерфейс на основе плитки, но мы были недовольны внешним видом. Вместо этого мы решили нарисовать черную маску на экране, а затем открыть прозрачный круг с помощью DrawUserPrimitives. Вот проблема: когда мы нарисуем черную маску на экране, а затем прозрачный круг, экран полностью черный. Изменение порядка не меняет ничего. Мы также пробовали каждый SpriteBatch BlendState, который мы можем найти.XNA Alpha Blending With Primitives and Sprites

НАШ ТЕКУЩИЙ МЕТОД: Прямо сейчас мы рисуем полную черную текстуру на экране, а затем рисуем прозрачный круг. Результат - полностью черный экран.

НАШЕГО ЖЕЛАЕМОГО РЕЗУЛЬТАТА: Рисование круга покажет часть экрана, но остальное останется скрытым. Мы могли бы нарисовать несколько кругов, все с их собственным радиусом, которые могли бы быть рядом друг с другом, не вызывая проблем.

В принципе, мы пытаемся нарисовать черную маску, но обнаруживаем части экрана. Мы не можем просто сделать текстуру круга и сделать края прозрачными, потому что мы пытаемся сделать центр круга прозрачным. Мы не можем сделать центр прозрачным, потому что тогда, когда две такие текстуры будут рядом друг с другом, их границы появятся. Как я могу сделать маску, а затем открыть ее?

С уважением

Ares

ответ

1

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

В качестве альтернативы, используя только одну цель рендеринга, обычно рисуйте графику, затем очищайте альфа-канал (путем рисования прямоугольника по всему экрану с помощью ColorWriteChannels = Alpha и alpha blend факторов как 0), затем нарисуйте видимую область с помощью ColorWriteChannels = Только альфа.

+0

Большое спасибо! Я бы поднял вас, но я не могу этого сделать, пока у меня не будет 15 репутации :) – Ares513