大佬们,这种切割加拼图的功能该怎么实现啊

2020-12-14 14:13:11 +08:00
 tangshuaibo

类似这种:[https://www.jigsawexplorer.com/online-jigsaw-puzzle-player.html?puzzle_id=christmas-peace]

图片该怎么按照拼图图块的形状切割?然后两个图块组合后是怎么变成一体的?

fabricjs 能满足要求吗?求推荐下,能实现这类需求,简单好用的 canvas 库……

我只做过些 h5 小程序这类的,完全没有 canvas 经验……

2882 次点击
所在节点    JavaScript
12 条回复
tangshuaibo
2020-12-14 14:31:14 +08:00
大佬大佬求出现,给个思路就好🙏
misdake
2020-12-14 14:55:14 +08:00
## 画每一片:

参考链接:
https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing
https://stackoverflow.com/a/18387192/2244973

如果每一片形状的数量是有限的,或者形状是无规律的:
1. drawImage 画 mask(即描述形状的图片)
2. globalCompositeOperation = 'source-in'; 设置为只允许画在 mask 上
3. drawImage 画图片本体
注意调整画图的 src 位置和 dest 位置

如果每一片形状的数量是非常多且有规律的:
1. 画一个 path,作为形状
2. context.clip(); 设置为只能在范围内画
3. context.drawImage 画图片本体

## 变成一体
这个没什么特别的吧,判断组合然后依次画上去就行了
在松鼠标的时候,判断一下原图中周围的块是不是真的在旁边,如果在就用并查集连在一起。再拖动的时候,这个集合的块全部一起移动,松开的时候,全部判断新的组合
tangshuaibo
2020-12-14 15:04:29 +08:00
@misdake 好的,谢谢大佬
jaxer
2020-12-14 16:14:34 +08:00
成功划水 17min,完成后下面的欢呼人,以为是丧尸
fengmumu
2020-12-14 16:55:13 +08:00
我想到的实现的话思路大概是这样
每一个拼图都是由核心区域加四周的拼接的接口组成
然后我把图片使用 cavas 分割成多个小块,每个小块之间是有位置关系的,
然后我是不想用 canvas 的,我是想用图片或者 span 来做,毕竟有图片了,有关系了,剩下就是渲染了
然后是否拼接的话 只需要判断 两个拼图的位置关系就行了,
所谓组的关系,其实也就是移动的时候统一移动,给每一个元素都添加就行

不知道说清楚没有,感觉重点在图片的切分,和是否拼好的判断这
你要是要用 canvs 可以用 konva,他有幕布和组的概念。拼好的放到一个组就行了,这个其实你也可以自己做的

ps: canvas 想要玩的好,线性代数跑不了
yzqtdu
2020-12-14 17:30:13 +08:00
楼主可以看看这篇文章,基本能解决你的问题
https://www.codeproject.com/Articles/395453/Html5-Jigsaw-Puzzle
jorneyr
2020-12-14 18:29:33 +08:00
图片都是矩形的,看到不规则的形状是因为颜色透明的原因。
给每种图片一个类型,上下左右能衔接的图片的类型也是固定匹配的。
tangshuaibo
2020-12-14 19:43:29 +08:00
@jaxer 什么意思?
tangshuaibo
2020-12-14 19:44:46 +08:00
@fengmumu 谢谢大佬
tangshuaibo
2020-12-14 19:45:44 +08:00
@yzqtdu 谢谢大佬
tangshuaibo
2020-12-14 19:47:15 +08:00
@jorneyr 谢谢大佬
M3oM3oBug
2020-12-14 21:09:25 +08:00
用 Canvas 完全可以做,楼上也说了 konva 和解决思路,我也有一套自己的解决方案有点类似 konva 也可以做,不过话说考虑外包给我吗哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/735252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX