精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HTML 5的一個滑動拼圖游戲

開發 前端
canvas的寬和高使用像素為單位。如果這兩個屬于沒有被指定,他們的默認的寬度為:300px,高度為:150px。在圖板畫圖需要使用canvas的上下文環境,通過腳本調用getContext()方法獲取上下文環境。

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

在這篇文章中,我將做一個滑動拼圖的游戲用來展示HTML5 canvas的圖片處理能力。在網頁中使用canvas標簽用來創建畫板。

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

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

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

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

  1. drawImage(image, x, y); 

還可以加入兩個參數用于設置圖片的寬和高

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

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

  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包括了另一個HTML5標簽:range input,這個標簽可以讓用戶拖放滑塊選擇一個數值。回頭我們再說在拼圖中如何與range input交互。到目前為止ie和firefox并不支持這個標簽。

現在就像我上面說過,想要在canvas上繪圖,我們需要context。

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

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

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

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

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

有了上面兩個數值就可以計算一個拼圖的大小了

  1. var tileSize = boardSize / tileCount; 

OK我們開始創建畫板

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

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

為了達到目的,我們在初始化的時候把它們的位置互換。這樣拼圖就不在正確的位置了。

  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;  

***三個變量我們還沒有定義

我們必須追蹤空白拼圖的位置還要記錄用戶點擊的位置

  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

***這個變量是指拼圖是否完成

  1. var solved = false

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

現在我們需要一些和解決拼圖相關的方法

首先為rang input定義觸發事件,當它改變了,我們要重新計算拼圖的數量和大小

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

還要追蹤鼠標經過的拼圖以及哪個拼圖被點擊

  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. }; 

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

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

當一個拼圖被點擊時,我們要知道它的四周是否可以移動。判斷的方法是當前位置到空白位置的總距離為1時就可以移動。

簡單點說就是x相同要判斷y的距離是否為1,y相同要判斷x的距離是否為1。

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

移動拼圖的做法是,我們復制被點擊拼圖的坐標到空位置。然后把點擊位置設置成空白坐標。

  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.     }  

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

  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;  

如果有一個拼圖不正確函數就會返回false,否則返回true。

***,重繪被點擊的拼圖到新的位置。

  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.     }  

當畫拼圖時,這個函數可以防止填充畫板時匹配空的位置,因為在游戲中用戶可以選擇不同的難度。

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

【編輯推薦】

  1. HTML 5實現淘寶語音搜索功能
  2. 別怕!我們還有HTML 5和CSS3
  3. 難以置信的HTML 5和JS實驗
  4. HTML 5做出讓你意想不到的幾件事
  5. 用HTML***udio API開發游戲音樂
責任編輯:張偉 來源: HTML5中國
相關推薦

2012-09-24 11:11:32

HTML5游戲開發JavaScript

2022-08-04 06:57:54

CSS拼圖游戲

2021-11-01 10:26:07

CanvasAPI畫布技術HTML5

2011-11-18 16:09:37

jQuery

2022-02-17 20:18:27

JS鴻蒙操作系統

2012-03-29 09:18:47

HTML5WEB

2012-03-09 09:37:01

HTML 5

2012-09-24 09:46:20

JavaScriptJSHTML5

2021-08-15 22:52:30

前端H5拼圖

2018-01-19 14:25:18

游戲

2012-05-09 09:41:58

HTML5

2012-05-10 09:45:14

HTML5

2011-12-21 09:38:31

HTML 5

2012-05-28 15:31:57

App-UI

2010-02-05 09:28:13

HTML5Flash

2015-12-03 15:22:01

HTML5游戲建議

2014-12-30 17:13:51

HTML5

2013-12-19 09:58:36

移動應用產品市場

2023-12-20 09:38:06

機器智能系統

2012-09-11 13:34:27

HTML5JS
點贊
收藏

51CTO技術棧公眾號

99热一区二区| 中文字幕精品www乱入免费视频| 在线免费观看成人| 91片黄在线观看喷潮| 日韩免费av| 欧美伦理视频网站| 在线视频91| 亚洲va欧美va| 国产精品综合| 国产一区二区三区在线播放免费观看| 亚洲性生活网站| 麻豆传媒免费在线观看| 国产一区不卡精品| 久久久久久久成人| 在线免费观看麻豆| 国产91亚洲精品久久久| 亚洲天堂2014| 久久一区二区三区av| 中文字幕久久熟女蜜桃| 欧美日韩一区二区国产| 亚洲欧美日韩一区二区在线 | 日韩美女久久久| 国产精品国产三级欧美二区| 亚洲欧美精品一区二区三区| 欧美xxxx中国| 亚洲精品福利免费在线观看| 成人免费毛片播放| jizz性欧美| 久久五月婷婷丁香社区| 亚洲一区二区三区香蕉| 国产成人无码精品| 91精品99| 国产亚洲精品久久久久久牛牛| 精品亚洲视频在线| www.成人爱| 亚洲一区二三区| 视频一区不卡| 午夜av免费在线观看| 香蕉久久夜色精品| 久久综合九色九九| 国产ts在线播放| 国产伦理久久久久久妇女| 在线视频你懂得一区| 麻豆视频传媒入口| h视频网站在线观看| 99久久国产综合精品女不卡| 国产有码在线一区二区视频| wwwxxx亚洲| 激情自拍一区| 久久视频在线观看免费| av网站免费在线看| 蜜桃一区av| 欧美一区二区精品在线| 激情内射人妻1区2区3区| 俺来也官网欧美久久精品| 国产精品久久久久国产精品日日| 久久久久久国产精品一区| 午夜精品久久久久久久爽| 久久精品国产精品青草| 国产精品久久久久aaaa九色| 国产一级特黄aaa大片| 外国成人免费视频| 日韩中文字幕精品视频| 精品无码国产污污污免费网站| 国产伦精品一区二区三区免费优势| 91麻豆精品国产自产在线| 亚洲狼人综合干| 欧亚一区二区| 日韩欧美国产黄色| 国产精品网站免费| 涩涩av在线| 欧美视频中文在线看| 少妇无码av无码专区在线观看 | 成人免费毛片片v| 95av在线视频| 国产aⅴ爽av久久久久成人| 久久91精品国产91久久小草| 国产美女扒开尿口久久久| 亚洲一区精品在线观看| 蜜臀精品一区二区三区在线观看| 国产精品极品美女在线观看免费 | 男人天堂一区二区| 成人高清免费观看| 精品国产一区二区三区麻豆小说| 免费观看黄色av| 99精品久久免费看蜜臀剧情介绍| 久久精品国产第一区二区三区最新章节| 亚洲国产精品视频在线| 成人小视频免费在线观看| 国产精品乱码视频| 亚洲欧洲成人在线| 久久久高清一区二区三区| 欧美三级电影在线播放| av国产在线观看| 国产精品国产三级国产普通话99 | 丰满少妇在线观看| 欧洲美女精品免费观看视频| 91精品国模一区二区三区| 色综合五月婷婷| 国产日韩三级| 亚洲欧美精品一区| 欧美巨胸大乳hitomi| 亚洲欧美综合久久久| 国语自产精品视频在免费| 97久久久久久久| 蜜桃传媒麻豆第一区在线观看| 成人激情春色网| 欧美 中文字幕| 久久久久久久久久久久久夜| 青青草原国产免费| 国产美女高潮在线观看| 欧美日韩一区二区三区高清| 91香蕉视频免费看| 欧美黑白配在线| 在线观看视频亚洲| 久久亚洲成人av| 日韩精品午夜视频| 亚洲一区二区少妇| 四虎国产精品永远| 国产精品视频第一区| 精品国产av无码一区二区三区| 2022成人影院| 51久久夜色精品国产麻豆| 欧美熟妇精品黑人巨大一二三区| 清纯唯美日韩| 69久久夜色精品国产69| av片免费观看| 国产成人免费高清| 一本久久a久久精品vr综合 | 91精品国产高清自在线| 91麻豆成人精品国产| 成人av电影在线观看| 一区二区日本| 欧美久久天堂| 欧美成人精品1314www| 成人在线一级片| 黄色成人av网站| 国产精品一区专区欧美日韩| 天堂中文在线看| 亚洲人成人一区二区在线观看| 无码无遮挡又大又爽又黄的视频| 99国产精品免费网站| 中文字幕日韩专区| 亚洲视频 欧美视频| 成人国产亚洲欧美成人综合网| 亚洲一区二区在| 激情开心成人网| 精品欧美乱码久久久久久1区2区| 天天做夜夜爱爱爱| 日韩精品免费专区| 麻豆亚洲一区| 77thz桃花论族在线观看| 555www色欧美视频| 久久久精品少妇| 麻豆国产精品视频| 日产精品一线二线三线芒果| 欧美13videosex性极品| 亚洲黄色有码视频| 国产中文字字幕乱码无限| 狠狠色狠狠色综合| 亚洲电影免费| 久久久成人av毛片免费观看| 精品视频久久久久久| 日本一区二区不卡在线| 国产91精品精华液一区二区三区 | 欧美黄色激情视频| 天堂资源在线中文精品| 欧美极品视频一区二区三区| 亚洲第一av| 亚洲性夜色噜噜噜7777| 丰满人妻老熟妇伦人精品| 91看片淫黄大片一级在线观看| 日本韩国欧美在线观看| 天天久久夜夜| 国产激情视频一区| 国产永久免费高清在线观看| 色婷婷精品大在线视频| a级在线免费观看| 日产国产欧美视频一区精品| 好看的日韩精品| 色戒汤唯在线| 亚洲石原莉奈一区二区在线观看| 日韩手机在线视频| 中文成人av在线| 成年人小视频在线观看| 久久久噜噜噜久久狠狠50岁| 中文字幕av日韩精品| 超碰在线亚洲| 国产精品久久久久免费a∨大胸 | 欧美日一区二区| 97在线电影| 国产成人精品一区二三区在线观看| 两个人的视频www国产精品| 色呦呦中文字幕| 欧美日韩免费高清一区色橹橹| 豆国产97在线 | 亚洲| 久久精品男人天堂av| 中文字幕乱妇无码av在线| 另类亚洲自拍| 国产精品免费看久久久无码| 精品一区在线| 国产精品福利视频| 深夜福利亚洲| 日本不卡高字幕在线2019| 爆操欧美美女| 亚洲最新中文字幕| 九九九九久久久久| 成 人 黄 色 片 在线播放| 日韩欧美精品网址| 亚洲国产精品久| 中文字幕av一区二区三区| 国产情侣久久久久aⅴ免费| 另类欧美日韩国产在线| 欧美 日韩 亚洲 一区| 亚洲午夜精品一区 二区 三区| 高清美女视频一区| 日韩a级大片| 97色在线视频观看| av在线播放观看| 在线观看欧美日韩国产| 香蕉av一区二区三区| 欧美成人精品高清在线播放| 亚洲天堂中文在线| 色综合久久综合中文综合网| 国产一级片网址| 亚洲激情中文1区| 网站永久看片免费| 国产无一区二区| 爱爱的免费视频| 91香蕉视频黄| 中文在线永久免费观看| 波多野结衣在线一区| 国产成人av片| 成人综合在线观看| 国产又粗又猛又爽又黄| 精品一区二区三区免费播放| 男女男精品视频站| 日日夜夜精品视频天天综合网| 国产乱子伦农村叉叉叉| 99精品国产在热久久婷婷| www.99热这里只有精品| 亚洲麻豆视频| 国产午夜福利100集发布| 国产精品v亚洲精品v日韩精品| 香蕉视频免费版| 中文字幕一区二区三区在线视频| 久久久成人精品一区二区三区 | 精品一区二区三区影院在线午夜| 天天色综合天天色| 男人的j进女人的j一区| 男人添女人下面免费视频| 日韩国产欧美三级| 波多野结衣xxxx| 韩国精品一区二区| 人妻体体内射精一区二区| 国产乱理伦片在线观看夜一区| 国产xxxxhd| 成人免费观看视频| 蜜臀av一区二区三区有限公司| 久久久久亚洲蜜桃| 色欲狠狠躁天天躁无码中文字幕 | 91免费在线视频观看| 精品少妇人妻一区二区黑料社区| 久久精品人人做| 亚洲精品天堂网| 亚洲精品乱码久久久久久久久| 久草免费在线视频观看| 欧美日韩免费在线| 自拍偷拍18p| 91精品欧美福利在线观看| 性猛交xxxx乱大交孕妇印度| 亚洲缚视频在线观看| 国产天堂在线| 久久伊人精品一区二区三区| 蜜桃成人365av| 青青草一区二区| 欧美亚洲二区| 国产亚洲自拍偷拍| 精品香蕉视频| 大胆欧美熟妇xx| 日韩高清国产一区在线| 精产国品一二三区| 26uuu国产一区二区三区| 亚洲欧洲综合网| 欧美日韩国产区| 亚洲天堂免费av| 亚洲精品成人av| 欧美人xxx| 97在线看福利| 亚洲精品三区| 国产精品视频一区二区三区经| 国产欧美日韩免费观看| 裸体大乳女做爰69| 午夜在线播放视频欧美| 久久精品亚洲天堂| 91免费看片在线观看| 538任你躁在线精品视频网站| 欧美日韩中文在线观看| 国产美女免费看| 亚洲欧美自拍一区| 日本无删减在线| 国产精品亚洲网站| 另类尿喷潮videofree| 中文字幕超清在线免费观看| 久久影院亚洲| 国模私拍在线观看| 亚洲女性喷水在线观看一区| 手机在线看片1024| 亚洲国产99精品国自产| 精品51国产黑色丝袜高跟鞋| 日本老师69xxx| 国产精品一区二区三区美女| 中文字幕色一区二区| 老牛嫩草一区二区三区日本 | 久久久99久久精品欧美| www.99re7.com| 欧美一区二区视频免费观看| 91涩漫在线观看| 日韩av电影国产| 欧美一性一交| 99久久免费观看| 精品写真视频在线观看| 国产精品国产三级国产专业不| 午夜视黄欧洲亚洲| av中文字幕免费在线观看| 日韩在线视频网站| 成人免费网站www网站高清| 精品蜜桃传媒| 99在线精品免费视频九九视| 国产精品亚洲一区二区无码| 亚洲激情综合网| 精品国产乱码一区二区三| 久久九九有精品国产23| 国产精品久久久久久吹潮| 色阁综合av| 免费在线观看视频一区| 91无套直看片红桃在线观看| 在线观看日韩高清av| 成人午夜影视| 国产成人涩涩涩视频在线观看 | 精品久久久av| 国产极品嫩模在线观看91精品| 日韩电影天堂视频一区二区| 免费亚洲网站| 91成年人网站| 欧美综合色免费| av福利精品| 成人精品在线视频| 亚洲精彩视频| 无码人妻一区二区三区免费n鬼沢| 亚洲一区免费在线观看| 嫩草影院一区二区| 欧洲中文字幕国产精品| 精品国产91| 一起操在线视频| 伊人色综合久久天天| 欧美 日韩 国产 成人 在线 91| 欧美极品少妇xxxxx| 琪琪久久久久日韩精品| 久久久久人妻精品一区三寸| 欧美韩国一区二区| 国产裸体无遮挡| 欧美激情一级欧美精品| 欧洲在线一区| www日韩在线观看| 自拍视频在线观看一区二区| 精品久久久久成人码免费动漫| 久久久久国产精品免费网站| 香蕉久久夜色精品国产使用方法| 国产裸体免费无遮挡| 亚洲欧洲色图综合| 日本精品一二区| 国产精品成人v| 午夜日本精品| 51妺嘿嘿午夜福利| 日韩一区二区在线观看视频播放| 国产福利在线免费观看| 久久综合色一本| 激情偷乱视频一区二区三区| 国产无码精品视频| 色一区av在线| 成人三级毛片| 五月婷婷激情久久| 亚洲国产毛片aaaaa无费看| 欧美日本网站| 91麻豆精品秘密入口| 国产精品毛片| 黑鬼狂亚洲人videos| 日韩精品在线免费观看| 91国产精品| 亚洲中文字幕久久精品无码喷水| 17c精品麻豆一区二区免费| 五月天激情开心网| 成人av在线网址| 国产欧美不卡| 欧美成人精品激情在线视频| 亚洲欧美三级在线| av一级亚洲| 伊人免费视频二| 色婷婷激情综合|