Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.057 c
14-1101982898
infom
2004-12-02 13:21
2004.12.26
Посоветуйте хороший Русско <-> Украинский пеерводчик !!!


14-1102280007
sunvit
2004-12-05 23:53
2004.12.26
ПОМОГИТЕ!!! Как сохранить изменения на сервере Oracle?


1-1103033743
Sanya
2004-12-14 17:15
2004.12.26
Помогите!


1-1103014114
Delphi5.01
2004-12-14 11:48
2004.12.26
выезжающее окошко как это сделано в WinAmp-е


1-1102709202
mimas
2004-12-10 23:06
2004.12.26
TList и динамические массивы - что быстрее?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский