|
@@ -3,8 +3,12 @@
|
|
|
class="jigsaw-game"
|
|
|
>
|
|
|
<div class="left-wrapper">
|
|
|
- <div>
|
|
|
+ <div
|
|
|
+ @dragover.prevent
|
|
|
+ @drop.prevent="onDrop"
|
|
|
+ >
|
|
|
<object
|
|
|
+ ref="svgContainer"
|
|
|
:data="require(`@/assets/images/jigsaw-game-${$route.query.sceneL2Idx}/compound.svg`)"
|
|
|
type=""
|
|
|
/>
|
|
@@ -20,25 +24,30 @@
|
|
|
draggable="false"
|
|
|
>
|
|
|
</h1>
|
|
|
- <template
|
|
|
- v-for="(itemL3, idx1) in gameProgress.jigsawProgress[Number($route.query.sceneL2Idx)].children"
|
|
|
- :key="idx1"
|
|
|
+ <li
|
|
|
+ v-for="(jigsawItem, idx) in jigsawItemsFlatten"
|
|
|
+ :key="idx"
|
|
|
>
|
|
|
- <li
|
|
|
- v-for="(jigsawItem, idx2) in itemL3.jigsawList"
|
|
|
- :key="idx2"
|
|
|
+ <img
|
|
|
+ class=""
|
|
|
+ :style="{
|
|
|
+ cursor: !jigsawProgressSceneL2.isJigsawDone && jigsawItem.hasGot && !jigsawItem.hasPut ? 'grab' : 'default',
|
|
|
+ }"
|
|
|
+ :src="require(`@/assets/images/jigsaw-game-${$route.query.sceneL2Idx}/jigsaw${jigsawItem.hasGot ? '' : '-shade'}/${jigsawItem.name}`)"
|
|
|
+ alt=""
|
|
|
+ :draggable="!jigsawProgressSceneL2.isJigsawDone && jigsawItem.hasGot && !jigsawItem.hasPut ? true : false"
|
|
|
+ @dragstart="(e) => {
|
|
|
+ onDragStart(e, jigsawItem.name, idx)
|
|
|
+ }"
|
|
|
+ @dragend="onDragEnd(jigsawItem.name)"
|
|
|
>
|
|
|
- <img
|
|
|
- class=""
|
|
|
- :src="require(`@/assets/images/jigsaw-game-${$route.query.sceneL2Idx}/jigsaw${gameProgress.jigsawProgress[Number($route.query.sceneL2Idx)].isJigsawDone ? '' : '-shade'}/${jigsawItem}`)"
|
|
|
- alt=""
|
|
|
- draggable="false"
|
|
|
- >
|
|
|
- <div class="jigsaw-name">
|
|
|
- {{ jigsawItem }}
|
|
|
- </div>
|
|
|
- </li>
|
|
|
- </template>
|
|
|
+ <div
|
|
|
+ class="jigsaw-name"
|
|
|
+ :title="jigsawItem.name.split('.')[1]"
|
|
|
+ >
|
|
|
+ {{ jigsawItem.name.split('.')[1] }}
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
@@ -48,6 +57,7 @@ import { computed, onMounted, reactive, toRefs, ref } from 'vue'
|
|
|
import useWindowSizeAdaptor from '@/useFunctions/useWindowSizeAdaptor.js'
|
|
|
import { useRoute } from "vue-router"
|
|
|
import { useStore } from "vuex"
|
|
|
+import { ElMessageBox } from 'element-plus'
|
|
|
|
|
|
export default {
|
|
|
name: 'JigsawGame',
|
|
@@ -68,20 +78,89 @@ export default {
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
+ jigsawItemsFlatten: []
|
|
|
}
|
|
|
},
|
|
|
computed: {
|
|
|
...mapState([
|
|
|
'gameProgress',
|
|
|
]),
|
|
|
+ jigsawProgressSceneL2() {
|
|
|
+ return this.gameProgress.jigsawProgress[Number(this.$route.query.sceneL2Idx)]
|
|
|
+ },
|
|
|
},
|
|
|
mounted() {
|
|
|
+ for (const jigsawProgressSceneL3 of this.jigsawProgressSceneL2.children) {
|
|
|
+ for (const jigsawItem of jigsawProgressSceneL3.jigsawList) {
|
|
|
+ this.jigsawItemsFlatten.push({
|
|
|
+ name: jigsawItem,
|
|
|
+ hasGot: jigsawProgressSceneL3.hasGotJigsaw,
|
|
|
+ hasPut: false,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ setTimeout(() => {
|
|
|
+ if (!this.jigsawProgressSceneL2.isJigsawDone) {
|
|
|
+ const svgRoot = this.$refs.svgContainer.contentDocument
|
|
|
+ const gList = svgRoot.getElementsByTagName('g')
|
|
|
+ for (let index = 1; index < gList.length; index++) {
|
|
|
+ const element = gList[index]
|
|
|
+ element.setAttribute('visibility', 'hidden')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, 300)
|
|
|
},
|
|
|
unmounted() {
|
|
|
},
|
|
|
methods: {
|
|
|
...mapMutations([
|
|
|
+ 'recordJigsawDone',
|
|
|
]),
|
|
|
+ onDragStart(e, jigsawImgName, idx) {
|
|
|
+ console.log(jigsawImgName) // 1.马路.png
|
|
|
+ let temp = jigsawImgName.split('.')
|
|
|
+ temp.pop()
|
|
|
+ const id = `_${temp.join('.')}-剪影_图像`
|
|
|
+ // console.log(id)
|
|
|
+ const svgRoot = this.$refs.svgContainer.contentDocument
|
|
|
+ svgRoot.getElementById(id).setAttribute('visibility', 'show')
|
|
|
+ e.dataTransfer.setData('text/plain', jigsawImgName)
|
|
|
+ e.dataTransfer.setData('text/html', String(idx))
|
|
|
+ },
|
|
|
+ onDragEnd(jigsawImgName) {
|
|
|
+ // console.log(jigsawImgName) // 1.马路.png
|
|
|
+ let temp = jigsawImgName.split('.')
|
|
|
+ temp.pop()
|
|
|
+ const id = `_${temp.join('.')}-剪影_图像`
|
|
|
+ // console.log(id)
|
|
|
+ const svgRoot = this.$refs.svgContainer.contentDocument
|
|
|
+ svgRoot.getElementById(id).setAttribute('visibility', 'hidden')
|
|
|
+ },
|
|
|
+ onDrop(e) {
|
|
|
+ let jigsawImgName = e.dataTransfer.getData('text/plain')
|
|
|
+ console.log(jigsawImgName)
|
|
|
+ let temp = jigsawImgName.split('.')
|
|
|
+ temp.pop()
|
|
|
+ const id = `_${temp.join('.')}_图像`
|
|
|
+ // console.log(id)
|
|
|
+ const svgRoot = this.$refs.svgContainer.contentDocument
|
|
|
+ svgRoot.getElementById(id).setAttribute('visibility', 'show')
|
|
|
+
|
|
|
+ const idx = Number(e.dataTransfer.getData('text/html'))
|
|
|
+ this.jigsawItemsFlatten[idx].hasPut = true
|
|
|
+
|
|
|
+ if (!this.jigsawItemsFlatten.find((item) => {
|
|
|
+ return !item.hasPut
|
|
|
+ })) {
|
|
|
+ ElMessageBox.alert('', '拼图完成!', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ callback: (action) => {
|
|
|
+ console.log(action)
|
|
|
+ },
|
|
|
+ })
|
|
|
+ this.recordJigsawDone(Number(this.$route.query.sceneL2Idx))
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
}
|
|
|
</script>
|
|
@@ -114,6 +193,7 @@ export default {
|
|
|
height: 100%;
|
|
|
overflow: hidden;
|
|
|
>object {
|
|
|
+ user-select: none;
|
|
|
// width: 100%;
|
|
|
}
|
|
|
}
|
|
@@ -124,6 +204,7 @@ export default {
|
|
|
height: calc(648 / v-bind('windowSizeWhenDesign') * v-bind('unit'));
|
|
|
padding-top: calc(8 / v-bind('windowSizeWhenDesign') * v-bind('unit'));
|
|
|
overflow: auto;
|
|
|
+
|
|
|
>h1 {
|
|
|
position: absolute;
|
|
|
left: 0;
|
|
@@ -150,6 +231,10 @@ export default {
|
|
|
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
|
|
|
font-weight: bold;
|
|
|
color: #C26827;
|
|
|
+ overflow: hidden;
|
|
|
+ white-space: pre;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ user-select: none;
|
|
|
}
|
|
|
}
|
|
|
}
|