4
6

More than 1 year has passed since last update.

Vue3 Composition API + TypeScriptでp5.jsを動かす

Last updated at Posted at 2021-11-14

これはなに

タイトル通りの環境をさくさくと作っていこうというものです。
ProcessingのJavaScriptライブラリ、p5.jsに手を出してみようと思ったのでVue.jsで環境を作ることにしました。

TypeScriptは必須ではないですが、ライブラリを使用する際は補完が強力なので追加します。

"vue": "^3.0.0"
"eslint": "^6.7.2"
"prettier": "^2.2.1"
"p5: 1.4.0"
"typescript": "~4.1.5"
"@types/p5: 1.3.1

Vue CLIで環境を構築する

まずvue cliのバージョンを上げます。

yarn global add @vue/cli

vue -V
@vue/cli 4.5.13

CLIの設定でVueの3系を選択。
Linter, TypeScriptにチェック。
このへんの解説は下の記事が詳しいです。
https://qiita.com/Junpei_Takagi/items/603d44f7885bd6519de2

prettierの設定

自動フォーマットを有効にしたいのでprettierの設定をします。

https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint
https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode
をインストールし、settings.jsonに下記を記述する。

{
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },

  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}

これでsave時に自動フォーマットが機能します。

routerの設定

今回はvue routerを使用しているので、不要なrouteを削除します。
またIndex.vueを作成したのでそれを適用させます。

今までコンポーネントをimportしてそれをcomponent要素に充てていたのですが、
関数に置き換えてroute単位で読み込めるみたい。

import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";

const routes: Array<RouteRecordRaw> = [
  {
    path: "/",
    name: "Index",
    component: () => import("../views/Index.vue"),
  },
];

const router = createRouter({
  history: createWebHashHistory(),
  routes,
});

export default router;

p5.jsをインストール

yarn add p5

型も追加

yarn add @types/p5

描画する

ソースコードはGenerative Design with p5.jsを参考にし、それをVueで動くように修正したものです。
またp5.jsの各関数の動きについてはコード内のコメントをご覧ください。

<template>
  <p>Y座標: {{ positionY }}</p>
  <p>X座標: {{ positionX }}</p>
</template>

<script lang="ts">
import { defineComponent, ref } from "vue";
import p5 from "p5";

export default defineComponent({
  name: "Index",
  setup() {
    const positionY = ref(0);
    const positionX = ref(0);

    const sketch = (p: p5) => {
      p.setup = () => {
        p.createCanvas(720, 720);
        // カラーモデルをHSBに
        p.colorMode(p.HSB, 360, 100, 100);
        // 矩形を描画方法を指定する
        p.rectMode(p.CENTER);
        // 矩形の枠線を隠す
        p.noStroke();
      };

      p.draw = () => {
        positionY.value = p.mouseY;
        positionX.value = p.mouseX;

        // 背景色を現在のカラーモードで指定
        // 色相、再度、明度
        p.background(p.mouseY / 2, 100, 100);
        // 図形の色を現在のカラーモードで指定
        // 背景の反転色を表現する
        p.fill(360 - p.mouseY / 2, 100, 100);
        // 図形の描画(1px ~ 720pxの間で大きさが変わる)
        // X座標, Y座標, width, height
        p.rect(360, 360, p.mouseX + 1, p.mouseX + 1);
      };
    };

    new p5(sketch);

    return {
      positionY,
      positionX,
    };
  },
});
</script>

vueとp5.jsの準備

import { defineComponent, ref } from "vue";
import p5 from "p5";

Composition APIを使用するためのdefineComponentと、
マウス座標を画面に表示するためrefを。
そしてp5をimportします。

マウス座標を参照するrefオブジェクトを用意

const positionY = ref(0);
const positionX = ref(0);

座標を画面に表示するためのrefオブジェクトを用意します。

描画前の準備

p.setup = () => {
  p.createCanvas(720, 720);
  // カラーモデルをHSBに
  p.colorMode(p.HSB, 360, 100, 100);
  // 矩形を描画方法を指定する
  p.rectMode(p.CENTER);
  // 矩形の枠線を隠す
  p.noStroke();
};

p5が持つsetup関数で描画前の準備を定義します。

描画

p.draw = () => {
  positionY.value = p.mouseY;
  positionX.value = p.mouseX;

  // 背景色を現在のカラーモードで指定
  // 色相、再度、明度
  p.background(p.mouseY / 2, 100, 100);
  // 図形の色を現在のカラーモードで指定
  // 背景の反転色を表現する
  p.fill(360 - p.mouseY / 2, 100, 100);
  // 図形の描画(1px ~ 720pxの間で大きさが変わる)
  // X座標, Y座標, width, height
  p.rect(360, 360, p.mouseX + 1, p.mouseX + 1);
};  

draw関数で図形を描画します。
このdraw関数は1秒間に60回レンダリングを行い、
背景色や物体のカラーがレンダリング時のマウス座標で変化します。

p5をnewする

new p5(sketch);

setupとdrawを持つsketch関数を引数にとり、new。

座標の表示

<template>
  <p>Y座標: {{ positionY }}</p>
  <p>X座標: {{ positionX }}</p>
</template>

setup関数でreturnしたrefオブジェクトをtemplateタグ内に置きます。

実行

マウスの位置が変わることで、背景と矩形の色が変わる状態を描画できました。

p5.js test.gif

4
6
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
4
6