PK Creative празднует Китайский Новый год. Я участвую в "Творческом конкурсе Весеннего фестиваля". Подробности см.:Творческий конкурс "Праздник весны"
предисловие
Скоро Новый год
Красивым фейерверком желаюxdm
С Новым Годом 🎉🎉🎉
Предварительный просмотр эффекта
pc
конец
мобильный
ласки
праздник фейерверков
Этапы реализации
Конкретные шаги реализации следующие:
Создать холст
setup
а такжеdraw
даp5.js
Две основные функции этогоcreateCanvas
размер, используемый для создания холста,background
установить цвет фона холста
function setup() {
createCanvas(1303 / 2, 734 / 2)
}
function draw() {
background(50);
}
установлен в1303/2
а также734/2
, для того, чтобы сделать скриншот, он также отображается в Наггетсах, которые будут изменены позже
частицы фейерверка краски
Учитывая, что их будет много, передайте функциюParticle
Для генерации код выглядит следующим образом
var firework;
function Particle(x, y) {
this.pos = createVector(x, y)
this.vel = createVector(0, 0)
this.acc = createVector(0, 0)
this.update = function () {
this.vel.add(this.acc)
this.pos.add(this.vel)
this.acc.mult(0)
}
this.show = function () {
point(this.pos.x, this.pos.y)
}
}
использовать здесьcreateVector
созданный3
вектор p5, содержащий величину и направлениеpos
,vel
,acc
, можно понимать как силу, которая будет использована позже, а потом есть функция обновленияupdate
, и функция отображенияshow
Затем измените содержимое основной функции, прежде всегоsetup
function setup() {
createCanvas(1303 / 2, 734 / 2)
stroke(255)
strokeWeight(4)
firework = new Particle(200, 150)
}
пройти черезstroke
Установите белый цвет с помощьюstrokeWeight
Установите размер частиц на 4, затем вdraw
function draw() {
background(50);
firework.update()
firework.show()
}
передачаfirework.update()
а такжеfirework.show()
Отображение частиц фейерверка
Результат выглядит следующим образом:
Сделать так, чтобы частицы фейерверка случайно появлялись внизу
Исправлятьsetup
серединаfirework
, чтобы он появился где-нибудь внизу
firework = new Particle(random(width), height)
здесьwidth
а такжеheight
Указывает ширину и высоту холста
Результат выглядит следующим образом
Заставьте частицы фейерверка двигаться вверх
Просто нужно изменитьParticle
серединаthis.vel
Только что
this.vel = createVector(0, -4)
createVector
Первый параметр представляет скорость оси X, положительное число — скорость вправо, отрицательное число — скорость влево; второй параметр представляет скорость оси Y, отрицательное — вверх, положительное не работает
Эффект следующий
Пусть частицы используют гравитационный эффект, который может двигаться вниз
Сначала объявите переменную глобальноgravity
, установите гравитацию в функции настройки
gravity = createVector(0, 0.2)
createVector(0, 0.2)
Это означает нисходящую гравитацию.Чем больше значение позади, тем больше гравитационное поле.
Затем нам нужноdraw
В функцию добавляем гравитационное поле
firework.applyForce(gravity)
Конечно, необходимоParticle
, ДобавитьapplyForce
функция, фактическая добавленная операция
this.applyForce = function (force) {
this.acc.add(force)
}
Эффект следующий
Требуется много частиц фейерверка
необходимо создатьFirework
функция
function Firework() {
this.firework = new Particle(random(width), height)
this.update = function () {
this.firework.applyForce(gravity)
this.firework.update()
}
this.show = function () {
this.firework.show();
}
}
после этогоdraw
в, черезfor
цикл для отображения большого количества частиц фейерверка
function draw() {
background(50)
fireworks.push(new Firework())
for (var i = 0; i < fireworks.length; i++) {
fireworks[i].update()
fireworks[i].show()
}
}
Результат выглядит следующим образом
Введите случайные факторы, чтобы изменить плотность
Приведенный выше дисплей явно слишком плотный, мы можем изменитьdraw
серединаfireworks.push(new Firework())
,изменился на
if(random(1)<0.1){
fireworks.push(new Firework())
}
Здесь, введя случайное фактор, его можно легко модифицировать.
Эффект следующий
Отрегулируйте быстро, медленно, высоко, низко
На самом деле нам нужно только изменить величину силы, мы можем использоватьrandom
Итак, мы модифицируемParticle
серединаthis.vel
дляcreateVector(0, random(-12,-8))
Результат выглядит следующим образом
Заставьте частицы фейерверка исчезнуть, когда они достигнут своих вершин
На самом деле, когдаy
Когда нет усилия на валу, очистите егоfirework
как проверитьy
А сила вала?
Ответ черезthis.firework.vel.y >= 0
Так изменитьFirework
:
function Firework() {
this.firework = new Particle(random(width), height)
this.update = function () {
if (this.firework) {
this.firework.applyForce(gravity)
this.firework.update()
if (this.firework.vel.y >= 0) {
this.firework = null
}
}
}
this.show = function () {
if (this.firework) {
this.firework.show();
}
}
}
Эффект следующий
В момент исчезновения пусть окружающее взорвется
Здесь будет больше изменений, основные изменения:Firework
:
function Firework() {
this.firework = new Particle(random(width), height, true)
this.exploded = false
this.particles = []
this.update = function () {
if (!this.exploded) {
this.firework.applyForce(gravity)
this.firework.update()
if (this.firework.vel.y >= 0) {
this.exploded = true
this.explode()
}
}
for (let i = 0; i < this.particles.length; i++) {
this.particles[i].applyForce(gravity)
this.particles[i].update()
}
}
this.explode = function () {
for (let i = 0; i < 100; i++) {
var p = new Particle(this.firework.pos.x, this.firework.pos.y)
this.particles.push(p)
}
}
this.show = function () {
if (!this.exploded) {
this.firework.show();
}
for (let i = 0; i < this.particles.length; i++) {
this.particles[i].show()
}
}
}
Результат выглядит следующим образом
случайный взрыв множителя
можно изменитьParticle
Чтобы улучшить следующий эффект, модифицированный код
function Particle(x, y, firework) {
this.pos = createVector(x, y)
this.firework = firework
if (this.firework) {
this.vel = createVector(0, random(-12, -8))
} else {
this.vel = p5.Vector.random2D()
this.vel.mult(random(1, 6))
}
this.acc = createVector(0, 0)
this.applyForce = function (force) {
this.acc.add(force)
}
this.update = function () {
this.vel.add(this.acc)
this.pos.add(this.vel)
this.acc.mult(0)
}
this.show = function () {
point(this.pos.x, this.pos.y)
}
}
Эффект следующий:
Показать меньше фейерверков
Это достигается за счет корректировки коэффициентов, чтобы показывать меньше фейерверков.
мы будемdraw
в функции
if(random(1)<0.1){
fireworks.push(new Firework())
}
изменился на:
if(random(1)<0.02){
fireworks.push(new Firework())
}
Это меньше
Эффект следующий
Исправлена проблема, из-за которой фейерверки были слишком разбросаны.
прибытьParticle
в, найтиupdate
метод, добавить
if(!this.firework){
this.vel.mult(0.85)
}
можно понимать как,mult
Чем больше значение, тем больше сила, тем сильнее взрыв.
Эффект следующий
Достигнут эффект затухания
После рассеивания он должен медленно затухать и исчезать.
На самом деле, он в основном вводит переменнуюlifespan
, сделай из255
начать уменьшаться, черезstroke(255,this.lifespan)
исчезать
Следующий код
function Particle(x, y, firework) {
this.pos = createVector(x, y)
this.firework = firework
this.lifespan = 255
if (this.firework) {
this.vel = createVector(0, random(-12, -8))
} else {
this.vel = p5.Vector.random2D()
this.vel.mult(random(1, 6))
}
this.acc = createVector(0, 0)
this.applyForce = function (force) {
this.acc.add(force)
}
this.update = function () {
if(!this.firework){
this.vel.mult(0.85)
this.lifespan -= 4
}
this.vel.add(this.acc)
this.pos.add(this.vel)
this.acc.mult(0)
}
this.show = function () {
if (!this.firework) {
strokeWeight(2)
stroke(255,this.lifespan)
} else {
strokeWeight(4)
stroke(255)
}
point(this.pos.x, this.pos.y)
}
}
Эффект следующий
Расширить диапазон взрывных работ
или путем регулировкиmult
Численная реализация
Particle
серединаthis.vel.mult(random(1, 6))
изменился наthis.vel.mult(random(2, 10))
this.vel.mult(0.85)
изменился наthis.vel.mult(0.9)
Эффект следующий:
Исчезающие частицы фейерверка необходимо удалить
Убрать исчезающие частицы фейерверка, собственно, из массиваparticles
Его можно вырезать из нативного массива jssplice
реализация метода
Итак, вFirework
изменено вupdate
серединаfor
цикл
for (var i = this.particles.length - 1; i >= 0; i--) {
this.particles[i].applyForce(gravity)
this.particles[i].update()
if (this.particles[i].done()) {
this.particles.splice(i, 1)
}
}
Конечно, нам нужно создатьParticle
добавлено вdone
метод
this.done = function () {
if (this.lifespan < 0) {
return true
} else {
return false
}
}
Потом ещеFirework
также добавитьdone
this.done = function(){
if(this.exploded && this.particles.length === 0){
return true
}else{
return false
}
}
после этогоdraw
используется в
for (var i = fireworks.length - 1; i >= 0; i--) {
fireworks[i].update()
fireworks[i].show()
if (fireworks[i].done) {
fireworks.splice(i, 1)
}
}
Эффект тот же, что и выше, разница в том, что мы удаляем невидимые частицы из массива.
Изменить цвет фона
существуетsetup
прошедшийbackground
Функция меняет цвет фона на черный
background(0)
в то же времяdraw
Добавить к
colorMode(RGB)
background(0, 0, 0, 25)
colorMode
для установки цветовой модели, кромеRGB
, и вышеHSB
;background
из4
параметр соответствуетrgba
Эффект следующий
Добавьте цвет фейерверка
В основном добавьте цвет к фейерверку, вы можете добавить случайные цвета со случайными числами, в основном вFirework
добавить это
this.hu = random(255)
Помните, что есть несколько мест, которые зависят от изменений
После улучшения эффект следующий
Совместимость с ПК и мобильным телефоном
установить передcreateCanvas(1303 / 2, 734 / 2)
Причина в том, что во-первых, нужно вырезать подходящее изображение для отображения на самородках, а во-вторых, сделать изображение не таким большим.
Теперь, чтобы адаптироваться к вертикальному экрану мобильного терминала, мы устанавливаем ширину и высоту черновика в ширину и высоту области просмотра.
createCanvas(window.innerWidth, window.innerHeight)
Во-вторых, поскольку высота вертикального экрана должна быть относительно большой, нам необходимо соответствующим образом отрегулировать усилие, направленное вверх, и отдельно отрегулировать усилие на подвижной стороне и стороне полотна.
Итак, мы находимParticle
,Исправлятьif (this.firework){xx}
для
if (this.firework) {
if(window.innerHeight<640){
this.vel = createVector(0, random(-16, -13))
}else{
this.vel = createVector(0, random(-17, -15))
}
}
Вышеуказанные значения скорректированы, я думаю, что эффект лучше, не слишком высоко, высота более концентрированная
Эффект страницы следующий
Проверьте мобильный эффект
Это почти то же самое Конечно, мы можем добиться множества различных эффектов, регулируя соответствующие значения, такие как
Увеличьте гравитационное поле
gravity = createVector(0, 0.3)
шутить
if (random(1) < 0.01) {
fireworks.push(new Firework())
}
Праздник фейерверков прекрасен
if (random(1) < 0.5) {
fireworks.push(new Firework())
}
Фактически, вы также можете добавлять звуки в зависимости от цвета, толщины, скорости, направления и даже изменения частиц.3d
Эффекты и т. д. делают эффекты более забавными
Эпилог
Вышеизложенное - это все содержание этой статьи, добро пожаловать в лайк и поддержку~
Наконец желаю вам
В новом году удачи тебе, будь любима многими, смейся почаще и всего наилучшего
С Новым Годом~🎉🎉🎉