
Начнем с создания общего объекта созвездия Constellation
и его основных переменных и методов.
Переменные:
Сразу определим две настройки: width
и height
- ширина и высота для холста равные ширине и высоте окна.
Методы:
В методе setCanvas
зададим ширину и высоту холста, указанные в настройках.
Теперь нужно все это дело запустить. Повесим обработчик на событие DOMContentLoaded
- функцию, которая содержит создание экземпляра нашего объекта созвездия и вызов метода init
.
Теперь нужно нарисовать на холсте звезды. Определим некоторые требования:
Приступим. В переменную настроек добавим:
star
с двумя свойствами: color
и width
, цвет точки и ее максимальный радиус;length
- количество точек: диагональ холста разделенная на 10;stars
- массив, содержащий все звезды.Создадим новый объект Star
внутри созвездия, что бы ему были доступны основные переменные.
Внутри объекта определяем расположение точки декартовыми координатами и указываем ее радиус- параметры x
, y
и radius
соответственно, также определяем метод create
, который нарисует точку на холсте.
Значение координаты x
должно быть от 0 до значения ширины холста. Для хаотичного расположения звезд нам нужно выбрать случайную точку в этом отрезке, воспользуемся методом Math.random()
(он возвращает число от 0 до 1) - умножим значение ширины на случайное число, возвращенное этим методом. То же самое проделываем с координатой y
, используя высоту холста.
Максимально возможный радиус мы ранее указали в настройках, это свойство width
во вложенном в настройки объекте star
. Умножим это значение на результат работы метода Math.random()
.
С объектом точки закончили, вернемся к созвездию.
В методе setContext
зададим цвет заливки фигур, свойство fillStyle
контекста. Это будет цвет точек.
Напишем метод createStars
, который будет создавать точки, в нем выполним следующие действия:
clearRect
;length
. На каждой итерации цикла создаем экземпляр объекта Star
, добавляем его в массив stars
(свойство объекта настроек) и вызываем метод create
.Для последующей анимации нам потребует запускать этот метод циклически. Поэтому сразу добавим метод loop
, который в качестве параметра принимает функцию. Вызывает переданную функцию и с помощью метода requestAnimationFrame запускает вновь себя же, передавая в качестве параметра полученную функцию. Получается рекурсия. Почечему нужно использовать requestAnimationFrame: без него исполнение кода браузером остановится на данной рекурсии. Также стоит обратить внимание: внутри метод запускается из ранее созданной переменной _this.
В конец метода init
допишем вызов цикла, и смотрим что получилось.
В объект Star
добавим два параметра vx
и vy
, они определяют скорость и направление движения точек. Принцип расчета такой:
Math.random()
- получаем случайное число от -0.5 до 0.5 (отрицательное значение спровоцирует движение в противоположную сторону);Пишем метод animate
для реализации движения. В нем циклом проходим по массиву stars
, определяем не достигла ли точка края холста, если достигла- меняем знак параметра vx
или vy
(в зависимости от стороны) на противоположный и увеличиваем значение координат x
и y
на vx
и vy
соответственно.
Вызываем метод animate
в конце метода createStars
из переменной _this
.
Смотрим результат.
Осталось нарисовать линии в области наведения курсора.
Добавим в настройки:
line
с двумя свойствами: color
и width
- цвет линий и их толщина;position
с двумя свойствами: x
и y
- координаты курсора;distance
;radius.
В методе setContext
зададим цвет и толщину линий, свойства strokeStyle
и lineWidth
контекста.
Пишем метод line
, который будет отвечать за рисование линий. В методе два вложенных цикла. Оба они проходят по каждой точке. Таким образом можно определить расстояние между каждой точкой. Если расстояние между точками по обеим координатам меньше указанного в настройке distance
и расстояние от положения курсора до точки по обеим координатам меньше указанного в настройке radius
, то рисуется линия от первой точки до второй.
Вызываем метод line
в конце метода createStars
из переменной _this
.
Для обновления позиции курсора напишем метод bind
, в котором создадим обработчик события mousemove
на холсте. В обработчике определяем положение курсора относительно холста и полученные координаты пишем в ранее созданный объект настроек position
. Вызываем метод bind
в конце метода init
.
Смотрим готовый результат.
Комментарии ()