Форум: "Игры";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизЗатухающий экран Найти похожие ветки
← →
MANGOL (2004-08-26 20:06) [0]Привет!
Люди! Подскажите, как в DirectDraw реализовать затухающий экран?
я делал через доступ к пикселам и залочивание поверхности, но скорость была просто безобразная. Можно даже сказать, что её вообще не было!
Вот шо я делал:
{режим 1024х768, 16 бит}Repeat
hRet := Buffer.Lock(nil, desc, DDLOCK_WAIT, 0);
if hRet=DD_OK then begin
for i:=0 to 1023 do begin
for j:=0 to 767 do begin
addr:=Cardinal(desc.lpSurface)+desc.lPitch*j+i*2;
col:=Col16to24( PWORD(addr)^ );
if col.r>16 then dec(col.r, 16) else col.r:=0;
if col.r>16 then dec(col.g, 16) else col.g:=0;
if col.r>16 then dec(col.b, 16) else col.b:=0;
PWORD(addr)^:=col16(col);
end;
end;
Buffer.Unlock(nil);
end
else Exit;
Primary.Flip(nil, DDFLIP_WAIT);
inc(n);
Until n = 16;
col24to16 и col16 - процедуры преобразования формата цвета с помощью двоичных операций, col - это переменная-record, хранящая значения каналов.
может, это всё ужасно глупо выглядит, но как сделать по-другому я не догадался.. :((
← →
cyborg © (2004-08-26 21:30) [1]
VAR
Gamma : IDirectDrawGammaControl = nil; //Интерфейс по работе с цветовой гаммой
OldGamma, NewGamma : TDDGammaRamp; //Структуры для сохранения гаммы
...
FDDSPrimary.QueryInterface(IID_IDirectDrawGammaControl ,Gamma);
Gamma.GetGammaRamp(0,OldGamma);
Gamma.GetGammaRamp(0,NewGamma);
...
Procedure FadeOut(Time: cardinal);
var
i,j : integer;
begin
for j := 64 downto 1 do
begin
for i :=0 to 255 do
begin
NewGamma.red[i]:=Word((OldGamma.red[i]*j) shr 6);
NewGamma.green[i]:=Word((OldGamma.green[i]*j) shr 6);
NewGamma.blue[i]:=Word((OldGamma.blue[i]*j) shr 6);
end;
Gamma.SetGammaRamp(0,NewGamma);
Sleep(Time);
end;
end;
...
Gamma.SetGammaRamp(0,OldGamma);
← →
MANGOL (2004-08-26 21:35) [2]кул! спасиб! бегу пробовать!
вот уж не знал об этой штуке, весь день угробил :0
кстати, а где можно про все эти гаммы почитать? наверняка ведь там ещё много всяких весчей интересных.. А то у меня только Краснов электронный :)
мож, какие-нть книжки посоветуешь?
← →
Servelat © (2004-08-26 21:59) [3]А Get и Set гаммы нельзя было прямо в процедуре сделать? И еще, разве мы так увидим чего-нить, ведь в процедуре нигде Flip"а нету, соответственно изображение не обновляется, и мы вроде должны увидеть уже погасший экран.
И присоединяюсь к вопросу о "почитать о гаммах".
ЗЫ И если соберешься все-таки еще статьи писать, про гаммы тоже напиши.
← →
MANGOL (2004-08-26 22:22) [4]>Servelat © (26.08.04 21:59) [3]
Процедура работает просто чюдесно, максимум, что я исправил - названия поверхностей.
как я понял, этой штуке - гаме - вообще пофиг на поверхности, и никакова флипа поэтому ненадо. Она влияет на интенсивность цветов или типа того.. типа палитры! Привязал к первачу - и усё готово :)
P.S. Работает всё классно, но совершенно непонятно что это за red[0..255] of Word - фигня какая-то :)
← →
Zer0 © (2004-08-27 00:06) [5]хм.. как вариант можно еще полигон без текстуры на весь экран натягивать - меняешь прозрачность вот и fading эффект. а все видяхи GammaRamp поддерживают?
← →
Думкин © (2004-08-27 06:05) [6]Более подробно тут:
http://gdsw.narod.ru/Docs/gamma_cont.htm
http://softs.h10.ru/literature.shtml?topic=directx&book=1&page=4.htm
ну и MSDN конечно.
← →
cyborg © (2004-08-27 08:01) [7]
> [3] Servelat © (26.08.04 21:59)
Верхняя часть в инициализации интерфейсов программы, нижняя для восстановления старой гаммы. Только Gamma.GetGammaRamp(0,NewGamma); нужно было в начало процедуры затухания вставить.
Гамма меняется для первичной поверхности, поэтому флипы делать не нужно.
Гамма это что-то типа палитры в 8 битовом режиме, но не палитра ;). Единственное, что вроде бы не все видеокарты поддерживают гамму, поэтому нужно проверять, хотя у меня всё работает, видимо в совсем старых видеокартах не поддерживается.
Где почитать - не знаю, я с этого форума пример брал и переделывал для себя.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c