亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

快速實現一個簡單的canvas迷宮游戲的示例

2024-09-05 07:22:33
字體:
來源:轉載
供稿:網友

前言

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

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

點我體驗

git地址

正文

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

首先當然得有個地圖,然后得有個移動的小人,這兩個我們利用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是迷宮的圖片地址,startingX和startingY,是起始點的坐標。在這里圖片引入的方式用了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的要求不高,拿來玩一下還是挺不錯的。

然后依然是每次都一樣的結尾,如果內容有錯誤的地方歡迎指出;如果對你有幫助,歡迎點贊和收藏,轉載請征得同意后著明出處,如果有問題也歡迎私信交流,主頁有郵箱地址~溜了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产999在线观看| 欧美一区二粉嫩精品国产一线天| 欧美激情a在线| 狠狠操狠狠色综合网| 欧美激情xxxx| 午夜精品久久久久久久男人的天堂| 亚洲欧美在线播放| 国产精品96久久久久久| 亚洲国产91色在线| 欧美国产日韩精品| 奇米4444一区二区三区| 欧美日韩国产91| 日韩av不卡在线| 欧美日韩中文字幕综合视频| 黑人巨大精品欧美一区二区一视频| 国产香蕉97碰碰久久人人| 中文字幕日韩免费视频| 国产精品亚洲аv天堂网| 2019国产精品自在线拍国产不卡| 在线播放国产一区二区三区| 色哟哟网站入口亚洲精品| 亚洲成**性毛茸茸| 亚洲色图日韩av| 欧美激情视频网站| 国产精品久久久久久久久久| 精品欧美一区二区三区| 亚洲a级在线播放观看| 国产拍精品一二三| 国产色婷婷国产综合在线理论片a| 久久久久久久久中文字幕| 欧美精品xxx| 91精品久久久久久久| 久久综合久久八八| 国产精品丝袜久久久久久高清| 国产热re99久久6国产精品| 久久婷婷国产麻豆91天堂| 91免费欧美精品| 欧美成人精品不卡视频在线观看| 欧美自拍视频在线| 欧美激情一级二级| 亚洲桃花岛网站| 久久99亚洲精品| 茄子视频成人在线| 亚洲图片在线综合| 日韩精品中文在线观看| 国产精品久久婷婷六月丁香| 欧美成人免费全部| 国产一区二区三区在线| 国产午夜精品美女视频明星a级| 北条麻妃99精品青青久久| 亚洲国产精品女人久久久| 欧美黄色片免费观看| 亚洲国产精品福利| 性欧美长视频免费观看不卡| 精品女厕一区二区三区| 久久精品电影一区二区| 亚洲国产精品99久久| 色青青草原桃花久久综合| 亚洲人永久免费| 国产精品av在线播放| 久久久精品在线观看| 粉嫩av一区二区三区免费野| 欧美激情二区三区| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品欧美久久久| 成人国产亚洲精品a区天堂华泰| 亚洲综合中文字幕68页| 日本国产高清不卡| 91国内揄拍国内精品对白| 欧美亚洲视频在线看网址| 亚洲美女在线观看| 久久久亚洲网站| 国内精品伊人久久| 岛国av一区二区三区| 在线观看国产精品91| 欧美日韩精品在线| 日韩av片电影专区| 久久亚洲影音av资源网| 国产亚洲精品一区二区| 国产精品扒开腿做爽爽爽的视频| 久久影院免费观看| 成人国产在线视频| 亚洲精品日产aⅴ| 欧美一区二区大胆人体摄影专业网站| 清纯唯美亚洲激情| 国产精品日韩av| 欧美理论在线观看| 国产亚洲精品日韩| 久久久之久亚州精品露出| 在线观看国产成人av片| 国产在线播放91| 精品国产一区二区三区久久久| 久久亚洲精品网站| 九九九热精品免费视频观看网站| 日韩欧美在线字幕| 日韩经典中文字幕| 欧美日韩精品在线播放| 尤物九九久久国产精品的分类| 亚洲美女在线视频| 欧美一区二区三区……| 久久久91精品国产| 久久久国产一区二区三区| 国产美女高潮久久白浆| 欧美日韩一区二区精品| 国产精品亚洲视频在线观看| 欧美激情女人20p| 91免费精品国偷自产在线| 在线看国产精品| 欧美日韩国产第一页| 亚洲激情免费观看| 亚洲精品99久久久久中文字幕| 亚洲一区二区三区成人在线视频精品| 欧美成人性色生活仑片| 最新中文字幕亚洲| 成人激情综合网| 欧美又大又硬又粗bbbbb| 精品福利视频导航| 欧美电影在线免费观看网站| 国产精品高清免费在线观看| 欧美性生交xxxxx久久久| 欧美成人亚洲成人| 久久久午夜视频| 久99九色视频在线观看| 亚洲精品自拍偷拍| 97精品视频在线播放| 91九色蝌蚪国产| 欧美一级视频一区二区| 欧美日韩午夜剧场| 91天堂在线视频| 日韩精品视频在线观看网址| 色偷偷综合社区| 亚洲精品永久免费| 九色精品免费永久在线| 欧美性猛交xxxxx水多| 久久精品视频在线观看| 欧美极品少妇xxxxx| 亚洲性视频网站| 在线看欧美日韩| 国内精品视频在线| 欧美日韩国产中文精品字幕自在自线| 国产精品成人免费电影| 日韩在线观看免费| 亚洲精品日韩在线| 国产欧美日韩亚洲精品| 一区二区在线免费视频| 91久久久在线| 高跟丝袜欧美一区| 91九色国产社区在线观看| 最新中文字幕亚洲| 最近2019年日本中文免费字幕| 浅井舞香一区二区| 久久高清视频免费| 日韩电影中文字幕在线观看| 亚洲国语精品自产拍在线观看| 国产精品久久在线观看| 久久久久久久久久久免费精品| 亚洲成人免费网站| 欧美综合在线观看| 亚洲缚视频在线观看| 欧美色视频日本高清在线观看| 国产亚洲福利一区| 亚洲人成电影网站色xx| 最近免费中文字幕视频2019| 亚洲欧洲美洲在线综合|