pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5技術(shù)之圖像處理:一個滑動的拼圖游戲

HTML5有許多功能特性可以把多媒體整合到網(wǎng)頁中。使用canvas元素可以在這個空白的畫板上填充線條,載入圖片文件,甚至動畫效果。在這篇文章中,我將做一個滑動拼圖的游戲用來展示
HTML5有許多功能特性可以把多媒體整合到網(wǎng)頁中。使用canvas元素可以在這個空白的畫板上填充線條,載入圖片文件,甚至動畫效果。

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

復(fù)制代碼


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

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

還可以加入兩個參數(shù)用于設(shè)置圖片的寬和高
  1. drawImage(image, x, y, width, height);
復(fù)制代碼

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

  1.   
       
  2.    
  3.    
  4.    
  5.   





  • 復(fù)制代碼
    上面的DIV包括了另一個HTML5標(biāo)簽:range input,這個標(biāo)簽可以讓用戶拖放滑塊選擇一個數(shù)值。回頭我們再說在拼圖中如何與range input交互。到目前為止ie和firefox并不支持這個標(biāo)簽。
    現(xiàn)在就像我上面說過,想要在canvas上繪圖,我們需要context。
    1. var context = document.getElementById("puzzle").getContext("2d");
    復(fù)制代碼

    對了我們還需要一個圖片,使用例子里自帶的,或者找一個和canvas相同大小的圖片都行。
    1. var img = new Image();
    2. img.src = 'http://www.brucealderman.info/Images/dimetrodon.jpg';
    3. img.addEventListener('load', drawTiles, false);
    復(fù)制代碼

    加入這個事件是確保圖片完成加載后,再把圖片放入canvas中。下面我們通過range input設(shè)置拼圖的數(shù)量,數(shù)據(jù)范圍從3到5(幾行幾列)。
    1. var boardSize = document.getElementById('puzzle').width;
    2. var tileCount = document.getElementById('scale').value;
    復(fù)制代碼

    有了上面兩個數(shù)值就可以計(jì)算一個拼圖的大小了
    1. var tileSize = boardSize / tileCount;
    復(fù)制代碼

    OK我們開始創(chuàng)建畫板
    1. var boardParts = new Object;
    2. setBoard();
    復(fù)制代碼

    setBoard()的作用是初始化看板,要模擬顯示這個畫板,我們使用一個二維數(shù)組。不過用JavaScript創(chuàng)建這樣數(shù)組的過程不是很優(yōu)雅,我們先定義一個平面數(shù)組,每個數(shù)組再定義一個數(shù)組。這個拼圖游戲,每一個元素都是一個對象,它帶有x和y坐標(biāo)記錄所在的網(wǎng)格位置。因此每個對象有兩個坐標(biāo),第一個坐標(biāo)是數(shù)組坐標(biāo),表示它在畫板的位置,另外的坐標(biāo)是對象的x,y屬性,它記錄著拼圖圖片的位置。當(dāng)這兩個坐標(biāo)相同了就說明位置正確。
    為了達(dá)到目的,我們在初始化的時候把它們的位置互換。這樣拼圖就不在正確的位置了。
    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. }
    復(fù)制代碼

    最后三個變量我們還沒有定義
    我們必須追蹤空白拼圖的位置還要記錄用戶點(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;
    復(fù)制代碼

    最后這個變量是指拼圖是否完成
    1. var solved = false;
    復(fù)制代碼

    所有的拼圖都找到正確的位置后,設(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. };
    復(fù)制代碼

    還要追蹤鼠標(biāo)經(jīng)過的拼圖以及哪個拼圖被點(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. };
    復(fù)制代碼

    有一些瀏覽器會在重畫畫板之前彈出對話框,為了防止它的發(fā)生,一定要用延遲。
    1. if (solved) {
    2.     setTimeout(function() {alert("You solved
    3. it!");}, 500);
    4. }
    復(fù)制代碼

    當(dāng)一個拼圖被點(diǎn)擊時,我們要知道它的四周是否可以移動。判斷的方法是當(dāng)前位置到空白位置的總距離為1時就可以移動。
    簡單點(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. }
    復(fù)制代碼

    移動拼圖的做法是,我們復(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. }
    復(fù)制代碼

    一旦拼圖移動了,我們還要檢查一下拼圖是否全部在正確的位置。
    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. }
    復(fù)制代碼

    如果有一個拼圖不正確函數(shù)就會返回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. }
    復(fù)制代碼

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




    轉(zhuǎn)自天地會

    【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

    相關(guān)文檔推薦

    由于實(shí)際運(yùn)行環(huán)境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達(dá)到,所以這部分不是開發(fā)者能夠決定的,開發(fā)者能作的是盡可能通
    本文將使用HTML5提供的VideoAPI做一個自定義的視頻播放器,需要用到HTML5提供的video標(biāo)簽、以及HTML5提供的對JavascriptAPI的擴(kuò)展。,HTML5中國,中國最大的HTML5中文門戶。
    隨著 Hybrid 應(yīng)用的豐富,HTML5 工程師們已經(jīng)不滿足于把桌面端體驗(yàn)簡單移植到移動端,他們覬覦移動原生應(yīng)用人性化的操作體驗(yàn),特別是原生應(yīng)用與生俱來的豐富的手勢系統(tǒng)。HTML5 沒有提
    你想要在自己網(wǎng)站上分享一個產(chǎn)品,或者是一個作品集,又或者僅僅只是一個靈感。在你發(fā)布到網(wǎng)上之前,你想讓它看起來有吸引力,專業(yè),或者至少得看起來像那么回事。那么你接下
    H5廣告,包括H5廣告的設(shè)計(jì)流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個講義。同時,也讓我意外的收到了非常好反饋和認(rèn)!這是對我的極大鼓勵!我的
    本文主要內(nèi)容有:框架與組件、構(gòu)建生態(tài)、開發(fā)技巧與調(diào)試、html、css與重構(gòu)、native/hybrid/桌面開發(fā)、前端/H5優(yōu)化、全棧/全端開發(fā)、研究實(shí)驗(yàn)、數(shù)據(jù)分析與監(jiān)控、其它軟技能、前端技術(shù)網(wǎng)
    主站蜘蛛池模板: 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 有声小说,听书,听小说资源库-听世界网| 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 免费网站网址收录网_海企优网站推荐平台 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 天然气分析仪-液化气二甲醚分析仪|传昊仪器 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 深圳希玛林顺潮眼科医院(官网)│深圳眼科医院│医保定点│香港希玛林顺潮眼科中心连锁品牌 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 粉丝机械,粉丝烘干机,粉丝生产线-招远市远东粉丝机械有限公司 | 博莱特空压机|博莱特-阿特拉斯独资空压机品牌核心代理商 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 视觉检测设备_自动化检测设备_CCD视觉检测机_外观缺陷检测-瑞智光电 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 集菌仪厂家_全封闭_封闭式_智能智能集菌仪厂家-上海郓曹 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 |