LoginSignup
8
1

人間を作ったよ!!!

Last updated at Posted at 2023-12-08

はじめに

クソアプリ Advent Calendar 2023 カレンダー2 の9日目の記事です。

人間

今年は人間(うんちせいぞうき)を作りました

普段ウンチを使いたいときに自分の気に入ったウンチが見つからないことが多かったので手軽に作れるようにしたいと思い、人間を作りました

作ったウンチはSVGとしてDLできるようにしているのでご自由に利用してください。

利用した技術

いつもの

  • next
  • emotion

状態管理

  • jotai

色のピッカー

  • react-color

SVGモーフィング

  • react-spring
  • flubber

作ってる途中でrecoilが保守されないらしいと聞いたのでjotaiに乗り換えてみました
jotaiは結構使いやすいのでオススメです。

こだわった点

SVGモーフィング

モーフィング
ある画像から別の画像へ、連続的に変形させる表現らしいです。
どうしてもうんちをぬるぬる変化させたかったのでモーフィングさせてみました。

  • モーフィングなし

モーフィングなし.gif

  • モーフィングあり

モーフィングあり.gif

モーフィングある方が可愛いですよね!

type Props = {
  unchi: () => string;
};
function SVGMorphing({ unchi }: Props) {
  const [color] = useAtom(colorAtom);
  const animationProps = useSpring({
    from: { x: 0 },
    to: {
      x: 1,
    },
    config: {
      tension: 150, // テンションを調整
      friction: 10, // 摩擦を調整
    },
    reset: true,
  });

  return (
    <svg viewBox="0.00 0.00 150.00 150.00" id="dl-svg" css={Canvas}>
      <animated.path d={animationProps.x.to(unchi)} fill={color} />
      <MayuSvg></MayuSvg>
      <EyeSvg></EyeSvg>
      <MouseSvg></MouseSvg>
      <ItemSvg></ItemSvg>
    </svg>
  );
}

SVGMorphingの呼び出し側はこんな感じ

  const [widthIndex, setWidthIndex] = useState(0);
  const [heightIndex, setHeightIndex] = useState(0);
  const [interpolators, setInterpolators] = useState({
    unchi: () => unchi[heightIndex][widthIndex],
  });

  return (
    <div>
      <SVGMorphing unchi={interpolators.unchi}></SVGMorphing>
      (中略)
    </div>
  );

妥協したところ

本当はURLにパラメーターを渡して動的OGPを作りたかったのですが
パーツの位置や大きさなどを設定するのが難しくて諦めました...
と思ったけど時間ができたので実装しました

がvercelの無料枠だとできないみたいです

Error: The Edge Function "api/og" size is 1.07 MB and your plan size limit is 1 MB. Learn More: https://vercel.link/edge-function-size

SVG使いまくってるからこれ以上減らすところがなく...
残念ながら諦めました。石油王だったらProプランにできたのに...

ちなみにNextの機能に乗ったらかなり簡単に動的OGPに対応できるので開発体験は良かったです。

あとがき

「自分なんてうんちせいぞうきだよ~」って自虐する人は是非SVGでDLできるようになってください。

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1