拼图 canvas分割 dom拖拽 pc 移动端
参考的案例,不支持手机端。总结下实现过程中遇到的小坑。
gitHub:https://github.com/WppFrontEnd/puzzle
大概步奏分为三部分:
1. cavas 分割图片
2. 图片乱序
3. 排序图片
其中1和2都是参考了Canvas drag 实现拖拽拼图小游戏。
代码主要如下:
1. cavas 分割图片
segmentImg: function(puzzleImg){
var index =0;
divisionNum =3;
var imgHeight = puzzleImg.height;
var imgWidth = puzzleImg.width;
var sigelH = imgHeight/divisionNum;
var sigelW = imgWidth/divisionNum;
this.canvas.height = sigelH;
this.canvas.width = sigelW;
for(var i=0;i<divisionNum;i++){
for(var j=0;j<divisionNum;j++){
posX = sigelW * j+(5*j);
posY = sigelH * i+(5*i);
this.context.drawImage(puzzleImg, sigelW * j, sigelH * i, sigelW, sigelH, 0, 0, sigelW, sigelH);
this.imgCanvasList[index].src= this.canvas.toDataURL('image/jpeg');
this.imgCanvasList[index].id=index;
index++;
}
}
}
canvas分割图片
在分割图片的时候,遇到了一个坑: 生成的图片的大小总是300*150,而我需要的图片只是在300*150的右上角,而不是一张完整我切割的图片,大概如下:
虽然我知道设置canvas的大小是要写在标签上的,然后我没有想到写在style里面,html上显示的canvas是有效果的,可是生成图片的时候却依然是默认的大小。
之前是这样写的
this.canvas.style.height = sigelH;
this.canvas.style.width = sigelW;
改成这样
this.canvas.height = sigelH;
this.canvas.width = sigelW;
2. 图片乱序
sortImg: function(){
this.imgCanvasList.sort(function(){
return Math.random() - Math.random();
});
}
图片乱序
这是第二个坑:
正常的逻辑即是,先分割图片,在乱序
self.segmentImg(puzzleImg);
self.sortImg();
然而这样写并没有达到乱序的效果。
整理下逻辑:
这样就通了,但是我也发现我这样写的一个不好之处: self.sortImg();不能单独拿出来用,如果想排两次序就得执行两次排序赋值。所以还需要改进~
3. 排序图片
dragEvent: function(){
var contain = document.getElementById('game');
//bind dragStart function
var imgList = contain.querySelectorAll('img');
var that = this;
var listLen = that.imgDomList.length;
var originImgIndex;
var dragImgIndex; for(var i=0, len = that.imgDomList.length; i < len; i++ ){
var draggie = new Draggabilly(that.imgDomList[i]);
draggie.on( 'dragStart', function( event, pointer) {
dragImg = event.srcElement;
}); draggie.on( 'dragEnd', function( event, pointer) {
console.log(pointer);
var clickX = pointer.pageX;
var clickY = pointer.pageY;
console.log(clickX+ ' '+clickY);
var index =0;
for(var i=0;i<listLen;i++){
var posX1 = that.imgDomList[i].offsetTop;
var posX2 = posX1+that.imgDomList[i].height;
var posY1 = that.imgDomList[i].offsetLeft;
var posY2 = posY1+that.imgDomList[i].width;
if(clickX>=posY1&&clickX<=posY2&&clickY>=posX1&&clickY<=posX2){
index++;
if(index==1){
originImgIndex = i;
}else if(index==2){
dragImgIndex = i;
index=0;
}
}
} var originImgId = that.imgDomList[originImgIndex].id;
var originObj = document.getElementById(originImgId);
var cache = {
'src': originObj.src,
'id': originObj.id
}; if(!dragImgIndex){
originObj.style.left=0;
originObj.style.top=0;
originImgIndex="";
dragImgIndex="";
}else{
var endObjId = that.imgDomList[dragImgIndex].id;
var endObj = document.getElementById(endObjId);
originObj.src=endObj.src;
originObj.id=endObj.id;
endObj.src = cache.src;
endObj.id = cache.id;
originObj.style.left=0;
originObj.style.top=0;
endObj.style.left=0;
endObj.style.top=0;
originImgIndex="";
dragImgIndex="";
}
that.isSuccess();
})
} }
排序的过程中,主要遇到两个问题:
(1) offsetTop,height,offsetLef,width 取到的值都是四舍五入的整数
解决办法: 用style.top,style.left 但是结果都带px
(2) 值引用,引用类型
例如:
好好研究一下。
拼图 canvas分割 dom拖拽 pc 移动端的更多相关文章
- canvas drag 实现拖拽拼图小游戏
博主一直心心念念想做一个小游戏- 前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...
- 如何实现Canvas图像的拖拽、点击等操作
上一篇Canvas的博文写完后,有位朋友希望能对Canvas绘制出来的图像进行点击.拖拽等操作,因为Canvas绘制出的图像能很好的美化.好像是想做炉石什么的游戏,我也没玩过. Canvas在我的理解 ...
- canvas实现鼠标拖拽矩形移动改变大小
项目的一个新需求,动态生成矩形框,鼠标点击拖动改变矩形框的位置,并可以调整大小. 之前做过一个小demo,需求类似,但是在canvas内只有一个矩形框,拖动移动,当时记得是用isPointInPath ...
- dom 拖拽回放
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- dom 拖拽div
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- HTML5 -canvas拖拽、移动 绘制图片可操作移动,拖动
关于canvas 的基础知识就不多说了,可以进这个网址学习 http://www.w3school.com.cn/html5/html_5_canvas.asp 对于canvas 和 SVG 其实一开 ...
- 使用UGUI实现拖拽功能(拼图小游戏)
实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragH ...
- canvas 拖拽实现
Canvas 依赖分辨率 不支持事件处理器 弱的文本渲染能力 能够以 .png 或 .jpg 格式保存结果图像 最适合图像密集型的游戏,其中的许多对象会被频繁重绘 SVG 不依赖分辨率 支持事件处理器 ...
- javascript小实例,PC网页里的拖拽
几年前,我参与设计开发一个房产网的项目,我负责前端工作,由于项目经理要求比较高,参考了很多房产类网站比较优秀的功能,想把别人比较优秀的设计和想法集合到一起,那时的设计稿和功能实现,简直就是改了又改,今 ...
随机推荐
- .NET Framework 的 Quirk Version
今天在CSDN上看到一个帖子 :".net 4.0和4.5不同版本的Uri.ToString行为不同?", 调试.NET Framework 源代码发现,是这句代码起的作用 int ...
- ZeroC Ice 暂记
摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...
- 在VS中操作Mysql数据库
1.实现mysql数据库与VS的连接,需要安装两个插件,作者装的是mysql-connector-net-6.9.9.msi和 mysql-for-visualstudio-1.2.6.msi. 2. ...
- 块级格式化上下文(block formatting context)
在CSS2.1中,有三种定位方案--普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inline元素水平排列,直到行被占满后换行,block元素则被渲染为完整的一行,除非指定,所有元素 ...
- Host基本概念
TSO TSO是Time Sharing Option的缩写,是MVS的命令输入处理器. TSO是在操作系统的管理下,用来支持ISPF菜单式会话系统和资源管理设备( ...
- 解决openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory错误
问题 在Centos7上编译安装openssl后,运行openssl version出现如下错误: openssl: error while loading shared libraries: lib ...
- linux 获取线程号
#include <sys/types.h> pid_t gettid(void); 如果系统库里没有,则可以这样做: #include <sys/syscall.h> pid ...
- maven构建过程
[转载]原地址:http://www.cnblogs.com/xdp-gacl/p/4051690.html 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自 ...
- gulp 学习笔记 (初识)
根据极客学院入门视频整理 一.gulp介绍,主要提到了gulp是基于流式来管理运行的,目前完全搞不懂这一套专业术语. 二.gulp的安装使用. 1.首先需要在全局环境下安装gulp npm insta ...
- DNS初识
/注释----本文大部分内容来自网络/ 一.定义: DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库, ...