Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2009, 12:31   #1
Mr.Qwerty
Что? Где? Когда?
Форумчанин
 
Аватар для Mr.Qwerty
 
Регистрация: 14.07.2009
Сообщений: 220
Вопрос Как сделать такую вещь?

Добрый день уважаемые форумчане! У меня есть такой вопросик: Кто-нибудь полюбому пользуется торрентом, вот там в "о программе" есть такие фишка как расплывающиеся волны на форме:
волны.png
Причем они как анимация действую, расплываются..причем никаких анимаций в директории с программой нет, там только:
uninstall.cmd
uninstall.exe
uTorrent.exe
Собственно вопрос, как такую фишку можно сделать в дельфи?
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Mr.Qwerty вне форума Ответить с цитированием
Старый 31.07.2009, 12:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну сама анимация скажем в таймере. отрисовывать в OnPaint формы ченить типа фракталов... Я даже встречал алгоритмы таких волн в Яндексе.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2009, 14:20   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

плазма и ещё пара примеров http://sapersky.narod.ru/files/FastLIBv389i.rar

пыщь
JTG вне форума Ответить с цитированием
Старый 31.07.2009, 18:15   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Вопрос

Цитата:
Я даже встречал алгоритмы таких волн в Яндексе.
Можно поподробнее (хотя я не думаю что в данном случае это фракталы)...
Цитата:
Причем они как анимация действую, расплываются..причем никаких анимаций в директории с программой нет
Ну может в ресурсах сидит...


Ща установлю себе эту штуковину (кстати, что она хоть делает-то?) и посмотрим...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 31.07.2009, 18:17   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Обычный gif с грамотно подставленными кадрами
psycho-coder вне форума Ответить с цитированием
Старый 31.07.2009, 19:25   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Не, не гиф, программно рисуется. Называется это "синус-плазма" http://democoder.ru/article/10

в торренте что-то типа
pixels[x,y] := sin(cos(x+k1) + sin(y+k2)) * color
пыщь
JTG вне форума Ответить с цитированием
Старый 31.07.2009, 20:49   #7
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Смех

Установил...))
Размер проги всего 300 килобайт... Уважаю...

Не понял правда, что именно эта прога делает - всё куда-то в и-нет пытается лезть... =(
А в ресурсах картинки не заметно, хотя половину ресурсов не показываются - жалуется мол "This file has a non-standart resource layout... it has probably been compressed an "EXE compressor"." (к чему бы это?)...

Но рисуют точно программно... =)

Не скажу как именно они просчитывают сам узор (JTG, благодарю за ссыль, интересно ), но анимируют его примерно так:

Код:
Var
      Form1: TForm1; Bitmap: TBitmap;

Implementation

{$R *.dfm}

Procedure CreatePicture; // создаём какое-либо изображение (наугад сложил координаты, что-то да получилось)
Type
      TRGB=Record Blue,Green,Red: Byte End;
      ARGB = Array[0..0] Of TRGB;
      PARGB=^ARGB;
Var
      x, y: Integer; Line: PARGB;
Begin
For y:=0 To Bitmap.Height-1 Do
      Begin
      Line:=Bitmap.ScanLine[y];
      For x:=0 To Bitmap.Width-1 Do
            Begin
            Line[x].Red:=x+x;
            Line[x].Green:=x+y;
            Line[x].Blue:=y+y;
            End;
      End;
End;

Procedure ChangePicture; // изменяем наше изображение
Type
      TRGB=Record Blue,Green,Red: Byte End;
      ARGB = Array[0..0] Of TRGB;
      PARGB=^ARGB;
Var
      x, y: Integer; Line: PARGB;
Begin
For y:=0 To Bitmap.Height-1 Do
      Begin
      Line:=Bitmap.ScanLine[y];
      For x:=0 To Bitmap.Width-1 Do
            Begin
            Line[x].Red:=(Line[x].Red+1) mod 55;
            Line[x].Green:=(Line[x].Green+1) mod 55;
            Line[x].Blue:=(Line[x].Blue+1) mod 55;
            End;
      End;
Form1.Canvas.Draw(0, 0, Bitmap);
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
Bitmap:=TBitmap.Create;
Bitmap.PixelFormat:=pf24bit;
Bitmap.Width:=640;
Bitmap.Height:=480;
CreatePicture;
Timer1.Interval:=1;
End;

Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
ChangePicture;
End;

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
Bitmap.Free;
End;
Делал на коленке, если есть помарки не пинайте... =)
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 31.07.2009, 22:37   #8
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Хм... Интересная штуковина. Надо будет поковырять. Спс за линк
psycho-coder вне форума Ответить с цитированием
Старый 01.08.2009, 02:16   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

DomiNick, неужели не качаешь через торренты? 21 век на дворе блин, срочно исправляйся и вступай в ряды Доблестных Пиратов под покровительством бога Вареза

--

во, переписал код, можно химичить

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TRGB=Record Blue,Green,Red: Byte End;
  ARGB = Array[0..0] Of TRGB;
  PARGB=^ARGB;

Var
  Form1: TForm1; Bitmap: TBitmap;
  SinTab, CosTab: array[0..1023] of word;
  Palette: array[0..1023] of cardinal;
  xShift, yShift, PalIndex: Integer;
  a, b, speed: integer;

Implementation

{$R *.dfm}

procedure ChangePicture(iShift, jShift: Integer);
Var   x, y: Integer;
      Line: PARGB;
      Xadd, Yadd: Integer;
      Index: Integer;
begin
  Inc(xShift,5); 
  Dec(yShift,5);
  Inc(PalIndex);

  for y:= 0 to Bitmap.Height-1 do
    begin
      line:= Bitmap.ScanLine[y];

      Xadd:= SinTab[(y*a shr 2 + iShift) and $3FF];     //крутить ручки
      Yadd:= CosTab[((y*b shl 2) + jShift) and $3FF];  //можно тут

      for x:= 0 to Bitmap.Width-1 do
        begin
          Index:= (SinTab[((x shl 2) + Xadd) and $3FF] + (PalIndex * speed) + Yadd) and $3FF;  //и тут
          if (Index > 511) then Index:= 1023 - Index;

          line^[x].Blue:=Palette[((Index div 4) + PalIndex) and $3FF];
          line^[x].Red:=Palette[((Index div 4) + PalIndex) and $3FF];
          line^[x].Green:=Palette[((Index div 4) + PalIndex) and $3FF];
        end;
      end;

  Bitmap.Canvas.TextOut(10,10,' space: random  +/-: speed ['+IntToStr(speed)+'] ');
  Form1.Canvas.Draw(0, 0, Bitmap);
end;

Procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
Begin
  Randomize;
  Bitmap:=TBitmap.Create;
  Bitmap.PixelFormat:=pf24bit;
  Bitmap.Width:=Width;
  Bitmap.Height:=Height;
  Timer1.Interval:=1;

  for i:= 0 to 1023 do
  begin
    SinTab[i] := (Trunc(Sin(2.0 * Pi * i / 1024.0) * 512) + 512) and $3FF;
    CosTab[i] := (Trunc(Cos(2.0 * Pi * i / 1024.0) * 512) + 512) and $3FF;
    palette[i] := Trunc(Sin(Pi * i / 1024.0) * 255);   //можно по-другому заполнить палитру
  end;

  xShift:=0;
  yShift:=0;
  a:=1;
  b:=1;
  speed:=4;
End;

Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
  ChangePicture(xShift, yShift);
End;

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
  Bitmap.Free;
End;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  case key of
  ' ': begin
         a:=random(10);
         b:=random(10);
       end;
  '+':inc(speed);
  '-':dec(speed);
  end;
end;

end.
пыщь

Последний раз редактировалось JTG; 01.08.2009 в 03:53.
JTG вне форума Ответить с цитированием
Старый 01.08.2009, 05:17   #10
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Мда......

Потрясающе... %))

Подобрал масштаб (или как его назвать), сделал скорость в районе 120-130.....

Плющит..... %)))

Афигенный скринсейвер получился... Только при старте формы не надо задавать a:=1 и b:=1, а тоже случайно брать... И на всю экран... ))))
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Трудно ли сделать такую прогу? lawforall Фриланс 12 05.07.2009 18:10
кто сможет сделать такую прогу? Shuran Фриланс 4 04.07.2009 09:37
как осуществить такую логику mortira Общие вопросы Delphi 27 29.06.2009 18:15
Как сделать такую программку C++ Kisia Помощь студентам 8 29.04.2009 12:56