html 拖放实现拼图游戏,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.如何判断游戏是否结束?

在刚刚生成的小图上面添加自定义属性 , 后期在小图被移动后再一个个判断,如果顺序是对的,那么这张大图就拼接成功, 允许进入下一关;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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/html

getData(format): 获取设置的对应格式数据,format与setData()中一致

实例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

//监听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~

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

72911_0.jpeg

72911_1.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值