Хей. А давайте ка я вам напишу залипалочку, и расскажу по шагам как это сделать.
Будем мы писать это дело в Lazarus IDE и собирать компилятором FreePascal. На всякий случай, качается эта штука тут: http://www.lazarus-ide.org/index.php?page=downloads , но я рассчитываю на то, что вы уже знакомы хотя бы отдаленно с Delphi.
Поэтому ниже - только код залипалочки по шагам. Итак, для начала создаем пустой проект, и в обработку OnPaint пишем такой код:
https://paste.ee/p/CmQHc
Пока мы закрасили форму черным, и наша задача писать в b такие значения, чтобы вышла залипалочка. Все, конец.
Да не, шучу. Итак сделаем сначала шахматную доску 100*100 ячеек. Пишем:
https://paste.ee/p/uDMeW
На выходе шахматная доска:
Пока ничего примечательного. Что ж, давайте погоним волну по одному из ребер.
Для этого нам надо просто "двигать" координату перед передачей в делитель (j div 100) mod 2
Ну и поскольку это волна - то будем само собой двигать по синусу:
y := j;
y := y + 20*sin(i*0.1);
https://paste.ee/p/zKmqA
Но пока что волна статична, а мы собирались гнать её. Для этого нам нужно делать анимацию. Бросаем на форму таймер, ставим ему минимальный интервал, и на таймере просто зовем Invalidate;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Invalidate;
end;
Возвращаемся в OnPaint. Теперь нам тут нужно время. И желательно нормализованное (это такое, которое изменяется от 0 до 1 за N миллисекунд). Пусть интервал будет 2000 миллисекунд (это 2 секунды)
t := GetTickCount64;
tn := (t mod 2000) / 2000;
но это еще не все, дело в том, что это время имеет рывок, и оно будет резко скакать с 0 до 1. А нам нужно время, которое плавно перетекает из нуля в единицу и так же плавно обратно. Поэтому делаем "мякгое" время:
tnsoft := abs(tn - 0.5) * 2;
тут сначала мы смещаем tn, и он становится от -0.5 до 0.5. Далее с помощью abs мы замыкаем его. Теперь интервал будет плавно менятся 0.5 -> 0.0 -> 0.5. Ну и множим на 2, чтобы интервал стал 1.0 -> 0.0 -> 1.0
Теперь, когда мы имеем "плавное" время, можем поправить нашу функцию, сдвигающую y координату:
y := y + (tnsoft-0.5)*20*sin(i*0.1);
Да да, мы просто умножили амплитуду на это наше значение, переведя его в диапазон [-0.5;0.5)
https://paste.ee/p/U0BaA
Так, амплитуда меняется. Теперь давайте ка эти волны двинем вправо. Это легко, просто добавим сдвиг фаз от времени под синус (для идеальной зацикленности в gif-ках пришлось помножить на пи):
y := y + (tnsoft-0.5)*20*sin((i-t*0.1)*Pi*0.02);
https://paste.ee/p/bRK1p
Но пока еще недостаточно залипаловно. Давайте ка согнем горизонтальные волны типа как по параболе. Просто пишем:
y := y*i/200; перед тем как отправить в нашу функцию с синусом (еще я чуть увеличил амплитуду на синусе до 30)
https://paste.ee/p/b6b3R
Ну вот. На первый раз хватит. Вот такими простенькими манипуляциями простенькая залипалочка готова.
Полный говнокод юнита с формой: https://paste.ee/p/Gbq2y
Специально для Пикабу, сугубо от нефиг делать. Спасибо за внимание.