3

Делаем залипалочку на FPC + Lazarus.

Хей. А давайте ка я вам напишу залипалочку, и расскажу по шагам как это сделать.

Будем мы писать это дело в 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

Специально для Пикабу, сугубо от нефиг делать. Спасибо за внимание.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества