博主一直心心念念想做一個小游戲~ 前端時間終於做了一個小游戲,直到現在才來總結,哈哈~ 以后要勤奮點更新博客!
實現原理
1.如何切圖?
用之前的方法就是使用photoshop將圖片切成相應大小的圖片。這種做法不靈活,如果要更換圖片的話,就得重新去切圖,很麻煩。
現在是使用canvas,圖片是一整張jpg或者png,把圖片導入到canvas畫布,然后再調用上下文context的getImageData方法,把圖片處理成小圖,這些小圖就作為拼圖的基本單位
1 renderImg: function (image) { 2 var index = 0; 3 for (var i = 0; i < 3; i++) { 4 for (var j = 0; j < 3; j++) { 5 this.context.drawImage(image, 300 * j, 300 * i, 300, 600, 0, 0, 300, 300); 6 this.imgArr[index].src = this.canvas.toDataURL('image/jpeg'); 7 this.imgArr[index].id = index; 8 index++; 9 } 10 } 11 },
2.如何判斷游戲是否結束?
在剛剛生成的小圖上面添加自定義屬性 , 后期在小圖被移動后再一個個判斷,如果順序是對的,那么這張大圖就拼接成功, 允許進入下一關;
1 isSuccess: function () { 2 var imgLikeArr = document.querySelectorAll('img'), 3 imgArr = Array.prototype.slice.call(imgLikeArr), 4 len = imgArr.length, i, 5 flag = true, self = this; 6 7 for (i = 0; i < len; i++) { 8 if (imgArr[i].id != i) { 9 flag = false; 10 } 11 } 12 13 if (flag) { 14 setTimeout(function () { 15 self.showtip(); 16 }, 200); 17 } 18 }
3.如何實現小圖片隨機排列?
使用math.random
1 randomImg: function () { 2 this.imgArr.sort(function () { 3 return Math.random() - Math.random(); 4 }); 5 },
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()中一致
實例代碼:
1 //監聽dragstart設置拖拽數據 2 on(contain, 'dragstart', function (e) { 3 var target = getTarget(e); 4 5 if (target.tagName.toLowerCase() == "img") { 6 e.dataTransfer.setData('id', e.target.id); 7 } 8 }); 9 10 on(contain, 'drop', function (ev) { 11 var target = getTarget(ev); 12 //交換圖片 13 if (target.tagName.toLowerCase() == "img") { 14 var originObj = document.getElementById(ev.dataTransfer.getData('id')); 15 var cache = { 16 'src': originObj.src, 17 'id': originObj.id 18 }; 19 var endObj = ev.target.querySelector('img') || ev.target; 20 21 originObj.src = endObj.src; 22 originObj.id = endObj.id; 23 endObj.src = cache.src; 24 endObj.id = cache.id; 25 26 if (originObj.id != endObj.id) { 27 self.changestep(); 28 } 29 30 self.isSuccess(); 31 } 32 }); 33 34 //取消瀏覽器默認行為使元素可拖放. 35 on(contain, 'dragover', function (ev) { 36 ev.preventDefault(); 37 });
核心代碼和思路就是上面這些,其實整個流程走下來還是蠻簡單的
有興趣的可以上我的github ,歡迎fork~star~
