Skip to content

Commit 4f4a58b

Browse files
committed
fix(spx-gui): Wrap SpriteNode with v-group in viewer components to stabilize rendering order.
1 parent c21e6a1 commit 4f4a58b

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

spx-gui/src/components/editor/map-editor/map-viewer/MapViewer.vue

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -444,18 +444,21 @@ const handleWheel = (e: KonvaEventObject<WheelEvent>) => {
444444
:decorator="decorator"
445445
:map-size="mapSize"
446446
/>
447-
<SpriteNode
448-
v-for="sprite in visibleSprites"
449-
:key="sprite.id"
450-
:sprite="sprite"
451-
:selected="selectedSprite?.id === sprite.id"
452-
:project="props.project"
453-
:map-size="mapSize"
454-
:node-ready-map="nodeReadyMap"
455-
@drag-move="handleSpriteDragMove"
456-
@drag-end="handleSpriteDragEnd"
457-
@selected="handleSpriteSelected(sprite)"
458-
/>
447+
<!-- Refer to: spx-gui/src/components/editor/preview/stage-viewer/StageViewer.vue -->
448+
<v-group>
449+
<SpriteNode
450+
v-for="sprite in visibleSprites"
451+
:key="sprite.id"
452+
:sprite="sprite"
453+
:selected="selectedSprite?.id === sprite.id"
454+
:project="props.project"
455+
:map-size="mapSize"
456+
:node-ready-map="nodeReadyMap"
457+
@drag-move="handleSpriteDragMove"
458+
@drag-end="handleSpriteDragEnd"
459+
@selected="handleSpriteSelected(sprite)"
460+
/>
461+
</v-group>
459462
</v-layer>
460463
<v-layer>
461464
<NodeTransformer ref="nodeTransformerRef" :node-ready-map="nodeReadyMap" :target="selectedSprite" />

spx-gui/src/components/editor/preview/stage-viewer/StageViewer.vue

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,30 @@
2424
:decorator="decorator"
2525
:map-size="mapSize"
2626
/>
27-
<SpriteNode
28-
v-for="sprite in visibleSprites"
29-
:key="sprite.id"
30-
:sprite="sprite"
31-
:selected="editorCtx.state.selectedSprite?.id === sprite.id"
32-
:project="editorCtx.project"
33-
:map-size="mapSize"
34-
:node-ready-map="nodeReadyMap"
35-
@drag-move="handleSpriteDragMove"
36-
@drag-end="handleSpriteDragEnd"
37-
@selected="handleSpriteSelected(sprite)"
38-
/>
27+
<!--
28+
Why is v-group needed?
29+
For example, assuming there are two SpriteNodes, the layer is expected to be [v-rect, v-image, v-image], but the result might be [v-image, v-image, v-rect].
30+
This causes the v-rect position to be unexpected, obscuring the v-image.
31+
After investigation, it was found that SpriteNode calls zIndex(zIndex) internally.
32+
If zIndex is smaller than the index of v-rect in the layer children, its position will be further forward.
33+
When v-rect starts rendering before visibleSprites, the above scenario will occur.
34+
Although vue-konva will correct the order of children in the layer based on the order of vnodes through checkOrder, it is not very stable.
35+
So v-group is added so that SpriteNode zIndex(zIndex) does not affect v-rect.
36+
-->
37+
<v-group>
38+
<SpriteNode
39+
v-for="sprite in visibleSprites"
40+
:key="sprite.id"
41+
:sprite="sprite"
42+
:selected="editorCtx.state.selectedSprite?.id === sprite.id"
43+
:project="editorCtx.project"
44+
:map-size="mapSize"
45+
:node-ready-map="nodeReadyMap"
46+
@drag-move="handleSpriteDragMove"
47+
@drag-end="handleSpriteDragEnd"
48+
@selected="handleSpriteSelected(sprite)"
49+
/>
50+
</v-group>
3951
</v-layer>
4052
<v-layer>
4153
<WidgetNode

0 commit comments

Comments
 (0)