PK Creative празднует Китайский Новый год. Я участвую в "Творческом конкурсе Весеннего фестиваля". Подробности см.:Творческий конкурс "Праздник весны"
жареные наггетсы
В молодости, во время праздников, я был настоящим "пушечным королем" в деревне, жарил "стеклянные бутылки", жарил "рыбу", жарил "камни", жарил "навозные ямы"...
Бессознательно, я был на нескольких из 30, до Нового года я не могу "пушечного короля".
Но в этом году я собираюсь сделать большой голос: поставить
光炸网页端还不够! ОниAPP
Тоже до конца!
URL-адрес опыта
После входа на следующую страницу, нажмите на экран, чтобы зажечь «петарду»!
Если вы используете компьютер 💻:Жареные наггетсы - Компьютерный портал
Если вы используете мобильный телефон 📱:Жареные наггетсы - Мобильный портал
писать с тобой рука об руку
1. Необходимые условия
- Триангуляция Делоне: также известная как
Delaunay
Триангуляция - это способ разделиния плоскости или поверхности вN
А методы обработки графики не пересекают треугольник.
(Мы использовали его, чтобы разбивать самородки на кусочки!) -
animejs
: широко используемая библиотека интерфейсной анимации.
(Мы используем его, чтобы бросать самородки в бездну!)
2. Как заказать "перестрелку"?
Я не делаю взрывчатку, я носильщик для перестрелок.
Реализация части «перестрелки» происходит из статьи друга @creen young:Таймер фейерверка с svg
Проще говоря, в три шага:
- использовать
svg
- использовать
animejs
- использовать
animejs
Нарисуйте анимацию движения Марса.
Подробный геймплей смотрите в исходном посте:Таймер фейерверка с svg
3. Как создать эффект взрыва?
Где взрыв? Только свечение становится больше
div
Вот и все.
Эффект блефа взрыва световых волн, эффекты вспышки бомбы, это слишком легко достичь!
Нам просто нужно сделать ширину и высоту0px
изdiv
Расширить до полного размера экрана, а затем медленно уменьшить его до.Чтобы усилить «ослепляющее ощущение» при взрыве, мы можем сделать так, чтобы фон быстро становился черным в процессе, а затем медленно исчезал.
код показывает, как показано ниже:
// 生成时间轴
const timeline = animejs.timeline()
// 爆炸光波div放大并变亮(其实是变白)
timeline.add({
targets: sparkRef.current,
backgroundColor: {
value: '#fff',
duration: 300
},
width: 1 * Math.max(bodyClientHeight, bodyClientWidth),
height: 1 * Math.max(bodyClientHeight, bodyClientWidth),
duration: 1000
})
// 背景变暗
timeline.add({
targets: maskRef.current,
backgroundColor: `rgba(0,0,0,0.8)`,
duration: 800,
easing: 'easeInOutCirc',
}, '-=1000')
// 爆炸光波div缩小,并逐渐变透明
timeline.add({
targets: sparkRef.current,
width: 0,
height: 0,
opacity: 0,
duration: 3000,
easing: 'easeInOutCirc',
})
// 背景变得透明
timeline.add({
targets: maskRef.current,
backgroundColor: `rgba(0,0,0,0)`,
duration: 3000,
opacity: 0,
easing: 'easeInOutCirc',
}, '-=3000')
4. Как сделать Наггетс "битым"?
Давайте сначала разберемся, что на самом деле делает «триангуляция Длоне».
Как показано на рисунке выше, «триангуляция Делоне» может соединять кучу разбросанных точек, образуя несколько треугольников, не пересекающихся друг с другом. Поэтому наше мышление таково:
Через этот алгоритм мы можем добавить несколько точек на прямоугольник, а затем достичь эффекта «разрушающего» его.
На этой основе, чтобы сделать его «сломанным» более реалистичным, мы можем добавить несколько слоев.
Мы рисуем несколько концентрических окружностей вокруг центральной точки, а затем рисуем несколько точек вокруг дуг этих концентрических окружностей, чтобы создать ощущение разбитого стекла. следующим образом:
Конечный эффект можно отметить как плотный в середине и разреженный вокруг.
5. Как сделать так, чтобы обломки падали далеко?
Прежде чем сделать этот шаг, мы должны第4步
Сгенерирован по пункту, мой подход - «отрезать их в несколькоcanvas
холст".
-
- Рассчитывается для каждого минимума треугольника
canvas
Размер и положение прямоугольника.
- Рассчитывается для каждого минимума треугольника
-
-
- Вырежьте форму треугольника с помощью метода canvas.2DContext.clip().
Я определяю такой фрагмент какFragment
:
export interface Box {
x: number,
y: number,
w: number,
h: number
}
export default class Fragment {
public pointA: Array<number>; // 三角形顶点A
public pointB: Array<number>; // 三角形顶点B
public pointC: Array<number>; // 三角形顶点C
public box: Box; // 盒子
public centroid: Array<number>; // 中心
public canvas: HTMLCanvasElement; // canvas 元素
public ctx: CanvasRenderingContext2D | null; // canvas 2d ctx
// ...代码过多,有兴趣的可以看源码
}
Итак, как вы даете этиcanvas
Падают дальше?
Это также требует трех шагов:
- флип анимация
- продолжай становиться меньше
- сдвинься ближе к центру
код показывает, как показано ниже:
timeline.add({
targets: fragment.canvas,
scale: {
value: 0,
duration: 1000, // 变小
},
opacity: { // 变透明
value: 0,
duration: 400,
delay: delay + 600
},
left: canvasWidth/2 - fragment.box.w/2, // 移动向中心
top: canvasHeight/2 - fragment.box.h/2, // 移动向中心
rotateX: { // X轴翻转
value: rx,
duration: 400,
delay: delay + 600
},
rotateY: { // Y轴翻转
value: ry,
duration: 400,
delay: delay + 600
},
easing:'cubicBezier(0.420, 0.000, 1.000, 1.000)', // 贝塞尔曲线,缓=>快=>缓
duration: 1000,
}, delay);
Получить исходный код
Адрес источника:GitHub.com/Начало розыгрыша…