Spaces2D.vue 7,1 КБ
Newer Older
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
1
<template>
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  <div>
    <div
      id="loading-screen"
      style="
        position: absolute;
        width: 100%;
        height: 100%;
        background: white;
        z-index: 1000;
        display: flex;
        align-items: center;
        justify-content: center;
      "
    >
      <img src="images/logo.png" alt="Loading..." id="loading-logo" />
    </div>
    <div id="phaser-container"></div>
  </div>
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
20
21
22
</template>

<script lang="ts">
avathar's avatar
avathar включено в состав коммита
23
24
25
import 'phaser';
// import 'phaser3-rex-plugins/templates/ui/ui-plugin';
// import 'phaser3-rex-plugins/templates/ui/ui-components';
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
26
import CreateScrollablePanel from '../kanbans/CreateScrollablePanel';
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
27
28
import { useKanvasoStore } from 'src/stores/kanvaso';
import { mapActions, mapState } from 'pinia';
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
29
30
// import PreloadScene from './PreloadScene';
// import BootScene from './BootScene';
avathar's avatar
avathar включено в состав коммита
31
32
import { KanvasojKanvaso, TreeNode } from 'src/types/stores/kanvaso';

avathar's avatar
avathar включено в состав коммита
33
import { watch, computed } from 'vue';
avathar's avatar
avathar включено в состав коммита
34
import { Router, useRouter } from 'vue-router';
avathar's avatar
avathar включено в состав коммита
35

avathar's avatar
avathar включено в состав коммита
36
37
38
declare const window: {
  router: Router;
} & Window;
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
39

Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
40
class EndlessCanvas extends Phaser.Scene {
avathar's avatar
avathar включено в состав коммита
41
  [x: string]: any;
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
42
  rexUI: any;
avathar's avatar
avathar включено в состав коммита
43
44
  constructor() {
    super({
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
45
      key: 'endless-canvas',
avathar's avatar
avathar включено в состав коммита
46
    });
avathar's avatar
avathar включено в состав коммита
47
    this.store = useKanvasoStore();
avathar's avatar
avathar включено в состав коммита
48
    this.router = window.router;
avathar's avatar
avathar включено в состав коммита
49
  }
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
50

avathar's avatar
avathar включено в состав коммита
51
52
53
54
55
56
57
  preload() {
    this.load.scenePlugin(
      'rexuiplugin',
      'rexuiplugin.min.js',
      'rexUI',
      'rexUI',
    );
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
58
    this.load.image('icon', 'phaser/stretching_icon.png');
avathar's avatar
avathar включено в состав коммита
59
60
    //заполняем registry объектами холста
    this.store.getMap.forEach((element) => {
avathar's avatar
avathar включено в состав коммита
61
      this.registry.set(element.uuid, element);
avathar's avatar
avathar включено в состав коммита
62
63
64
    });
    console.log('this.registry :>> ', this.registry);
    //организуем слежение за getMap и в случае его изменения выясняем что изменилось и обновляем данные в registry
avathar's avatar
avathar включено в состав коммита
65

avathar's avatar
avathar включено в состав коммита
66
67
68
    const map = computed(() => this.store.getMap);
    watch(map, (newData, oldData) => {
      newData.forEach((element) => {
avathar's avatar
avathar включено в состав коммита
69
70
        const uuid = element.uuid;
        const oldElement = oldData.filter((el) => el.uuid === uuid)[0];
avathar's avatar
avathar включено в состав коммита
71
72
73
74
75
76
        if (JSON.stringify(element) !== JSON.stringify(oldElement)) {
          this.registry.set(uuid, element);
        }
      });
      //TODO: На данный момент таким образом можем реализовать только обновление существующих объектов. В случае добавления и удаления нужно дорабатывать метод или применять другие подходы. Например полный рестарт сцены (это очень нехорошо :))
      // Некоторые идеи к обдумыванию:
avathar's avatar
avathar включено в состав коммита
77
78
      // Добавляем обработку добавления новых элементов
      newData.forEach((element) => {
avathar's avatar
avathar включено в состав коммита
79
80
        if (!oldData.some((el) => el.uuid === element.uuid)) {
          this.registry.set(element.uuid, element);
avathar's avatar
avathar включено в состав коммита
81
82
83
84
        }
      });
      // Добавляем обработку удаления элементов
      oldData.forEach((element) => {
avathar's avatar
avathar включено в состав коммита
85
86
        if (!newData.some((el) => el.uuid === element.uuid)) {
          this.registry.remove(element.uuid);
avathar's avatar
avathar включено в состав коммита
87
88
        }
      });
avathar's avatar
avathar включено в состав коммита
89
90
      //Как обновлять реестр понятно. Не совсем понятно пока как убирать добавлять внутриигровые объекты
    });
avathar's avatar
avathar включено в состав коммита
91
  }
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
92

avathar's avatar
avathar включено в состав коммита
93
  create(): void {
avathar's avatar
avathar включено в состав коммита
94
95
96
97
98
99
100
101
102
    const back = this.add.text(0, 0, '<<', {
      fontSize: '24px',
      backgroundColor: '#000',
      color: '#fff',
    });
    back.setInteractive();
    back.on('pointerdown', () => {
      this.router.push('/projects');
    });
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
103
    this.cameras.main.setBackgroundColor('#abcdef');
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
104

Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
105
106
107
    // Скрываем экран загрузки здесь, потому что на этом этапе preload уже завершен
    document.getElementById('loading-screen').style.display = 'none';

avathar's avatar
avathar включено в состав коммита
108
109
110
111
112
113
114
115
    const topPanel = CreateScrollablePanel(
      this,
      this.store.getTree,
      this.registry,
    )
      .setPosition(400, 300)
      .layout();
    // .drawBounds(this.add.graphics(), 0xff0000)}
avathar's avatar
avathar включено в состав коммита
116
  }
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
117
118
119
}

const config: Phaser.Types.Core.GameConfig = {
avathar's avatar
avathar включено в состав коммита
120
121
  type: Phaser.AUTO,
  parent: 'phaser-container',
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
122
  width: window.innerWidth,
avathar's avatar
avathar включено в состав коммита
123
  height: window.innerHeight,
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
124

avathar's avatar
avathar включено в состав коммита
125
126
127
128
  scale: {
    mode: Phaser.Scale.FIT,
    autoCenter: Phaser.Scale.CENTER_BOTH,
  },
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
129
  scene: EndlessCanvas,
avathar's avatar
avathar включено в состав коммита
130
131
132
133
  plugins: {
    // scene: [
    //   {
    //     key: 'rexUI',
avathar's avatar
avathar включено в состав коммита
134
135
    //     //@ts-ignore
    //     plugin: RexPlugins,
avathar's avatar
avathar включено в состав коммита
136
137
138
139
140
    //     mapping: 'rexUI',
    //   },
    //   // ...
    // ],
  },
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
141
142
};

Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
143
export default {
avathar's avatar
avathar включено в состав коммита
144
  name: 'EndlessCanvas',
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  data() {
    return {
      wsSubscribe: null,
    };
  },
  computed: {
    ...mapState(useKanvasoStore, {
      project: 'getKanvaso',
    }),
    // ...mapState(useCurrentUserStore, { userId: 'getUserId' }),

    currentProject() {
      return this.project ? this.project[0]?.node : null;
    },
    projectUuid() {
      return this.$route?.params?.uuid || '';
    },
  },
avathar's avatar
avathar включено в состав коммита
163

Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
164
165
166
167
168
169
170
171
172
173
174
  methods: {
    ...mapActions(useKanvasoStore, [
      'onGetKanvasoFull',
      'onEditKanvasoObjekto',
      'onEditKanvaso',
      'onEditKanvasoLigilo',
      'onGetKanvasoObjekto',
      'onKanvasoSubscribe',
    ]),
  },
  async mounted() {
avathar's avatar
avathar включено в состав коммита
175
176
177
178
179
    interface KanvasojKanvasoResult {
      data?: {
        kanvasojKanvaso?: KanvasojKanvaso;
      };
    }
avathar's avatar
avathar включено в состав коммита
180
    document.getElementsByTagName('body')[0].style.overflow = 'hidden';
avathar's avatar
avathar включено в состав коммита
181

Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
182
    await this.onGetKanvasoFull({ uuid: this.projectUuid })
avathar's avatar
avathar включено в состав коммита
183
184
185
      .then((result: KanvasojKanvasoResult) => {
        if (!result.data.kanvasojKanvaso.edges.length) {
          throw new Error(result.toString());
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
186
187
188
        }
        this.onKanvasoSubscribe({
          kanvasoj: [this.currentProject.objId],
avathar's avatar
avathar включено в состав коммита
189
        }).then((data: any) => {
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
190
191
192
          this.wsSubscribe = data;
        });
      })
avathar's avatar
avathar включено в состав коммита
193
      .catch((err: any) => {
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
194
195
196
        console.log('error get kanvaso full :>> ', err);
        this.$router.replace({ name: 'projects' });
      });
avathar's avatar
avathar включено в состав коммита
197
    await this.onGetKanvasoObjekto({ kanvaso_Uuid: this.projectUuid });
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
198
199
200
201
202
203

    const resizeHandler = () => {
      game.scale.resize(window.innerWidth, window.innerHeight);
    };

    window.addEventListener('resize', resizeHandler);
avathar's avatar
avathar включено в состав коммита
204
    window.router = this.$router;
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
205
    const game = new Phaser.Game(config);
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
206

avathar's avatar
avathar включено в состав коммита
207
208
209
210
211
212
213
214
215
    // window.addEventListener('resize', function (event) {
    //   console.log('resize');
    //   game.scale.resize(
    //     window.innerWidth < 600 ? window.innerWidth : window.innerWidth - 205,
    //     window.innerWidth < 600
    //       ? window.innerHeight - 51
    //       : window.innerHeight - 10,
    //   );
    // });
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
216
217
218
219
220
221
222
223
    // setInterval(() => {
    //   game.scale.resize(
    //     window.innerWidth < 600 ? window.innerWidth : window.innerWidth - 205,
    //     window.innerWidth < 600
    //       ? window.innerHeight - 51
    //       : window.innerHeight - 10,
    //   );
    // }, 100);
avathar's avatar
avathar включено в состав коммита
224
  },
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
225
226
  beforeUnmount() {
    this.wsSubscribe.unsubscribe();
avathar's avatar
avathar включено в состав коммита
227
228
    document.getElementsByTagName('body')[0].style.overflow = 'auto';

avathar's avatar
avathar включено в состав коммита
229
    // delete window.objekto;
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
230
  },
avathar's avatar
avathar включено в состав коммита
231
};
Medvedev Anton's avatar
Medvedev Anton включено в состав коммита
232
</script>
avathar's avatar
avathar включено в состав коммита
233
234
235
236
237
<style>
#phaser-container > canvas {
  margin-top: 0 !important;
}
</style>