自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HTML 5的一個(gè)滑動(dòng)拼圖游戲

開(kāi)發(fā) 前端
canvas的寬和高使用像素為單位。如果這兩個(gè)屬于沒(méi)有被指定,他們的默認(rèn)的寬度為:300px,高度為:150px。在圖板畫(huà)圖需要使用canvas的上下文環(huán)境,通過(guò)腳本調(diào)用getContext()方法獲取上下文環(huán)境。

HTML5有許多功能特性可以把多媒體整合到網(wǎng)頁(yè)中。使用canvas元素可以在這個(gè)空白的畫(huà)板上填充線(xiàn)條,載入圖片文件,甚至動(dòng)畫(huà)效果。

在這篇文章中,我將做一個(gè)滑動(dòng)拼圖的游戲用來(lái)展示HTML5 canvas的圖片處理能力。在網(wǎng)頁(yè)中使用canvas標(biāo)簽用來(lái)創(chuàng)建畫(huà)板。

  1. <canvas width="480px" height="480px"></canvas> 

canvas的寬和高使用像素為單位。如果這兩個(gè)屬于沒(méi)有被指定,他們的默認(rèn)的寬度為:300px,高度為:150px。在圖板畫(huà)圖需要使用canvas的上下文環(huán)境,通過(guò)腳本調(diào)用getContext()方法獲取上下文環(huán)境。W3C定義它為二維,更確切的說(shuō)是2d。所以初始化上下文環(huán)境如果如下方法:

  1. document.getElementById("vanvas").getContext("2d"); 

下一步要做的是在畫(huà)板上顯示圖片,API只提供drawImage()一種方法。但是有三種調(diào)用方式。最常用的是傳入三個(gè)參數(shù):image對(duì)象,以及圖片相對(duì)于畫(huà)板的x,y坐標(biāo)。

  1. drawImage(image, x, y); 

還可以加入兩個(gè)參數(shù)用于設(shè)置圖片的寬和高

  1. drawImage(image, x, y, width, height); 

最復(fù)雜的drawImage函數(shù)有9個(gè)參數(shù),按順序分別為:圖片對(duì)象,圖片x坐標(biāo),圖片y坐標(biāo),圖片寬,圖片高,目標(biāo)x坐標(biāo),目標(biāo)y坐標(biāo),目標(biāo)寬和目標(biāo)高。后四個(gè)參數(shù)主要是為了截取原圖部分用來(lái)顯示,比如局部放大、剪切等。以上就是圖像處理的方法,讓我們做一個(gè)練習(xí)。

  1. <div id="slider"> 
  2.   <form>      
  3.     <label>Easy</label> 
  4.     <input type="range" id="scale" value="4" min="3" max="5" step="1"> 
  5.     <label>Hard</label> 
  6.   </form> 
  7. <br> 
  8. </div> 
  9. <div id="main" class="main"> 
  10. <canvas id="puzzle" width="480px" height="480px"></canvas> 
  11. </div> 

上面的DIV包括了另一個(gè)HTML5標(biāo)簽:range input,這個(gè)標(biāo)簽可以讓用戶(hù)拖放滑塊選擇一個(gè)數(shù)值?;仡^我們?cè)僬f(shuō)在拼圖中如何與range input交互。到目前為止ie和firefox并不支持這個(gè)標(biāo)簽。

現(xiàn)在就像我上面說(shuō)過(guò),想要在canvas上繪圖,我們需要context。

  1. var context = document.getElementById("puzzle").getContext("2d"); 

對(duì)了我們還需要一個(gè)圖片,使用例子里自帶的,或者找一個(gè)和canvas相同大小的圖片都行。

  1. var img = new Image();  
  2. img.src = 'http://www.brucealderman.info/Images/dimetrodon.jpg';  
  3. img.addEventListener('load', drawTiles, false); 

加入這個(gè)事件是確保圖片完成加載后,再把圖片放入canvas中。下面我們通過(guò)range input設(shè)置拼圖的數(shù)量,數(shù)據(jù)范圍從3到5(幾行幾列)。

  1. var boardSize = document.getElementById('puzzle').width;  
  2. var tileCount = document.getElementById('scale').value; 

有了上面兩個(gè)數(shù)值就可以計(jì)算一個(gè)拼圖的大小了

  1. var tileSize = boardSize / tileCount; 

OK我們開(kāi)始創(chuàng)建畫(huà)板

  1. var boardParts = new Object;  
  2. setBoard(); 

setBoard()的作用是初始化看板,要模擬顯示這個(gè)畫(huà)板,我們使用一個(gè)二維數(shù)組。不過(guò)用JavaScript創(chuàng)建這樣數(shù)組的過(guò)程不是很優(yōu)雅,我們先定義一個(gè)平面數(shù)組,每個(gè)數(shù)組再定義一個(gè)數(shù)組。這個(gè)拼圖游戲,每一個(gè)元素都是一個(gè)對(duì)象,它帶有x和y坐標(biāo)記錄所在的網(wǎng)格位置。因此每個(gè)對(duì)象有兩個(gè)坐標(biāo),***個(gè)坐標(biāo)是數(shù)組坐標(biāo),表示它在畫(huà)板的位置,另外的坐標(biāo)是對(duì)象的x,y屬性,它記錄著拼圖圖片的位置。當(dāng)這兩個(gè)坐標(biāo)相同了就說(shuō)明位置正確。

為了達(dá)到目的,我們?cè)诔跏蓟臅r(shí)候把它們的位置互換。這樣拼圖就不在正確的位置了。

  1. function setBoard() {  
  2.     boardParts = new Array(tileCount);  
  3.     for (var i = 0; i < tileCount; ++i) {  
  4.      boardParts[i] = new Array(tileCount);  
  5.      for (var j = 0; j < tileCount; ++j) {  
  6.       boardParts[i][j] = new Object;  
  7.       boardParts[i][j].x = (tileCount - 1) - i;  
  8.       boardParts[i][j].y = (tileCount - 1) - j;  
  9.      }  
  10. }  
  11.     emptyLoc.x = boardParts[tileCount - 1][tileCount - 1].x;  
  12.     emptyLoc.y = boardParts[tileCount - 1][tileCount - 1].y;  
  13.     solved = false;  

***三個(gè)變量我們還沒(méi)有定義

我們必須追蹤空白拼圖的位置還要記錄用戶(hù)點(diǎn)擊的位置

  1. var clickLoc = new Object;  
  2. clickLoc.x = 0;  
  3. clickLoc.y = 0;  
  4. var   
  5. emptyLoc = new Object;  
  6. emptyLoc.x = 0;  
  7. emptyLoc.y = 0

***這個(gè)變量是指拼圖是否完成

  1. var solved = false

所有的拼圖都找到正確的位置后,設(shè)置它為true。

現(xiàn)在我們需要一些和解決拼圖相關(guān)的方法

首先為rang input定義觸發(fā)事件,當(dāng)它改變了,我們要重新計(jì)算拼圖的數(shù)量和大小

  1. document.getElementById('scale').onchange = function() {  
  2.       
  3. tileCount = this.value;  
  4.     tileSize = boardSize /   
  5. tileCount;  
  6.     setBoard();  
  7.       
  8. drawTiles();  
  9. }; 

還要追蹤鼠標(biāo)經(jīng)過(guò)的拼圖以及哪個(gè)拼圖被點(diǎn)擊

  1. document.getElementById('puzzle').onmousemove = function(e)   
  2. {  
  3.     clickLoc.x = Math.floor((e.pageX - this.offsetLeft) /   
  4. tileSize);  
  5.     clickLoc.y = Math.floor((e.pageY -   
  6. this.offsetTop) / tileSize);  
  7. };  
  8. document.getElementById('puzzle').onclick   
  9. function() {  
  10.     if (distance(clickLoc.x, clickLoc.y,   
  11. emptyLoc.x, emptyLoc.y) == 1) {  
  12.           
  13. slideTile(emptyLoc, clickLoc);  
  14.           
  15. drawTiles();  
  16.     }  
  17.     if (solved)   
  18. {  
  19.         alert("You solved   
  20. it!");  
  21.     }  
  22. }; 

有一些瀏覽器會(huì)在重畫(huà)畫(huà)板之前彈出對(duì)話(huà)框,為了防止它的發(fā)生,一定要用延遲。

  1. if (solved) {  
  2.     setTimeout(function() {alert("You solved   
  3. it!");}, 500);  

當(dāng)一個(gè)拼圖被點(diǎn)擊時(shí),我們要知道它的四周是否可以移動(dòng)。判斷的方法是當(dāng)前位置到空白位置的總距離為1時(shí)就可以移動(dòng)。

簡(jiǎn)單點(diǎn)說(shuō)就是x相同要判斷y的距離是否為1,y相同要判斷x的距離是否為1。

  1. function distance(x1, y1, x2, y2) {  
  2.     return Math.abs(x1 -   
  3. x2) + Math.abs(y1 - y2);  

移動(dòng)拼圖的做法是,我們復(fù)制被點(diǎn)擊拼圖的坐標(biāo)到空位置。然后把點(diǎn)擊位置設(shè)置成空白坐標(biāo)。

  1. function slideTile(toLoc, fromLoc) {  
  2.     if (!solved)   
  3. {  
  4.         boardParts[toLoc.x][toLoc.y].x =   
  5. boardParts[fromLoc.x][fromLoc.y].x;  
  6.           
  7. boardParts[toLoc.x][toLoc.y].y =   
  8. boardParts[fromLoc.x][fromLoc.y].y;  
  9.           
  10. boardParts[fromLoc.x][fromLoc.y].x = tileCount -   
  11. 1;  
  12.           
  13. boardParts[fromLoc.x][fromLoc.y].y = tileCount -   
  14. 1;  
  15.         toLoc.x =   
  16. fromLoc.x;  
  17.         toLoc.y =   
  18. fromLoc.y;  
  19.           
  20. checkSolved();  
  21.     }  

一旦拼圖移動(dòng)了,我們還要檢查一下拼圖是否全部在正確的位置。

  1. function checkSolved() {  
  2.     var flag =   
  3. true;  
  4.     for (var i = 0; i < tileCount; ++i)   
  5. {  
  6.         for (var j = 0; j <   
  7. tileCount; ++j)   
  8. {  
  9.             if   
  10. (boardParts[i][j].x != i || boardParts[i][j].y != j)   
  11. {  
  12.                   
  13. flag =   
  14. false;  
  15.               
  16. }  
  17.         }  
  18.       
  19. }  
  20.     solved = flag;  

如果有一個(gè)拼圖不正確函數(shù)就會(huì)返回false,否則返回true。

***,重繪被點(diǎn)擊的拼圖到新的位置。

  1. function drawTiles() {  
  2.     context.clearRect ( 0 , 0 , boardSize , boardSize );  
  3.     for (var i = 0; i < tileCount; ++i) {  
  4.         for (var j = 0; j < tileCount; ++j) {  
  5.             var x = boardParts[i][j].x;  
  6.      var y = boardParts[i][j].y;  
  7.             if(i != emptyLoc.x || j != emptyLoc.y || solved == true) {  
  8.                 context.drawImage(img, x * tileSize, y * tileSize, tileSize, tileSize,  
  9.                      i * tileSize, j * tileSize, tileSize, tileSize);  
  10.             }  
  11.         }  
  12.     }  

當(dāng)畫(huà)拼圖時(shí),這個(gè)函數(shù)可以防止填充畫(huà)板時(shí)匹配空的位置,因?yàn)樵谟螒蛑杏脩?hù)可以選擇不同的難度。

原文鏈接:http://www.html5cn.org/article-2655-1.html

【編輯推薦】

  1. HTML 5實(shí)現(xiàn)淘寶語(yǔ)音搜索功能
  2. 別怕!我們還有HTML 5和CSS3
  3. 難以置信的HTML 5和JS實(shí)驗(yàn)
  4. HTML 5做出讓你意想不到的幾件事
  5. 用HTML***udio API開(kāi)發(fā)游戲音樂(lè)
責(zé)任編輯:張偉 來(lái)源: HTML5中國(guó)
相關(guān)推薦

2012-09-24 11:11:32

HTML5游戲開(kāi)發(fā)JavaScript

2022-08-04 06:57:54

CSS拼圖游戲

2021-11-01 10:26:07

CanvasAPI畫(huà)布技術(shù)HTML5

2011-11-18 16:09:37

jQuery

2022-02-17 20:18:27

JS鴻蒙操作系統(tǒng)

2012-03-29 09:18:47

HTML5WEB

2012-03-09 09:37:01

HTML 5

2021-08-15 22:52:30

前端H5拼圖

2012-09-24 09:46:20

JavaScriptJSHTML5

2012-05-09 09:41:58

HTML5

2018-01-19 14:25:18

游戲

2011-12-21 09:38:31

HTML 5

2010-02-05 09:28:13

HTML5Flash

2012-05-10 09:45:14

HTML5

2012-05-28 15:31:57

App-UI

2015-12-03 15:22:01

HTML5游戲建議

2014-12-30 17:13:51

HTML5

2013-12-19 09:58:36

移動(dòng)應(yīng)用產(chǎn)品市場(chǎng)

2012-05-15 10:35:35

HTML5

2012-01-06 14:10:13

HTML 5
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)