JavaScript經典進階:實現拼圖遊戲
阿新 • • 發佈:2018-12-17
(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');