88 <cw-panel-unit-preview v-if =" selectedUnit" :unit =" selectedUnit" >
99 <template #actions >
1010 <cw-button @click =" onClickRotate" >Rotate</cw-button >
11+ <cw-button
12+ v-if =" canPlaced"
13+ :selected =" !!placedUnit"
14+ @click =" onClickPlacement"
15+ >Move</cw-button
16+ >
1117 </template >
1218 </cw-panel-unit-preview >
1319 <cw-panel-camera-control v-if =" app" :app =" app" />
1622
1723<script lang="ts" setup>
1824import Renderer from ' ./Renderer.vue' ;
19- import { markRaw , nextTick , onMounted , onUnmounted , ref , type Raw } from ' vue' ;
20- import { Subscription } from ' rxjs' ;
25+ import {
26+ computed ,
27+ markRaw ,
28+ nextTick ,
29+ onMounted ,
30+ onUnmounted ,
31+ ref ,
32+ type Raw
33+ } from ' vue' ;
34+ import { fromEvent , Subscription } from ' rxjs' ;
2135import { Vector2 } from ' three' ;
2236import Player from ' ../lib/classes/Player' ;
2337import App from ' ../lib/classes/App' ;
@@ -37,7 +51,6 @@ const rendererEl = ref<InstanceType<typeof Renderer> | null>(null);
3751const subscription = new Subscription ();
3852
3953const dimension = ref <Vector2 >();
40- let resizeObserver: ResizeObserver ;
4154
4255setupFonts ();
4356defineProps <{
@@ -46,6 +59,9 @@ defineProps<{
4659
4760const app = ref <App >();
4861const selectedUnit = ref <Raw <Unit > | null >(null );
62+ const placedUnit = ref <Raw <Unit > | null >(null );
63+ const canPlaced = computed (() => selectedUnit .value ?.options .canPlaced );
64+
4965// let sceneUnsubscribe;
5066onMounted (async () => {
5167 nextTick (() => {
@@ -54,7 +70,7 @@ onMounted(async () => {
5470});
5571
5672function setup() {
57- const { $el, renderer } = rendererEl .value ! ;
73+ const { renderer } = rendererEl .value ! ;
5874
5975 if (! renderer ) {
6076 throw new Error (' Renderer not ready' );
@@ -77,27 +93,51 @@ function setup() {
7793 selectedUnit .value = unit ? markRaw (unit ) : null ;
7894 })
7995 );
96+ subscription .add (
97+ app .value .modules .placement .startPlace$ .subscribe (unit => {
98+ placedUnit .value = unit ;
99+ })
100+ );
101+ subscription .add (
102+ app .value .modules .placement .stopPlace$ .subscribe (() => {
103+ placedUnit .value = null ;
104+ })
105+ );
80106
81- const onResize = () => {
82- dimension .value = new Vector2 ($el .offsetWidth , $el .offsetHeight );
83- renderer .resize (dimension .value );
84- };
85- resizeObserver = new ResizeObserver (onResize );
107+ subscription .add (
108+ fromEvent (window , ' resize' , {
109+ passive: true
110+ }).subscribe (() => {
111+ onResize ();
112+ })
113+ );
86114
87- resizeObserver . observe ( $el );
115+ onResize ( );
88116}
89117
90118onUnmounted (() => {
91- resizeObserver .disconnect ();
92119 subscription .unsubscribe ();
93120 app .value ?.destroy ();
94121});
95122
123+ const rootEl = ref <HTMLElement >();
124+ function onResize() {
125+ const { width, height } = rootEl .value ! .getBoundingClientRect ();
126+ dimension .value = new Vector2 (width , height );
127+ rendererEl .value ?.renderer ?.resize (dimension .value );
128+ }
129+
96130function onClickRotate() {
97131 if (selectedUnit .value ) {
98132 selectedUnit .value .rotateRight ();
99133 }
100134}
135+
136+ function onClickPlacement() {
137+ if (selectedUnit .value ) {
138+ app .value ?.modules .placement ?.startPlace (selectedUnit .value );
139+ }
140+ }
101141 </script >
102142
103143<style lang="postcss" scoped>
0 commit comments