canvas drag 实现拖拽拼图小游戏
博主一直心心念念想做一个小游戏~ 前端时间终于做了一个小游戏,直到现在才来总结,哈哈~ 以后要勤奋点更新博客!
实现原理
1.如何切图?
用之前的方法就是使用photoshop将图片切成相应大小的图片。这种做法不灵活,如果要更换图片的话,就得重新去切图,很麻烦。
现在是使用canvas,图片是一整张jpg或者png,把图片导入到canvas画布,然后再调用上下文context的getImageData方法,把图片处理成小图,这些小图就作为拼图的基本单位
renderImg: function (image) {
var index = 0;
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
this.context.drawImage(image, 300 * j, 300 * i, 300, 600, 0, 0, 300, 300);
this.imgArr[index].src = this.canvas.toDataURL('image/jpeg');
this.imgArr[index].id = index;
index++;
}
}
},
2.如何判断游戏是否结束?
在刚刚生成的小图上面添加自定义属性 , 后期在小图被移动后再一个个判断,如果顺序是对的,那么这张大图就拼接成功, 允许进入下一关;
isSuccess: function () {
var imgLikeArr = document.querySelectorAll('img'),
imgArr = Array.prototype.slice.call(imgLikeArr),
len = imgArr.length, i,
flag = true, self = this;
for (i = 0; i < len; i++) {
if (imgArr[i].id != i) {
flag = false;
}
}
if (flag) {
setTimeout(function () {
self.showtip();
}, 200);
}
}
3.如何实现小图片随机排列?
使用math.random
randomImg: function () {
this.imgArr.sort(function () {
return Math.random() - Math.random();
});
},
4.拖拽功能实现?
drag知识点补充站:
兼容性:IE9+,主流浏览器,移动端所有型号暂不支持
一个完整的drag and drop流程通常包含以下几个步骤:
- 设置可拖拽目标.设置属性
draggable="true"实现元素的可拖拽. - 监听
dragstart设置拖拽数据 - 设置允许的拖放效果,如
copy,move,link - 设置拖放目标,默认情况下浏览器阻止所有的拖放操作,所以需要监听
dragenter或者dragover取消浏览器默认行为使元素可拖放. - 监听
drop事件执行所需操作
拖拽事件周期中会初始化一个DataTransfer对象,用于保存拖拽数据和交互信息.以下是它的属性和方法.
setData(format, data): 以键值对设置数据,format通常为数据格式,如text,text/htmlgetData(format): 获取设置的对应格式数据,format与setData()中一致
实例代码:
//监听dragstart设置拖拽数据
on(contain, 'dragstart', function (e) {
var target = getTarget(e); if (target.tagName.toLowerCase() == "img") {
e.dataTransfer.setData('id', e.target.id);
}
}); on(contain, 'drop', function (ev) {
var target = getTarget(ev);
//交换图片
if (target.tagName.toLowerCase() == "img") {
var originObj = document.getElementById(ev.dataTransfer.getData('id'));
var cache = {
'src': originObj.src,
'id': originObj.id
};
var endObj = ev.target.querySelector('img') || ev.target; originObj.src = endObj.src;
originObj.id = endObj.id;
endObj.src = cache.src;
endObj.id = cache.id; if (originObj.id != endObj.id) {
self.changestep();
} self.isSuccess();
}
}); //取消浏览器默认行为使元素可拖放.
on(contain, 'dragover', function (ev) {
ev.preventDefault();
});
核心代码和思路就是上面这些,其实整个流程走下来还是蛮简单的
有兴趣的可以上我的github ,欢迎fork~star~
canvas drag 实现拖拽拼图小游戏的更多相关文章
- 拼图 canvas分割 dom拖拽 pc 移动端
参考:Canvas drag 实现拖拽拼图小游戏 参考的案例,不支持手机端.总结下实现过程中遇到的小坑. gitHub:https://github.com/WppFrontEnd/puzzle 大概 ...
- 使用NGUI实现拖拽功能(拼图小游戏)
上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...
- 仿苹果电脑任务栏菜单&&拼图小游戏&&模拟表单控件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 打造专属自己的html5拼图小游戏
最近公司刚好有个活动是要做一版 html5的拼图小游戏,于是自己心血来潮,自己先实现了一把,也算是尝尝鲜了.下面就把大体的思路介绍一下,希望大家都可以做出一款属于自己的拼图小游戏,必须是更炫酷,更好玩 ...
- JavaScript版拼图小游戏
慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...
- jQuery实现拼图小游戏
小熊维尼拼图 2017-07-23 ...
- jQuery拼图小游戏
jQuery拼图小游戏 最后样式 核心代码部分 <script type="text/javascript" > $(function () { $("td& ...
- 在HTML页面中有jQuery实现实现拼图小游戏
1.用jQuery实现拼图小游戏 2.首先获得td的点击事件.再进行交换位置 3.下面这种仅供参考 4.下面这些是HTMl标签 当这个世界变得越来越复杂的时候,内心最需保持一份简单一份纯真:
- atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结
atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结 1. DND的操作流程 1 2. Html5 注 ...
随机推荐
- jquery.serialize() 函数详解
jQuery - serialize() 方法 W3School给出的定义与用法: serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. 您可以选择一个或多个表单元素(比如 i ...
- 优化SQLServer——表和分区索引(二)
简介 之前一篇简单的介绍了语法和一些基本的概念,隔了一段时间,觉得有必要细致的通过实例来总结一下这部分内容.如之前所说,分区就是讲大型的对象(表)分成更小的块来管理,基本单位是行.这也就产生了 ...
- Dubbo 分布式服务框架(spring、zookeeper)
DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架, alibaba资源 源码:https://github.com ...
- Tomcat源码分析之—组件启动实现分析
Tomcat由多个组件组成,那么Tomcat是怎么对他们的生命周期进行管理的么,这里将从Tomcat源码去分析其生命周期的实现: Bootstrape类为Tomcat的入口,所有的组件够通过实现Lif ...
- js中正则表达式的模式匹配
参考Javascript权威指南(第6版)第10章 1.正则表达式的定义 正则表达式有两种定义方法,通常使用直接量方式. (1)直接量 var pattern = /\d$/; var pattern ...
- jquery对标签属性操作
jquery中添加属性和删除属性: $("#2args").attr("disabled",'disabled'); $("#2args") ...
- UESTC 395 Dynamic Query System --Treap
题意:让你维护一个集合,有8种操作: 1. I x 插入一个数 2. R x 删除x 3. S 输出总的数个数(集合大小) 4. L x 查询小于x的数的个数 5. W k 查询集合中 ...
- [No00000D]word如何批量删除超链接 怎么去掉网址保留文字
1.删除超链接的文字及网址 这种情况是想把带有网址的文字统统删掉,文字和网址一概不留. 首先在word界面按下ALT+F9(在所有的域代码及其结果间进行切换.),超链接文本会被转换成代码的样式. 例如 ...
- 渗透中Necat的另类用法
Necat 是一个伟大而实用的用于 TCP 和 UPD 网络连接协议的读写程序.同时 Necat 也被誉为网络中的瑞士军刀,在许多黑客教程中 Necat 也被广泛使用.Necat 最常见用途是设置反向 ...
- IDF实验室WORD隐写术
上帝也哭泣http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=48 下载下来,发现是一个word文档,看来信息应该就 ...