見出し画像

Vue3 + Konva で複数レイヤー

今回作るもの

前回は『Vue3+Konvaチュートリアル』と題しまして、Hello Worldのようなものを作りました。
今回はそれをベースに、複数のレイヤーを実装していきます。

サイケデリックなものができました

起動

まずは前回作ったものを起動して、ブラウザに表示させておきましょう。

npm run dev

ここからはApp.vueだけを編集していきます。

レイヤーを追加

まずは<template>を以下のようにしてください。
Konvaでは、基本的に後に記載したレイヤーが前面に来るようになっています。

<template>
  <v-stage :config="configKonva">

    <!-- 背景レイヤー -->
    <v-layer>
      <v-rect v-for="rectConfig in rectConfigs" :config="rectConfig"></v-rect>
    </v-layer>

    <!-- 前面レイヤー -->
    <v-layer>
      <v-circle :config="configCircle"></v-circle>
    </v-layer>

  </v-stage>
</template>

前回作った赤丸を『前面レイヤー』として、今回は『背景レイヤー』を付け足しました。
まだrectConfigsの中身が空っぽなので、見た目は変わってないと思います。

背景レイヤーに四角を大量表示

<script>
export default {
  data() {
    return {
      // 略
      rectConfigs: [],
    }
  },

  mounted() {
    // 四角を量産
    for (let i = 0; i < 50; i++) {
      this.rectConfigs.push({
        x: Math.random() * this.configKonva.width,
        y: Math.random() * this.configKonva.height,
        width: 50,
        height: 70,
        fill: Konva.Util.getRandomColor(),
      })
    }
  },
}

</script>

data()に配列rectConfigsを登録し、mounted()内でそれに大量のrect(四角)用のconfigを追加しています。
ここまでで、小さい範囲に大量の四角が表示され、その前面に赤丸が表示されていると思います。

調整

最後に、全体の表示範囲を600*400に大きくし、赤丸を中心に移動すれば、冒頭の画像の通り表示されたと思います。

App.vueの全体はこの通りです。

<template>
  <v-stage :config="configKonva">

    <!-- 背景レイヤー -->
    <v-layer>
      <v-rect v-for="rectConfig in rectConfigs" :config="rectConfig"></v-rect>
    </v-layer>

    <!-- 前面レイヤー -->
    <v-layer>
      <v-circle :config="configCircle"></v-circle>
    </v-layer>

  </v-stage>
</template>

<script>
export default {
  data() {
    return {
      configKonva: {
        width: 600,
        height: 400
      },
      configCircle: {
        x: 300,
        y: 200,
        radius: 70,
        fill: "red",
        stroke: "black",
        strokeWidth: 4,
        draggable: true,
      },
      rectConfigs: [],
    }
  },

  mounted() {
    // 四角を量産
    for (let i = 0; i < 50; i++) {
      this.rectConfigs.push({
        x: Math.random() * this.configKonva.width,
        y: Math.random() * this.configKonva.height,
        width: 50,
        height: 70,
        fill: Konva.Util.getRandomColor(),
      })
    }
  },
}

</script>

前回最後にこっそり記載した`draggable: true`も追記してありますので、赤丸をドラッグアンドドロップできるようになっています。

マウスで赤丸を右下に移動してみました

以上です!お疲れ様でした!