
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
今日は最近作成した、このWordPressブログの
ヘッダーアニメーションの作り方について解説するぜ!
ヘッダーアニメーションの作り方について解説するぜ!

エレキベア
確か表示する度に形状が変わるようになってるクマね

マイケル
その通り!
これはProcessingというデジタルアートのプログラミング言語をJavaScriptに移植した、
p5.jsを使用して作成したんだ!
これはProcessingというデジタルアートのプログラミング言語をJavaScriptに移植した、
p5.jsを使用して作成したんだ!

エレキベア
確か前ゲーム数学を勉強していた時にも使用していたクマね

マイケル
使ったことがあったのと、今回のアニメーションは簡単な図形の組み合わせで実現できそうだったから使ってみたんだ!
さっそく作り方をみていこう!!
さっそく作り方をみていこう!!

エレキベア
楽しみクマ〜〜〜
p5jsの導入と動作確認

マイケル
まず前提として、開発環境は下記のようにTypeScript、Stylus環境を構築しているものとして進めていきます。

エレキベア
p5をTypeScriptで書くのは楽しみクマね
型定義のインストール

マイケル
まずはp5.jsの型定義を下記コマンドでインストールします。
また、WordPress環境に搭載されているjQueryも使用するため、こちらも合わせてインストールします。
また、WordPress環境に搭載されているjQueryも使用するため、こちらも合わせてインストールします。
↑TypeScriptとjQueryの型定義をインストール

マイケル
p5.js自体もnpm install出来るのですが、今回はwebpack等も使用しないため
別途ダウンロードして配置することとしました。
別途ダウンロードして配置することとしました。

エレキベア
あくまで型定義だけ出来るようにしたわけクマね

マイケル
インストールしたら下記のように型定義ファイルに定義するのみ!
これによりtsファイル内で扱える様になります。
これによりtsファイル内で扱える様になります。
↑型を定義する

エレキベア
導入は楽勝クマ〜〜〜
p5.min.jsの配置と読み込み

マイケル
次にp5自身をダウンロードしてブログの任意の場所に配置します。
下記の公式サイトからp5.min.jsを選んでダウンロードしましょう。
下記の公式サイトからp5.min.jsを選んでダウンロードしましょう。

エレキベア
これが本体クマか・・・

マイケル
配置したらPHPファイル内で下記のように読み込みます。
↑jsファイルの読み込み

マイケル
これでp5の導入は完了です!

エレキベア
早く使いたいクマ〜〜〜
ヘッダーに挿入する

マイケル
導入が完了したら、簡単に動作確認してみましょう!
下記のようにコードを書いてブラウザで見てみます。
下記のようにコードを書いてブラウザで見てみます。
↑とりあえずCanvasを表示してみる

マイケル
このように表示されれば導入は成功です!

エレキベア
(ヘッダがぶっ壊れたクマ・・・)
ヘッダー全体に描画する

マイケル
次はヘッダー全体にp5のCanvasを表示させてみましょう。
コードを下記のように修正して、ヘッダーのサイズからCanvasを生成し、
style指定をサイズ100%、object-fitをcover(領域全体表示)にします!
コードを下記のように修正して、ヘッダーのサイズからCanvasを生成し、
style指定をサイズ100%、object-fitをcover(領域全体表示)にします!
↑ヘッダー全体にCanvasを表示させる
↑読み込みが完了したら表示させる

マイケル
するとこのように全体に表示されることが確認できました。
これで土台は完璧です・・・!
これで土台は完璧です・・・!

エレキベア
これでやりたい放題クマ〜〜〜
アニメーションを実装する

マイケル
あとは自由にアニメーションを実装していくのみ!
p5.jsは多くのゲームエンジンと同じく開始処理、更新処理が用意されているので、
普段ゲーム開発を行っている皆さんなら簡単に作れると思います!
p5.jsは多くのゲームエンジンと同じく開始処理、更新処理が用意されているので、
普段ゲーム開発を行っている皆さんなら簡単に作れると思います!

エレキベア
ゲームプログラミング感覚で出来るクマね

マイケル
コードは全部載せきれないので、作った順序に沿って
要所要所を載せていこうかと思います。
要所要所を載せていこうかと思います。
ビルのランダム生成

マイケル
まずはビルを生成してみましょう。
今回は高さをランダムで決めてニョキっと生えるアニメーションにしたいので、
目的の高さをコンストラクタで受け取り、更新処理内で目的の高さまで伸ばすようにしてみます。
今回は高さをランダムで決めてニョキっと生えるアニメーションにしたいので、
目的の高さをコンストラクタで受け取り、更新処理内で目的の高さまで伸ばすようにしてみます。
↑ビルクラスの作成

エレキベア
シンプルな構成になっているクマね

マイケル
伸ばす動きには勢いを付けたいのでイージング関数を使用しています。
こちらも簡単に実装できるので試してみてください!
こちらも簡単に実装できるので試してみてください!
↑イージング関数の実装

エレキベア
アニメーションの鉄板クマね

マイケル
あとはこのビルクラスをランダムな高さを与える様に生成して
更新処理内で更新、描画するようにすれば完了です!
更新処理内で更新、描画するようにすれば完了です!
↑ランダムに生成する
↑更新・描画処理

マイケル
ブラウザで確認するとこのようにニョキっと生えてくるはずです!!

エレキベア
これは楽しいクマ〜〜〜
窓のランダム生成

マイケル
次に生成したビルの中に窓を配置してみます。
今回は横は3列固定として、高さに入る分だけ配置してみました!
今回は横は3列固定として、高さに入る分だけ配置してみました!
↑ビルクラスの中で窓情報も設定
↑窓の描画処理

マイケル
上記を追加で実装すると、このように窓も表示されることを確認できます。
ランダムで消灯させているのがミソですね!
ランダムで消灯させているのがミソですね!

エレキベア
それっぽくなってきたクマね〜〜

マイケル
あとは同様に丸い窓も生成するように実装しました!
パーティクルの表示

マイケル
最後に、背景にシャボン玉のようなパーティクルを表示させてみましょう!
下記のように上下をスクロールするように移動させ、大きさが変化するようにすれば完了です!
下記のように上下をスクロールするように移動させ、大きさが変化するようにすれば完了です!
↑パーティクルクラスの作成

マイケル
横に揺らすのはsin関数を使用しています!
こちらも定番ですね!
こちらも定番ですね!

エレキベア
三角関数はマジで使えるクマ〜〜

マイケル
あとはこれを適当な数だけ生成すると、
下記のように背景で浮かぶシャボン玉が確認できます!
下記のように背景で浮かぶシャボン玉が確認できます!

エレキベア
レモンスカッシュみたいで美味そうクマ

マイケル
これで完成!!
・・・と思いきや、さすがにこの数だけ生成すると、古い端末ではカクカクだったため
数を減らして調整しました・・・。
・・・と思いきや、さすがにこの数だけ生成すると、古い端末ではカクカクだったため
数を減らして調整しました・・・。

エレキベア
微炭酸になったクマね
リサイズ処理

マイケル
リサイズ処理についての補足になるのですが、
リサイズ検知の度に生成しなおすのはうざったいため、timerを使用して一定間隔で処理するのが現実的です。
リサイズ検知の度に生成しなおすのはうざったいため、timerを使用して一定間隔で処理するのが現実的です。
↑timerを使用して一定間隔で処理を行う

マイケル
また、iOSでは何故かスクロールする度にリサイズ検知されてしまうという不具合が発生したため、横幅が一定の幅以上変更された場合にのみ行うよう対処してあります・・・。

エレキベア
カナシマシマシクマ・・・。
処理負荷対策

マイケル
最後におまけとして、処理負荷対策についても紹介しておきます。

エレキベア
負荷はある程度はありそうクマからね
フレームレートの設定とdeltaTimeの使用

マイケル
p5.jsではデフォルトで60FPSに設定されているため、
調整しておくことをおすすめします。アニメーションであれば30FPSあれば充分ですね。
調整しておくことをおすすめします。アニメーションであれば30FPSあれば充分ですね。
↑フレームレート設定

エレキベア
ゲームなら60欲しいところクマね

マイケル
そしてこちらは基本になりますが、動きにはdeltaTimeを使用してフレームレートが落ちた際にも速度は変わらないようにしておきます。
P5.jsに用意されていますが、単位がmsになっていたためそこは注意が必要です。
P5.jsに用意されていますが、単位がmsになっていたためそこは注意が必要です。
↑deltaTimeを使用した移動

エレキベア
ゲーム開発の定番クマね
画面に映っていない時は停止する

マイケル
そしてもう一点、画面に映っていない間はアニメーションを停止
させるようにしました。
こちらはスクロール範囲にターゲット(ヘッダー)が入っているかどうかでフラグを設定するようにしています。
させるようにしました。
こちらはスクロール範囲にターゲット(ヘッダー)が入っているかどうかでフラグを設定するようにしています。
↑スクロール検知処理
↑ターゲットがスクロール範囲に入っているか

エレキベア
なるほどクマ
確かに記事読んでいる間もずっと動いていたら大迷惑クマ
確かに記事読んでいる間もずっと動いていたら大迷惑クマ

マイケル
対策は今のところこれくらいしかしていないけど、
もし全然動作しない!みたいな声が出てきた時には、「フレームレートが一定以下だったら画像に差し替える」ような対策も検討しようかと思っています!
もし全然動作しない!みたいな声が出てきた時には、「フレームレートが一定以下だったら画像に差し替える」ような対策も検討しようかと思っています!

エレキベア
問題ないことを祈るクマ・・・
p5jsの表示タイミングが遅い

マイケル
処理負荷対策とは少し話がずれるかもしれませんが、DOMContentLoadedで読みこんでいるのに表示タイミングが遅いような・・・と感じる場面が出てくると思います。
それはp5.jsのsetup関数がHTMLのload後に呼ばれるためです。
それはp5.jsのsetup関数がHTMLのload後に呼ばれるためです。

エレキベア
なんと、そうだったのクマね・・・

マイケル
p5.jsの方を変えるのは恐らく難しいと思うので、その場合はHTMLのload自体を早くするのがよいと思います。
lazyloadというJavaScriptライブラリを導入すれば画像読み込みを遅延させることができるので、こちらも検討してみてください!
lazyloadというJavaScriptライブラリを導入すれば画像読み込みを遅延させることができるので、こちらも検討してみてください!

エレキベア
導入するのも簡単そうクマね
おわりに

マイケル
というわけで今回はp5でヘッダアニメーションを作成してみました!
どうだったかな??
どうだったかな??

エレキベア
こんなお手軽で高機能なライブラリがブラウザ上で使えるなんて驚いたクマ
もっといろいろ作ってみたいクマね
もっといろいろ作ってみたいクマね

マイケル
せっかくだからp5.jsでゲームを作ってみるのも面白そうだなと思ったよ!
また機会があったら触ってみよう!!
また機会があったら触ってみよう!!

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜
【ブログ改造計画】WordPressのヘッダアニメーションをp5.jsで実装する【WordPress】〜完〜