Rozbłysnąć(szybki Fade out) od koloru białego do zadanego

0

Cześć, mam taki oto problem.

Chcę "rozbłysnąć" od białego koloru do zadanego.
Mam nadzieję, że wiecie o co mi chodzi, a jeśli nie, to wątpliwości powinien rozwiać mój kod:

  c:=colorToRgb(zadany_kolor);
  jr:=Byte(c);
  jg:=Byte(c shr 8);
  jb:=Byte(c shr 16);

  while (panel1.Color<>zadany_kolor) or (FStart) do
   begin
    if FStart then
    begin
      r:=255; g:=255; b:=255;
      FStart:=false;
    end;

    if r>jr then r:=r-1;
    if g>jg then g:=g-1;
    if b>jb then b:=b-1;

    panel1.Color:=Rgb(r, g, b);
    Application.ProcessMessages;
  end;

jr, jg i jb to składowe rgb koloru, jaki mam osiągnąć.
r, g, b to składowe aktualnego koloru.

No i niby wszystko ładnie chodzi, ale problem polega na tym, że pętla bez żadnego zwolnienia działa za szybko i nie widać "rozbłyśnięcia", tylko błyśnięcie: biały - zadany.

Jeśli wrzucę tam sleep(1) to znowu jest trochę za wolno. Jeśli np. kolorem zadanym jest niebieski, no to wtedy to trochę trwa.

Timer rzecz jasna w ogóle odpada, bo jest za wolny.
Da się zrobić coś, żeby to było szybciej niż sleep(1), ale wolniej niż bez żadnego opóźnienia? :D

Myślałem też nad "licznikiem", czyli pętlą w stylu:

  while i<1000 do i:=i+1;

ale to chyba złe rozwiązanie.
A może robi się takie rzeczy jakoś inaczej?</delphi>

0

Zrob w inny sposob: pusc w petli, ktora wykonuje sie poki nie osiagniesz maksymalnego koloru, ciag operacji, ktorych postep nie zalezy od ilosci odmalowan, ale od czasu.

Pseudokod dla operacji, ktora trwa 3 sekundy:

const
  CZAS_TRWANIA = 3000;
begin
czasStartu := GetTickCount();
  repeat
  czasObecny := GetTickCount();
  Odrysuj((czasObecny - czasStartu) / CZAS_TRWANIA);
  Application.ProcessMessages();
  until (czasObecny - czasStartu > CZAS_TRWANIA);
end;
procedure Odrysuj(postep: double);
//postep powinien byc w zakresie 0..1
begin
//...
Panel1.Color := RGB(
  Round(postep * koncowyR + (1 - postep) * poczatkowyR),
  Round(postep * koncowyG + (1 - postep) * poczatkowyG),
  Round(postep * koncowyB + (1 - postep) * poczatkowyB));
end;
0

Kurde, działa to ok z tą różnicą, że robi mi fade out do czarnego. A ja chcę do zadanego koloru. Próbuję, ale jakoś nie mogę tego przerobić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1