Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Управление экраном   Найти похожие ветки 

 
Masacre   (2004-11-05 06:31) [0]

Доброго времени суток всем!

У меня такой вопрос, как програмно увеличить яркость в определенной области экрана. Приведу пример:
В псевдо-изометрической РПГ, имеется комната, освещения в ней нет (тобишь факелы на стенах не горят), нужно еменьшить яркость экрана, чтобы независимо от наложенных на пол и стены текстур казалось, что в комнате на самом деле темно.
Затем в комнате зажигаются факелы, и нужно теперь увеличить яркость экрана, чтобы комната оказалась освещенной.
   Как вот такое в Delphi реализовать...


 
NikeOLD ©   (2004-11-05 09:00) [1]


> В псевдо-изометрической РПГ,

Это как? Бывают псевдо-трехмерные, а псевдо-изометрических не припоминаю.... Лирика

То что требуется невыполнимо, я имею ввиду яркость ЭКРАНА. Способы реализации различны в зависимости от того, что используется DirectDraw, Direct3D, OpenGL и т.д.
Под чем пишешь?
В D3D и OpenGL можно просто источник света в комнату поместить. В первом же случае - все будет зависеть от режима. В палитровом - можно увеличить интенсивности цветовых составляющих палитры, в других - либо подмена текстур (что накладно), либо, например, используя альфа-блендинг стне комнаты с прямоугольником требуемой прозрачности для освещенных участков.


 
Masacre   (2004-11-09 11:38) [2]

Не я в DELPHIX делаю... Там ничего кроме DirectDraw заюзать нельзя, ты мне расскажи как с помощью DelphiX такое сделать...


 
NikeOLD ©   (2004-11-09 12:05) [3]

Я с DelphiX не работаю, хотя... минутку...

Файл DirectX.pas - заголовочный файл для DirectDraw и всего остального барахла DelphiX. Так что ничего особенного, кроме классовой надстройки в DX я не вижу.

Теперь. В игре Diablo 1, например, использовалось несколько текстур различной яркости.
А пятно света вокруг героя... даоно увеличивалось, но получался не ровный круг, а рифленый. отсюда можно сделать вывод:
1. Берем требуемый радиус освещенности.
2. Находим все участки карты, попадающие в этот радиус.
3. Берем чистый белый квадрат (спрайт), соответствующий размеру одной клетке карты.
4. Рендерим белый квадрат поверх каждого участка, попадающего в радиус источника света. При этом, чем ближе квадрат к центру, тем ниже уровень Alpha (как он там в DX называется), чтобы спрайт карты светлел (но не абсолютный 0, иначе все белое будет); на концах радиуса прозрачнось практически максимальная (чтобы спрайт карты оставался темным).
5. Все, что я сказал в основном касается пола, а для стен см. п.6.
6. Для объектов, которые попадают в зону света... придется нарисовать более светлые текстуры. Кстати в Diablo 1, все персонажи всегда были освещены одинаково, а стены - меняли текстуры по мере необходимости.

Может кто что получше предложит.


 
Masacre   (2004-11-09 18:25) [4]

Гхы, а Альфа в DelphiX никакая, она зеленая всегда, в общем не подходит, такой способ, ты мне лучше расскажи как палитрой этой делать в DirectDraw...


 
RyDmi ©   (2004-11-09 21:38) [5]

Кстати на счёт "зелёной Альфы" это точно никак нельзя исправить? А то я тоже мучаюся со спрайтами. Может кто знает?


 
Masacre   (2004-11-10 04:57) [6]

Увы никак... Обыдно да:)

Я вот научился гамму менять, но этож ведь на все изображение на экране влияет, как на поле с игрой так и на ее интерфейс... Мне бы с палитрой разобраться, может кто-нить знает как палитрой управлять?


 
Megabyte-CeerCop ©   (2004-11-10 06:42) [7]


> Кстати на счёт "зелёной Альфы"

Что значит зелёная альфа!?
В DirectDraw есть ColorKey который может быть любого цвета.
Советую кстати делать его чёрным, т.к это единственный цвет который в любом формате RGB равен нулю, и по этому всегда вычисляется правильно. Если делать зелёным, на некоторых картах получится челёный квадрат вокруг всех Спрайтов!!! Сам видел! И очень удивился запустив свою игруху на одном несвежем компе. Хорошо что графики тогда ещё было не много, и я быстро переделал её под чёрный ColorKey

А на счёт освещения - в DelphiX единственый вариант - это сделать два типа текстур для комнаты: освещённые и не освещённые.
Есть спрайты которые поддерживают AlifaBlend, но они очень, очень медленные. Если FPS не важен, и картинка будет статичная, тогда можно использовать альфа бленд (последний не поддерживается DirectDraw и реализуется в DelphiX исключительно програмно, как и поворот спрайтов)!


 
NikeOLD ©   (2004-11-10 09:09) [8]

Для того, чтобы работать с палитрой, требуется режим 256 цветов(8 бит). Это единственный палитровый режим при котором пиксель на экране знает не свой собственный цвет, а ИНДЕКС цвета в палитре цветов Windows (она и содержит 256 значений массива, в которых, в свою очередь, записаны цветовые составляющие RGB).
Таким образом, при изменениие цвета в палитре по нужному индексу, ВСЕ пикселы на экране, которые ссылаются на этот индекс перекрашиваются.
Для работы с палитрами: SDK и структура PALETTEENTRY.

Есть одно неудобство первые 10 и последние 10 цветов зарезервированы в Windows и при некорректной работе будет беда.
Так что остается по большому счету 236 свободных элементов массива, или логические палитры LOGPALETTE.



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
3-1105884936
Piter
2005-01-16 17:15
2005.02.13
Упала база данных Firebird


1-1107270425
Gl
2005-02-01 18:07
2005.02.13
Как использовать процедуру из одного юнита в другом?


6-1101598415
Змей
2004-11-28 02:33
2005.02.13
поочередная вставка


3-1106040041
Russko
2005-01-18 12:20
2005.02.13
ComboBox и БД


14-1106320457
Aleksandr
2005-01-21 18:14
2005.02.13
Установка Win2000 Server