220 lines
5.6 KiB
TypeScript
220 lines
5.6 KiB
TypeScript
import { Ticker } from "@/components/shared/pixi/Pixi";
|
|
import { sleep } from "@/utils/sleep";
|
|
|
|
import { CELL_SIZE, MAIN_COLOR } from "./cell";
|
|
import AnimatedRect, { IAnimatedRect } from "./components/AnimatedRect";
|
|
import { IBlinkingContainer } from "./components/BlinkingContainer";
|
|
import Dot from "./components/Dot";
|
|
|
|
type Props = Parameters<Ticker>[0] & {
|
|
x: number;
|
|
y: number;
|
|
blinkingContainer: IBlinkingContainer;
|
|
anchorGraphic: IAnimatedRect;
|
|
};
|
|
|
|
export default async function scrape(props: Props) {
|
|
const rects = Array.from({ length: 15 }, () => {
|
|
return AnimatedRect({
|
|
app: props.app,
|
|
x: CELL_SIZE / 2,
|
|
y: CELL_SIZE / 2,
|
|
width: 10,
|
|
height: 10,
|
|
radius: 0,
|
|
color: MAIN_COLOR,
|
|
});
|
|
});
|
|
|
|
const dots = Array.from({ length: 25 }, () => {
|
|
return Dot({
|
|
x: CELL_SIZE / 2,
|
|
y: CELL_SIZE / 2,
|
|
app: props.app,
|
|
});
|
|
});
|
|
|
|
dots.forEach((dot) =>
|
|
props.blinkingContainer.container.addChild(dot.graphic),
|
|
);
|
|
|
|
await sleep(500);
|
|
|
|
await Promise.all(
|
|
[
|
|
[0, 12, 13, 14].map((index) =>
|
|
dots[index].animate({ x: 30, y: 30 }, { delay: 0.2 }),
|
|
),
|
|
[1, 15, 16, 17].map((index) =>
|
|
dots[index].animate({ x: CELL_SIZE - 30, y: 30 }, { delay: 0.2 }),
|
|
),
|
|
[2, 18, 19, 20].map((index) =>
|
|
dots[index].animate({ x: 30, y: CELL_SIZE - 30 }, { delay: 0.2 }),
|
|
),
|
|
[3, 21, 22, 23].map((index) =>
|
|
dots[index].animate(
|
|
{ x: CELL_SIZE - 30, y: CELL_SIZE - 30 },
|
|
{ delay: 0.2 },
|
|
),
|
|
),
|
|
|
|
props.anchorGraphic.animate({
|
|
radius: 0,
|
|
width: 12,
|
|
height: 12,
|
|
}),
|
|
].flat(),
|
|
);
|
|
|
|
rects.forEach((rect) =>
|
|
props.blinkingContainer.container.addChild(rect.graphic),
|
|
);
|
|
|
|
rects.unshift(props.anchorGraphic);
|
|
|
|
await sleep(500);
|
|
|
|
props.blinkingContainer.blink({ delay: 0.1 });
|
|
await props.blinkingContainer.shrink();
|
|
|
|
await Promise.all(
|
|
[
|
|
[0, 12, 13, 14].map((index) => dots[index].animate({ x: 22, y: 22 })),
|
|
[1, 15, 16, 17].map((index) =>
|
|
dots[index].animate({ x: CELL_SIZE - 22, y: 22 }),
|
|
),
|
|
[2, 18, 19, 20].map((index) =>
|
|
dots[index].animate({ x: 22, y: CELL_SIZE - 22 }),
|
|
),
|
|
[3, 21, 22, 23].map((index) =>
|
|
dots[index].animate({ x: CELL_SIZE - 22, y: CELL_SIZE - 22 }),
|
|
),
|
|
|
|
dots[4].animate({ x: 40, y: 22 }),
|
|
dots[5].animate({ x: 22, y: 40 }),
|
|
dots[6].animate({ x: CELL_SIZE - 22, y: 40 }),
|
|
dots[7].animate({ x: 40, y: 58 }),
|
|
|
|
dots[8].animate({ x: 40, y: 22 }),
|
|
dots[9].animate({ x: 22, y: 40 }),
|
|
dots[10].animate({ x: CELL_SIZE - 22, y: 40 }),
|
|
dots[11].animate({ x: 40, y: 58 }),
|
|
|
|
rects[0].animate({ width: 10, height: 10 }),
|
|
rects.slice(0, 4).map((rect) => rect.animate({ x: 31, y: 31 })),
|
|
rects
|
|
.slice(4, 8)
|
|
.map((rect) => rect.animate({ x: CELL_SIZE - 31, y: 31 })),
|
|
rects
|
|
.slice(8, 12)
|
|
.map((rect) => rect.animate({ x: 31, y: CELL_SIZE - 31 })),
|
|
rects
|
|
.slice(12, 16)
|
|
.map((rect) => rect.animate({ x: CELL_SIZE - 31, y: CELL_SIZE - 31 })),
|
|
].flat(),
|
|
);
|
|
|
|
await sleep(1000);
|
|
|
|
props.blinkingContainer.blink({ delay: 0.1 });
|
|
await props.blinkingContainer.shrink();
|
|
|
|
await Promise.all(
|
|
[
|
|
dots[0].animate({ x: 4, y: 4 }),
|
|
dots[1].animate({ x: CELL_SIZE - 4, y: 4 }),
|
|
dots[2].animate({ x: 4, y: CELL_SIZE - 4 }),
|
|
dots[3].animate({ x: CELL_SIZE - 4, y: CELL_SIZE - 4 }),
|
|
dots[4].animate({ x: 40, y: 4 }),
|
|
dots[5].animate({ x: 4, y: 40 }),
|
|
dots[6].animate({ x: 76, y: 40 }),
|
|
dots[7].animate({ x: 40, y: 76 }),
|
|
|
|
dots[13].animate({ x: 22, y: 4 }),
|
|
dots[14].animate({ x: 4, y: 22 }),
|
|
dots[16].animate({ x: 58, y: 4 }),
|
|
dots[17].animate({ x: 76, y: 22 }),
|
|
dots[19].animate({ x: 4, y: 58 }),
|
|
dots[20].animate({ x: 22, y: 76 }),
|
|
dots[22].animate({ x: 58, y: 76 }),
|
|
dots[23].animate({ x: 76, y: 58 }),
|
|
|
|
rects.map((rect, index) => {
|
|
const quadrant = Math.floor(index / 4);
|
|
const position = index % 4;
|
|
|
|
const col = (position % 2 === 0 ? 1 : 2) + (quadrant % 2 === 0 ? 0 : 2);
|
|
const row = Math.floor(position / 2) + (quadrant < 2 ? 1 : 3);
|
|
|
|
return rect.animate({
|
|
x: 13 + (col - 1) * 18,
|
|
y: 13 + (row - 1) * 18,
|
|
});
|
|
}),
|
|
].flat(),
|
|
);
|
|
|
|
await sleep(1200);
|
|
|
|
Promise.all(
|
|
dots.map((dot) =>
|
|
dot.animate({ alpha: 0 }, { delay: Math.random() * 0.3 }),
|
|
),
|
|
);
|
|
|
|
await sleep(100);
|
|
|
|
props.blinkingContainer.blink({ delay: 0.2 });
|
|
|
|
const newWidths: number[] = [];
|
|
|
|
for (let i = 0; i < rects.length; i++) {
|
|
if (i % 2 === 0) {
|
|
newWidths.push(20 + Math.random() * 28);
|
|
} else {
|
|
const remainingSpace = 62 - newWidths[i - 1];
|
|
newWidths.push(10 + Math.random() * remainingSpace);
|
|
}
|
|
}
|
|
|
|
await Promise.all([
|
|
rects.map((rect, index) => {
|
|
const y = 8 + Math.floor(index / 2) * 6 + Math.floor(index / 4) * 8;
|
|
|
|
return rect.animate(
|
|
{
|
|
y,
|
|
x:
|
|
(index % 2 === 0 ? 8 : newWidths[index - 1] + 10) +
|
|
newWidths[index] / 2,
|
|
height: 4,
|
|
width: newWidths[index],
|
|
},
|
|
{
|
|
delay: Math.random() * 0.1,
|
|
},
|
|
);
|
|
}),
|
|
]);
|
|
|
|
props.blinkingContainer.blink({ delay: 0.1 });
|
|
|
|
await sleep(2000);
|
|
|
|
await Promise.all(
|
|
[
|
|
rects.map((rect) =>
|
|
rect.animate(props.anchorGraphic.defaultProps, {
|
|
delay: Math.random() * 0.3,
|
|
duration: 0.3,
|
|
}),
|
|
),
|
|
].flat(),
|
|
);
|
|
|
|
rects.shift();
|
|
|
|
rects.forEach((rect) => rect.graphic.destroy());
|
|
dots.forEach((dot) => dot.graphic.destroy());
|
|
}
|