fun: snow ;3
This commit is contained in:
parent
d88d600ef8
commit
b270223f4b
BIN
app/src/assets/flakes.png
Normal file
BIN
app/src/assets/flakes.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
|
@ -51,6 +51,7 @@ const App = () => {
|
||||||
// eslint-disable-next-line react/jsx-props-no-spreading
|
// eslint-disable-next-line react/jsx-props-no-spreading
|
||||||
{...(desktop ? {} : isAnonymous || handlers)}
|
{...(desktop ? {} : isAnonymous || handlers)}
|
||||||
>
|
>
|
||||||
|
<div className="snow" />
|
||||||
<Header
|
<Header
|
||||||
onButton={(type) => {
|
onButton={(type) => {
|
||||||
const offset = parseInt(ref.current.style.left || `-${paneWidth}px`, 10);
|
const offset = parseInt(ref.current.style.left || `-${paneWidth}px`, 10);
|
||||||
|
|
|
@ -66,3 +66,15 @@
|
||||||
padding: 0.4em;
|
padding: 0.4em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.snow {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
canvas {
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,8 @@
|
||||||
"index.js.map"
|
"index.js.map"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"debug": "4.3.1"
|
"debug": "4.3.1",
|
||||||
|
"pixi.js": "^5.3.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@neutrinojs/airbnb-base": "^9.4.0",
|
"@neutrinojs/airbnb-base": "^9.4.0",
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
import * as PIXI from 'pixi.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
hooks: {
|
||||||
|
'@latus/http/client/up': async () => {
|
||||||
|
const f = window.innerHeight / window.innerWidth;
|
||||||
|
const w = window.innerWidth;
|
||||||
|
const h = w * f;
|
||||||
|
const app = new PIXI.Application({
|
||||||
|
height: h,
|
||||||
|
transparent: true,
|
||||||
|
width: w,
|
||||||
|
});
|
||||||
|
const fps = 60;
|
||||||
|
const ms = 1000 / fps;
|
||||||
|
app.ticker.maxFPS = fps;
|
||||||
|
window.document.querySelector('.snow').appendChild(app.view);
|
||||||
|
const gravity = 1;
|
||||||
|
const twoPi = Math.PI * 2;
|
||||||
|
const slowMotion = 10;
|
||||||
|
const baseTexture = PIXI.BaseTexture.from('/flakes.png');
|
||||||
|
await new Promise((r) => baseTexture.once('loaded', r));
|
||||||
|
const flakes = [];
|
||||||
|
for (let y = 0; y < 16; ++y) {
|
||||||
|
for (let x = 0; x < 16; ++x) {
|
||||||
|
const texture = new PIXI.Texture(baseTexture);
|
||||||
|
texture.frame = {
|
||||||
|
x: x * 32,
|
||||||
|
y: y * 32,
|
||||||
|
width: 32,
|
||||||
|
height: 32,
|
||||||
|
};
|
||||||
|
texture.updateUvs();
|
||||||
|
flakes.push(texture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const waves = 8;
|
||||||
|
for (let i = 0; i < waves; ++i) {
|
||||||
|
const fac = (waves - i);
|
||||||
|
const perWave = fac * (fac * 15) * w * 0.0001;
|
||||||
|
for (let j = 0; j < perWave; ++j) {
|
||||||
|
const sprite = new PIXI.Sprite(
|
||||||
|
flakes[Math.floor(Math.random() * flakes.length)],
|
||||||
|
);
|
||||||
|
sprite.alpha = 0.25 + Math.random() * 0.75;
|
||||||
|
const scale = i / 0.7;
|
||||||
|
const s = (scale + 2) * 0.045;
|
||||||
|
sprite.scale.x = s;
|
||||||
|
sprite.scale.y = s;
|
||||||
|
sprite.size = scale + 4;
|
||||||
|
sprite.sway = Math.random() * 1;
|
||||||
|
sprite.align = Math.random() * twoPi;
|
||||||
|
sprite.x = Math.random() * w;
|
||||||
|
sprite.y = Math.random() * h;
|
||||||
|
app.stage.addChild(sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let s = 0;
|
||||||
|
app.ticker.add(() => {
|
||||||
|
const ts = ms / (1000 / slowMotion);
|
||||||
|
for (let i = 0; i < app.stage.children.length; i++) {
|
||||||
|
const snowflake = app.stage.children[i];
|
||||||
|
snowflake.angle += (snowflake.sway - 0.5) * 2;
|
||||||
|
snowflake.position.x += ts * snowflake.sway * Math.sin(s + snowflake.align);
|
||||||
|
snowflake.position.y += ts * gravity * snowflake.size;
|
||||||
|
if (snowflake.position.y >= h + 5) {
|
||||||
|
snowflake.position.y = -5;
|
||||||
|
snowflake.sway = Math.random() * 1;
|
||||||
|
snowflake.align = Math.random() * twoPi;
|
||||||
|
snowflake.x = Math.random() * w;
|
||||||
|
}
|
||||||
|
const r = Math.random() * 5;
|
||||||
|
const r2 = r / 2;
|
||||||
|
const rx = (Math.random() * r) - r2;
|
||||||
|
const ry = (Math.random() * r) - r2;
|
||||||
|
snowflake.position.x += rx / slowMotion;
|
||||||
|
snowflake.position.y += ry / slowMotion;
|
||||||
|
}
|
||||||
|
s += 0.01;
|
||||||
|
if (s >= twoPi) {
|
||||||
|
s -= twoPi;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
|
@ -0,0 +1 @@
|
||||||
|
export default {};
|
5730
packages/fun/yarn.lock
Normal file
5730
packages/fun/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user