<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        使用canvas實現迷宮游戲

        來源:懂視網 責編:小采 時間:2020-11-27 15:04:55
        文檔

        使用canvas實現迷宮游戲

        使用canvas實現迷宮游戲:這篇文章主要介紹了關于使用canvas實現迷宮游戲,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下前言(最近設計模式看的有點頭大,一直面對純js實在是有些枯燥-_-。所以寫一點有趣的東西調劑一下)現在canvas已經不算新鮮了,不過由于日常業
        推薦度:
        導讀使用canvas實現迷宮游戲:這篇文章主要介紹了關于使用canvas實現迷宮游戲,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下前言(最近設計模式看的有點頭大,一直面對純js實在是有些枯燥-_-。所以寫一點有趣的東西調劑一下)現在canvas已經不算新鮮了,不過由于日常業

        這篇文章主要介紹了關于使用canvas實現迷宮游戲,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

        前言

        (最近設計模式看的有點頭大,一直面對純js實在是有些枯燥-_-。所以寫一點有趣的東西調劑一下)
        現在canvas已經不算新鮮了,不過由于日常業務中并不常用,所以實踐并不多,今天分享一下,如何實現簡單canvas迷宮。這個例子來源于《html5秘籍》第二版,代碼有稍微做了點調整。

        由于中間有一步使用canvas獲取圖片信息的時候,必須使用服務器環境。所以我先寫了一個樣例扔在服務器上,大家可以先體驗一下效果(用成就感作為驅動力哈哈哈)

        正文

        實現這個小游戲也不難,讓我們想想,一個迷宮游戲有哪些基本要素。

        首先當然得有個地圖,然后得有個移動的小人,這兩個我們利用cavans來繪制;

        接下來是物體移動的程序,這個程序主要包括2個方面:

        1.讓物體跟我們指定的指令來移動;
        2.檢測物體是否碰到墻體或者出口。

        繪制迷宮的地圖和移動的小人

        繪制地圖的主要步驟是:

        1. 獲取一張地圖的圖片

        2. 利用cavans繪制圖像。

        迷宮地圖的生成,可以借助谷歌的一個迷宮在線生成器來獲得。

        繪制小人也是一樣直接找一個小人的圖片即可,不過這里要注意的是,要找正方形的圖片,因為一會我們需要做移動的碰撞檢測,方形比較好判斷。

        接下來就要寫繪制迷宮和小人的主要函數

        function drawMaze(mazeFile, startingX, startingY) {
         var imgMaze = new Image()
         imgMaze.onload = function () {
         // 畫布大小調整
         canvas.width = imgMaze.width
         canvas.height = imgMaze.height
        
         // 繪制笑臉
         var imgFace = document.getElementById("face")
         context.drawImage(imgMaze, 0, 0)
        
         x = startingX
         y = startingY
         context.drawImage(imgFace, x, y)
         context.stroke()
         }
         imgMaze.src = mazeFile
        }

        mazeFile是迷宮的圖片地址,startingXstartingY,是起始點的坐標。在這里圖片引入的方式用了2種,原因是小人的圖片我不經常更換,就直接寫在頁面里,迷宮的地圖打算做成可變的,所以在js里引入,你想把圖片都直接用js引入也沒有問題。其他部分比較簡單,不再贅述。

        移動函數

        移動的主要原理是:
        接受指定的用戶輸入(在這里是響應方向鍵),轉換成對應的移動指令。然后周期性的檢查移動指令,繪制對應的目標位置。舉個簡單的例子:

        比如每按下一次方向鍵上,就記錄下應該往上移動,然后每隔100毫秒檢查當前的移動指令,繪制應該移動的目標地點,重復這個過程。代碼也比較簡單:

        // 移動函數
        function processKey(e) {
         dx = 0
         dy = 0
         // 上下左右方向鍵檢測
         if (e.keyCode === 38) {
         dy = -1
         }
         if (e.keyCode === 40) {
         dy = 1
         }
         if (e.keyCode === 37) {
         dx = -1
         }
         if (e.keyCode === 39) {
         dx = 1
         }
        }
        
        // 繪制幀
        function drawFrame() {
         if (dx != 0 || dy != 0) {
         // context.clearRect(x,y,canvas.width,canvas.height)
         // 繪制移動軌跡
         context.beginPath();
         context.fillStyle = "rgb(254,244,207)"
         context.rect(x, y, 15, 15)
         context.fill()
         x += dx
         y += dy
         // 碰撞檢測
         if (checkForCollision()) {
         x -= dx
         y -= dy
         dx = 0
         dy = 0
         }
         
         //繪制小人應該移動的地點
         var imgFace = document.getElementById('face')
         context.drawImage(imgFace, x, y)
        
         if (canvas.height - y < 17) {
         // isFirst = false
         alert('恭喜你通關 游戲結束')
         return false
         }
         // 這里如果重置的話變成非自動移動,也就是每按下一次方向鍵只前進一步,由于目前體驗不好所以先不做重置
         // dx = 0
         // dy = 0
         }
         setTimeout(drawFrame, 20)
        }

        上述代碼中,移動函數比較簡單,繪制幀的函數里面比較重要的就是碰撞檢測函數,在下面詳細解釋。

        碰撞檢測

        要檢測物體與墻體是否碰撞,通常情況是要先把地圖信息保存到內存里,然后在移動物體時檢測是否與當前的某個墻體碰撞,但是由于我們的地圖背景是黑白迷宮,所以可以使用顏色來檢測碰撞。具體的做法是:

        獲取當前物體的坐標位置,利用canvas檢測當前地圖上這個位置的顏色是否為黑色,如果是,說是是墻體,不應該執行移動,下面就是代碼:

        function checkForCollision() {
         var imageData = context.getImageData(x - 1, y - 1, 15 + 2, 15 + 2)
         var pixels = imageData.data
        
         for (var i = 0, len = pixels.length; i < len; i++) {
         var red = pixels[i],
         green = pixels[i + 1]
         blue = pixels[i + 2]
         alpha = pixels[i + 3]
        
         // 檢測是否碰到黑色的墻
         if (red === 0 && green === 0 && blue === 0) {
         return true
         }
         }
         return false
        }

        在這里,15是小人的寬度,我們檢測小人兩側各1px范圍(對應代碼中的getImageData(x - 1, y - 1, 15 + 2, 15 + 2)可以稍微思考下這里為什么是+2),如果是黑色,說明檢測到碰撞。

        其余

        在代碼里,我加了一些其他的功能,比如提示答案等。至于更換地圖也比較簡單:把地圖對應的文件地址,起點坐標,答案圖片路徑等存在一個對象里,然后設置一個地圖數組,點擊的時候切換地圖并重新渲染就可以了。還有一些值得優化的地方,比如:

        1. 碰撞檢測在拐彎的地方體驗不佳;

        2. 當前情況運行時有軌跡,在答案模式下應該如何去掉軌跡?

        有興趣的同學可以試著自己實現下。

        小結

        這個例子相對比較簡單,對js的要求不高,拿來玩一下還是挺不錯的。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用canvas實現迷宮游戲

        使用canvas實現迷宮游戲:這篇文章主要介紹了關于使用canvas實現迷宮游戲,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下前言(最近設計模式看的有點頭大,一直面對純js實在是有些枯燥-_-。所以寫一點有趣的東西調劑一下)現在canvas已經不算新鮮了,不過由于日常業
        推薦度:
        標簽: 實現 迷宮 canvas
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 岛国岛国免费V片在线观看| 国产免费网站看v片在线| 久久精品国产亚洲AV天海翼| 18女人腿打开无遮掩免费| 四虎永久在线精品免费观看地址| 亚洲天堂中文字幕在线| 无遮挡国产高潮视频免费观看| 9420免费高清在线视频| 亚洲情侣偷拍精品| 亚洲丰满熟女一区二区v| 成人自慰女黄网站免费大全| 久久久久一级精品亚洲国产成人综合AV区| 亚洲精品中文字幕无乱码| 国产大片91精品免费观看不卡| 午夜精品在线免费观看| 亚洲精品蜜夜内射| 亚洲日韩人妻第一页| 免费a级毛片无码a∨免费软件| 亚洲国产精品不卡在线电影| 一级成人生活片免费看| 女人18毛片水真多免费播放| 国产偷国产偷亚洲清高APP| 亚洲色成人中文字幕网站| 三年片在线观看免费大全电影 | 精品国产亚洲一区二区三区| 亚洲最大天堂无码精品区| 免费a级毛片大学生免费观看| 亚洲av日韩av无码av| 四虎国产精品免费视| 成人性做爰aaa片免费看| 亚洲Av无码一区二区二三区| 免费人成激情视频| 日韩免费无码视频一区二区三区 | 成人免费夜片在线观看| 亚洲成AV人在线播放无码| 国产精品偷伦视频免费观看了| 亚洲精品高清久久| 国产福利免费在线观看| 精品久久久久亚洲| 久久亚洲AV成人无码| 日本妇人成熟免费中文字幕|