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

Вниз

Затухающий экран   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
14-1102066006
Ega23
2004-12-03 12:26
2004.12.26
"Баллада о борьбе" Высоцкого


14-1102498783
Delphin
2004-12-08 12:39
2004.12.26
Умер комп


14-1102083278
Igor_thief
2004-12-03 17:14
2004.12.26
Delphi 2005 и RAVE


9-1093282124
Creep
2004-08-23 21:28
2004.12.26
Как ввести в игру свой шрифт? Стандартными средствами Delphi7.


3-1101899105
ksa2002
2004-12-01 14:05
2004.12.26
Редактирование DBGrid