我們繼續這一系列文章,使用HTML5的canvas組件進行游戲開發。今天,這是相當完整的游戲例子 – 它會回顧經典的舊電腦游戲 – 坦克大戰。我會教你使用陣列地圖并教你如何檢測活動對象(坦克)與環境(基于陣列的地圖)的碰撞。
你可以點擊這里閱讀這一系列教程的前一篇文章: html5游戲制作入門系列教程(四) 。我們的將基于之前的程序和代碼進行開發。
?
這里有我們的演示和下載包:
?
好吧,下載所需文件,讓我們開始編碼!
?
步驟1: HTML
這里是我演示的HTML,非常簡單,對不對?
<!DOCTYPE html> <html lang="en" > <head> <meta charset="utf-8" /> <title>html5游戲制作入門系列教程(五)</title> <link href="css/main.css" rel="stylesheet" type="text/css" /> <script src="js/jquery-1.5.2.min.js"></script> <script src="js/script.js"></script> </head> <body> <header> <h2>html5游戲制作入門系列教程(五)</h2> <a class="stuts">返回原文<span>HTML5GAME</span></a> </header> <div class="container"> <canvas id="scene" width="800" height="600"></canvas> </div> </body> </html>
?
步驟2:CSS
下面是使用CSS樣式。
css/main.css
今天就不把css樣式貼出來了,和以前的一樣,沒有什么特別之處。你可以在下載包里找到它。
?
步驟3:JS
js/script.js
// inner variables var canvas, context; // canvas and context objects var imgBrick, imgSteel, imgWater, imgForest, imgTank; // images var aMap; // map array var oTank; // tank object var iCellSize = 24; // cell wide var iXCnt = 26; // amount of X cells var iYCnt = 26; // amount of Y cells // objects : function Tank(x, y, w, h, image) { this.x = x; this.y = y; this.w = w; this.h = h; this.i = 0; this.image = image; } // functions function clear() { // clear canvas function context.clearRect(0, 0, canvas.width, canvas.height); } function drawScene() { // main drawScene function clear(); // clear canvas // fill background context.fillStyle = '#111'; context.fillRect(0, 0, canvas.width, canvas.height); // save current context context.save(); // walk through our array for (var y = 0; y < iYCnt; y++) { for (var x = 0; x < iXCnt; x++) { switch (aMap[y][x]) { case 0: // skip break; case 1: // draw brick block context.drawImage(imgBrick, 0, 0, iCellSize, iCellSize, x*iCellSize, y*iCellSize, iCellSize, iCellSize); break; case 2: // draw steel block context.drawImage(imgSteel, 0, 0, iCellSize, iCellSize, x*iCellSize, y*iCellSize, iCellSize, iCellSize); break; case 3: // draw forest block context.drawImage(imgForest, 0, 0, iCellSize, iCellSize, x*iCellSize, y*iCellSize, iCellSize, iCellSize); break; case 4: // draw water block context.drawImage(imgWater, 0, 0, iCellSize, iCellSize, x*iCellSize, y*iCellSize, iCellSize, iCellSize); break; } } } // restore current context context.restore(); // draw tank context.drawImage(oTank.image, oTank.i*oTank.w, 0, oTank.w, oTank.h, oTank.x, oTank.y, oTank.w, oTank.h); } // ------------------------------------------------------------- // initialization $(function(){ canvas = document.getElementById('scene'); canvas.width = iXCnt * iCellSize; canvas.height = iYCnt * iCellSize; context = canvas.getContext('2d'); // main scene Map array aMap = ([ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 4, 4, 4, 4, 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 4, 4, 4, 4, 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 4, 4, 4, 4, 1, 1, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 2, 2, 0, 0], [0, 0, 0, 0, 4, 4, 4, 4, 1, 1, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 1, 1, 0, 0, 0, 0], [0, 0, 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 2, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3, 3, 3, 3, 1, 1, 0, 0, 4, 4, 4, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [3, 3, 3, 3, 1, 1, 0, 0, 4, 4, 4, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2], [3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2], [0, 0, 1, 1, 4, 4, 4, 4, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 4, 4, 4, 4, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 0, 0, 1, 1, 0, 0], [2, 2, 0, 0, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 2, 2, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 2, 2, 0, 0, 0, 0] ]); // load images imgBrick = new Image(); imgBrick.src = 'images/brick.png'; imgSteel = new Image(); imgSteel.src = 'images/steel.png'; imgWater = new Image(); imgWater.src = 'images/water.png'; imgForest = new Image(); imgForest.src = 'images/forest.png'; imgTank = new Image(); imgTank.src = 'images/tank.png'; oTank = new Tank(iCellSize*9, iCellSize*24, 48, 48, imgTank); $(window).keydown(function(event){ // keyboard alerts switch (event.keyCode) { case 38: // Up key oTank.i = 2; // checking collisions var iCurCelX = (2 * oTank.x) / 48; var iCurCelY = (2 * oTank.y) / 48; if (iCurCelY) { var iTest1 = aMap[iCurCelY-1][iCurCelX]; var iTest2 = aMap[iCurCelY-1][iCurCelX+1]; if ((iTest1 == 0 || iTest1 == 3) && (iTest2 == 0 || iTest2 == 3)) { oTank.y-=24; if (oTank.y < 0) { oTank.y = 0; } } } break; case 40: // Down key oTank.i = 3; // checking collisions var iCurCelX = (2 * oTank.x) / 48; var iCurCelY = (2 * oTank.y) / 48; if (iCurCelY+2 < iYCnt) { var iTest1 = aMap[iCurCelY+2][iCurCelX]; var iTest2 = aMap[iCurCelY+2][iCurCelX+1]; if ((iTest1 == 0 || iTest1 == 3) && (iTest2 == 0 || iTest2 == 3)) { oTank.y+=24; if (oTank.y > 576) { //iCellSize * (iYCnt-2) oTank.y = 576; } } } break; case 37: // Left key oTank.i = 1; // checking collisions var iCurCelX = (2 * oTank.x) / 48; var iCurCelY = (2 * oTank.y) / 48; var iTest1 = aMap[iCurCelY][iCurCelX-1]; var iTest2 = aMap[iCurCelY+1][iCurCelX-1]; if ((iTest1 == 0 || iTest1 == 3) && (iTest2 == 0 || iTest2 == 3)) { oTank.x-=24; if (oTank.x < 0) { oTank.x = 0; } } break; case 39: // Right key oTank.i = 0; // checking collisions var iCurCelX = (2 * oTank.x) / 48; var iCurCelY = (2 * oTank.y) / 48; var iTest1 = aMap[iCurCelY][iCurCelX+2]; var iTest2 = aMap[iCurCelY+1][iCurCelX+2]; if ((iTest1 == 0 || iTest1 == 3) && (iTest2 == 0 || iTest2 == 3)) { oTank.x+=24; if (oTank.x > 576) { //iCellSize * (iXCnt-2) oTank.x = 576; } } break; } }); setInterval(drawScene, 40); // loop drawScene });
?
結論
超級酷,不是嗎?我會很高興看到您的評論和意見。祝你好運!
?
轉載請注明: HTML5游戲開發者社區 ? html5游戲制作入門系列教程(五)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
