Код разбил на 4 части. Буду вставлять скриншот из редактора и описывать, что всё это значит. Поехали.
Во строчке 2 задаём начальное состояние генератора случайных чисел.
В строчке 4 создаём переменную cubeCount, в которой записываем количество квадратиков на экране. Её можно было не создавать и везде в коде вставить непосредственное значение, но использование переменной позволяет легко изменять количество квадратиков, изменив количество только в одной строчке.
В строчках 5 - 8 задаём границы, за которые квадратики не должны улететь. Так как использую глобальные переменные с размерами экрана, скрипт автоматом подстроится под разные размеры окна.
В строчке 9 задаем массив с именем ping, в котором четыре строки (X-координата, Y-координата, скорость по X, скорость по Y ), а количество колонок равно количеству квадратиков на экране.
В строке 10 задаём массив colr, в котором будут храниться цвета квадратиков. Он сделан отдельно, так как в массиве должны хранится данные одного типа. Вот так можно графически изобразить эти два массива.
Следующий фрагмент кода, где мы заполняем массивы ping и colr начальными данными.
В строке 12 создаём переменную i и присваиваем ей нулевое значение.
В строке 13 запускаем цикл, который будет выполнятся, пока переменная i не станет равной количеству квадратов на экране. В начале цикла переменная i равнялась 0, но после каждого прохода её значение увеличивалось на единицу (строка 26).
Внутри цикла мы последовательно обращаемся к каждому элементу массивов ping и colr, генерируя начальные координаты скорости и цвета квадратов.
В строках 15 и 16 генерируем начальные координаты X и Y.
Разберём строчку:
(rand() % (WINDOW_XSIZE-100)) - (WINDOW_XSIZE-100)/2
Так как у меня размер окна 700, то WINDOW_XSIZE-100 будет равен 600.
Заменим это в строке:
( rand() % 600 ) - 600/2
То есть сгенерируем число от 0 до 599 и из него вычтем 300
Получится диапазон от -300 до 299.
В строках 18 и 19 создаём начальную скорость по X координате.
В строках 21 и 22 создаём начальную скорость по Y координате.
rand() % 2 даёт на выходе либо 0, либо 1.
Единица нам подходит, а если получилось 0, то меняем 0 на -1.
В строке 24 генерируем случайный цвет для каждого квадратика.
Используется функция get_color( ), которой в качестве параметров передаются величина красной, зелёной и синей составляющей.
Так как каждая состовляющая может быть в диапазоне от 0 до 255, использую выражение rand() % 256.
В строке 29 начинаем бесконечный цикл.
Строка 32 очищаем экран. До этого я рисовал чёрный квадрат поверх старого, но когда квадратов много, проще закрасить весь экран.
Используется функция clear(), которая очистищает текущий рабочий экран заданным цветом (или черным, если цвет не задан). Это кстати одна из фишек многих функций. Там есть параметры по умолчанию и если вы не задаёте параметры, то используются параметры по умолчанию.
В строках 34-42 используется функция effector( ), которая применяет заданный эффект к экрану. Можно поэкспериментировать, меняя число в параметрах. Можно также к части экрана применить один эффект, а к другой части другой.
Здесь я использовал такой код.
effector( EFF_HBLUR , 2)
effector( EFF_VBLUR , 2)
effector( EFF_SPREAD_LEFT, 20, BLACK,-200, -150, 400, 300)
effector( EFF_SPREAD_RIGHT,20, BLACK,-200, -150, 400, 300)
effector( EFF_SPREAD_UP, 20, BLACK,-200, -150, 400, 300)
effector( EFF_SPREAD_DOWN,20, BLACK,-200, -150, 400, 300) box(-200,-150,400,300,WHITE)
Здесь я размытие применил ко всему экрану, а случайный сдвиг только к центральной части. Для красоты добавил белую рамку. Как видите, у функции effector( ) тоже есть параметры по умолчанию, такие, как цвет и область экрана.
Во время экспериментов, когда нам временно не нужен какой то фрагмент кода, то его можно превратить в комментарий, поставив // перед ним или окружив большой фрагмент кода "колючей проволокой"
/* ненужный
сейчас
код */
И остался последний фрагмент. После того, как применили нужные эффекты к изображению на экране, пришла пора нарисовать квадратики по новым координатам.
В строке 44 мы присваиваем переменной i нулевое значение. Далее со строки 45 до строки 58 идёт цикл, который будет повторятся ровно столько, сколько квадратиков мы используем.
После каждого прохода цикла переменная i увеличивается на единицу (строка 57) и это будет повторятся, пока i не станет равной количеству кубиков на экране (строка 45).
Благодаря тому, что i каждый проход увеличивается на единицу, она будет использоваться в качестве индекса, для обращения к массивам.
Такой момент. Если у нас используется 120 кубиков, то первый кубик имеет индекс 0, а последний кубик - индекс 119 (колонка в массиве).
В строка 47 изменяем координату X, прибавив к ней скорость по оси X.
В строка 48 изменяем координату Y, прибавив к ней скорость по оси Y.
В строках 50-51 проверяем не достигли ли мы границы экрана справа и слева и если это так, то меняем знак скорости по оси X на противоположный. В следующий раз квадрат будет двигаться в противоположную сторону.
В строках 53-54 делаем то же самое, только с движением верх-вниз.
В строке 56 рисуем квадрат по обновлённым координатам, используя цвет из массива colr.
После того как в цикле пробежались по всем квадратам, переходим к строке 60. В строках 60-61 мы изменяем знак скорости случайного квадрата по оси Y. А в сроках 62-63 изменяем знак скорости случайного квадрата по оси X. Я это сделал, что бы квадраты меняли направление движения не только, когда достигнут границы экрана, но и в случайный момент времени. Так выглядит красивее.
В строке 65 обновляем экран и переходим в начало бесконечного цикла на строку 30.
Как то вот так выглядит алгоритм в моей голове. Самое главное- уметь придумать алгоритм решения задачи, а потом просто записываешь его на языке, понятном компьютеру.
Скрипт можно взять на яндекс диске. Я добавил там возможность сохранять анимацию в виде последовательности jpeg-файлов.
Файлы сохраняются в папке с именем 0u, которая должна находится рядом со скриптом. Затем из этих файлов можно собрать видео, для этого я использую программу VirtualDub.
Что бы запустить сохранение, нужно в редакторе присвоить переменной save_file значение 1, изначально переменная равна 0.
Я поставил ограничение на 3000 файлов в переменной MaxFiles.
Можете поэкспериментировать с эффектами, количеством объектов. Например отключить размытие и включить Шум+Сдвиг.
На сегодня всё. В следующих уроках будет создание функций, обработка кликов по экрану, синусы и косинусы...