日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
HTML5的一個(gè)滑動(dòng)拼圖游戲

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

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出睢陽免費(fèi)做網(wǎng)站回饋大家。

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

 
 
 

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

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

下一步要做的是在畫板上顯示圖片,API只提供drawImage()一種方法。但是有三種調(diào)用方式。最常用的是傳入三個(gè)參數(shù):image對(duì)象,以及圖片相對(duì)于畫板的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ù)主要是為了截取原圖部分用來顯示,比如局部放大、剪切等。以上就是圖像處理的方法,讓我們做一個(gè)練習(xí)。

 
 
 
  1.   
        
  2.     
  3.     
  4.     
  5.   

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

    現(xiàn)在就像我上面說過,想要在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中。下面我們通過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我們開始創(chuàng)建畫板

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

    setBoard()的作用是初始化看板,要模擬顯示這個(gè)畫板,我們使用一個(gè)二維數(shù)組。不過用JavaScript創(chuàng)建這樣數(shù)組的過程不是很優(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),表示它在畫板的位置,另外的坐標(biāo)是對(duì)象的x,y屬性,它記錄著拼圖圖片的位置。當(dāng)這兩個(gè)坐標(biāo)相同了就說明位置正確。

    為了達(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;
    14. }

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

    我們必須追蹤空白拼圖的位置還要記錄用戶點(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)過的拼圖以及哪個(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ì)在重畫畫板之前彈出對(duì)話框,為了防止它的發(fā)生,一定要用延遲。

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

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

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

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

    移動(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.     }
    22. }

    一旦拼圖移動(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;
    21. }

    如果有一個(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.     }
    13. }

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


    網(wǎng)站標(biāo)題:HTML5的一個(gè)滑動(dòng)拼圖游戲
    分享路徑:http://www.5511xx.com/article/djedoci.html