1. 程式人生 > >JavaScript經典進階:實現拼圖遊戲

JavaScript經典進階:實現拼圖遊戲

(function() { var hideElement = document.getElementsByClassName('hide')[0]; hideElement.addEventListener('click', function() { hideElement.style.display = 'none'; location.reload(); },false) })(); //使用面向物件(組合模式)程式設計
function Puzzle() { //放私有屬性 this.ctx = canvas.getContext('2d'); //畫筆,canvas是一個html中的特定的canvas元素 this.imgList = document.querySelectorAll('#game img'); this.imgArr = Array.from(this.imgList); //es6 } Puzzle.prototype = { init:
function (url) { //初始化(進行圖片的切圖並匯出) var image = new Image(); //建立遊離的img元素 /* new Image()和document.createElement('img'); 是一樣的,建立了一個遊離(未掛在到DOM中)的<img>元素 */ image.src = url; //將要處理的圖片地址放入src屬性 image.
onload = function () { this.randomImg(); //打亂順序,再渲染 this.renderImg(image); this.dragEvent(); }.bind(this); }, //進行圖片的渲染並匯出 renderImg: function (image) { var index = 0; for (var i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { //i,j座標圖如下 //(0,0)(0,1)(0,2) //(1,0)(1,1)(1,2) //(2,0)(2,1)(2,2) //所以j,i的座標剛好和上面的9對值相反 this.ctx.drawImage(image, 300 * j, 300 * i, 300, 300, 0, 0, 150, 150); this.imgArr[index].src = canvas.toDataURL('image/jpeg'); this.imgArr[index].id = index; index++; } } }, //圖片的隨機排序 randomImg: function () { //imgList是DOM裡面的類陣列,沒有原生js中的sort方法 this.imgArr.sort(function () { return Math.random() - Math.random(); }) }, //拖拽事件 dragEvent: function () { //事件代理 var container = document.getElementById('game'); container.addEventListener('dragover', function (e) { e.preventDefault(); //如果沒有呼叫這個阻止函式,則目標元素在 dragstart 後,元素無法拖動 }, false); container.addEventListener('dragstart', function (e) { var target = e.target; if (target.tagName.toLowerCase() == 'img') { e.dataTransfer.setData('id', target.id); } }, false); //false表示--事件冒泡為否 container.addEventListener('drop', function (e) { var target = e.target; //drop事件觸發的是滑鼠 拖拽後釋放 所指的元素 if (target.tagName.toLowerCase() == 'img') { var originObj = document.getElementById(e.dataTransfer.getData('id')); var endObj = target; [originObj.src, endObj.src] = [endObj.src, originObj.src]; [originObj.id, endObj.id] = [endObj.id, originObj.id]; //兩行程式碼實現資料交換,不要太爽 var newImgArr = document.querySelectorAll('#game img'); var idArr = []; for (i = 0; i < 9; i++) { idArr.push(newImgArr[i].id); } console.log(idArr.toString()); if (idArr.toString() == [0, 1, 2, 3, 4, 5, 6, 7, 8].toString()) { document.getElementsByClassName('hide')[0].style.display = 'block'; } } }, false); } } var puzzle = new Puzzle(); puzzle.init('img/jinxuanya.jpg');