自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于HTML5的橫版射擊游戲發(fā)布

開發(fā) 前端
基于HTML5的橫版射擊游戲,參考自flash游戲《雙面特工》。左右方向鍵控制移動,下方向鍵蹲下,上方向鍵跳躍,空格鍵射擊。體驗前請先關(guān)閉輸入法。該游戲基于自己開發(fā)的HTML5游戲框架cnGameJS。

功能說明:

基于HTML5的橫版射擊游戲,參考自flash游戲《雙面特工》。左右方向鍵控制移動,下方向鍵蹲下,上方向鍵跳躍,空格鍵射擊。體驗前請先關(guān)閉輸入法。

該游戲基于自己開發(fā)的HTML5游戲框架cnGameJS。

效果預(yù)覽:

移步原文預(yù)覽

實現(xiàn)分析:

1.關(guān)于多層地圖。  

在上一個HTML5游戲《坦克后援隊》中,所用的地圖只為簡單的單層地圖,意思是地圖中除了石頭就是空地,僅僅只有一層的地圖。但是這種單層地圖具有比較大的局限性,如果需要實現(xiàn)場景類的游戲(例如超級瑪麗和上面的游戲),只有一層的地圖往往是不夠的,因為我們除了游戲主角所站的障礙物外,還有游戲背景等元素(例如后面的墻壁等),因此我們需要為地圖對象分層,從而達到多層展示的目的。

新增的layer對象:

每個layer對象維護該層的sprite,負責(zé)更新和繪制它們,并且可以獲取指定坐標在該層的矩陣上的值。layer對象源碼如下:

  1. /**  
  2.         *層對象  
  3.         **/                                 
  4.         var layer = function(id,mapMatrix, options) {  
  5.       
  6.             if (!(this instanceof arguments.callee)) {  
  7.                 return new arguments.callee(id,mapMatrix, options);  
  8.             }  
  9.             this.init(id,mapMatrix, options);  
  10.         }  
  11.         layer.prototype={  
  12.               
  13.             /**  
  14.             *初始化  
  15.             **/  
  16.             init: function(id,mapMatrix,options) {  
  17.                 /**  
  18.                 *默認對象  
  19.                 **/      
  20.                 var defaultObj = {  
  21.                     cellSize: [32, 32],   //方格寬,高  
  22.                     x: 0,                      //layer起始x  
  23.                     y: 0                  //layer起始y  
  24.       
  25.                 };      
  26.                 optionsoptions = options || {};  
  27.                 options = cg.core.extend(defaultObj, options);  
  28.                 this.id=options.id;  
  29.                 this.mapMatrix = mapMatrix;  
  30.                 this.cellSize = options.cellSize;  
  31.                 this.x = options.x;  
  32.                 this.y = options.y;  
  33.                 this.row = mapMatrix.length; //有多少行  
  34.                 thisthis.width=this.cellSize[0]* mapMatrix[0].length;  
  35.                 thisthis.height=this.cellSize[1]* this.row;  
  36.                 this.spriteList=new cg.SpriteList();//該層上的sprite列表  
  37.                 this.imgsReference=options.imgsReference;//圖片引用字典:{"1":{src:"xxx.png",x:0,y:0},"2":{src:"xxx.png",x:1,y:1}}  
  38.                 this.zIindex=options.zIndex;  
  39.             },  
  40.             /**  
  41.             *添加sprite  
  42.             **/              
  43.             addSprites:function(sprites){  
  44.                 if (cg.core.isArray(sprites)) {  
  45.                     for (var i = 0len = sprites.length; i < len; i++) {  
  46.                         arguments.callee.call(this, sprites[i]);  
  47.                     }  
  48.                 }  
  49.                 else{  
  50.                     this.spriteList.add(sprites);  
  51.                     sprites.layer=this;  
  52.                 }                  
  53.                   
  54.             },  
  55.             /**  
  56.             *獲取特定對象在layer中處于的方格的值  
  57.             **/  
  58.             getPosValue: function(x, y) {  
  59.                 if (cg.core.isObject(x)) {  
  60.                     y = x.y;  
  61.                     xx = x.x;  
  62.                 }  
  63.                 var isUndefined = cg.core.isUndefined;  
  64.                 y = Math.floor(y / this.cellSize[1]);  
  65.                 x = Math.floor(x / this.cellSize[0]);  
  66.                 if (!isUndefined(this.mapMatrix[y]) && !isUndefined(this.mapMatrix[y][x])) {  
  67.                     return this.mapMatrix[y][x];  
  68.                 }  
  69.                 return undefined;  
  70.             },  
  71.             /**  
  72.             *獲取特定對象在layer中處于的方格索引  
  73.             **/  
  74.             getCurrentIndex: function(x, y) {  
  75.                 if (cg.core.isObject(x)) {  
  76.                     y = x.y;  
  77.                     xx = x.x;  
  78.                 }  
  79.                 return [Math.floor(x / this.cellSize[0]), Math.floor(y / this.cellSize[1])];  
  80.             },  
  81.             /**  
  82.             *獲取特定對象是否剛好與格子重合  
  83.             **/  
  84.             isMatchCell: function(x, y) {  
  85.                 if (cg.core.isObject(x)) {  
  86.                     y = x.y;  
  87.                     xx = x.x;  
  88.                 }  
  89.                 return (x % this.cellSize[0] == 0) && (y % this.cellSize[1] == 0);  
  90.             },  
  91.             /**  
  92.             *設(shè)置layer對應(yīng)位置的值  
  93.             **/  
  94.             setPosValue: function(x, y, value) {  
  95.                 this.mapMatrix[y][x] = value;  
  96.             },  
  97.             /**  
  98.             *更新層上的sprite列表  
  99.             **/              
  100.             update:function(duration){  
  101.                 this.spriteList.update(duration);  
  102.                   
  103.             },  
  104.             /**  
  105.             *根據(jù)layer的矩陣繪制layer和該layer上的所有sprite  
  106.             **/  
  107.             draw: function() {  
  108.                 var mapMatrix = this.mapMatrix;  
  109.                 var beginX = this.x;  
  110.                 var beginY = this.y;  
  111.                 var cellSize = this.cellSize;  
  112.                 var currentRow;  
  113.                 var currentCol  
  114.                 var currentObj;  
  115.                 var row = this.row;  
  116.                 var img;  
  117.                 var col;  
  118.                 for (var i = beginYylen = beginY + row * cellSize[1]; i < ylen; i += cellSize[1]) {    //根據(jù)地圖矩陣,繪制每個方格  
  119.                     currentRow = (i - beginY) / cellSize[1];  
  120.                     col=mapMatrix[currentRow].length;  
  121.                     for (var j = beginXxlen = beginX + col * cellSize[0]; j < xlen; j += cellSize[0]) {  
  122.                         currentCol = (j - beginX) / cellSize[0];  
  123.                         currentObj = this.imgsReference[mapMatrix[currentRow][currentCol]];  
  124.                         if(currentObj){  
  125.                             currentObjcurrentObj.x = currentObj.x || 0;  
  126.                             currentObjcurrentObj.y = currentObj.y || 0;  
  127.                             img = cg.loader.loadedImgs[currentObj.src];  
  128.                             //繪制特定坐標的圖像  
  129.                             cg.context.drawImage(img, currentObj.x, currentObj.y, cellSize[0], cellSize[1], j, i, cellSize[0], cellSize[1]);   
  130.                         }  
  131.                     }  
  132.                 }  
  133.                 //更新該layer上所有sprite  
  134.                 this.spriteList.draw();  
  135.       
  136.             }  
  137.         } 

之后我們可以很方便地創(chuàng)建不同的層,并添加到地圖中:

  1. /*    背景矩陣    */  
  2. var bgMatrix = [  
  3.                     [1,1,1],  
  4.                     [1,1,1],  
  5.                     [1,1,1]  
  6.                 ];  
  7.  
  8. this.map = new cnGame.Map({width:3000,height:3000});  
  9. var newnewLayer=new cnGame.Layer("bg",bgMatrix, { cellSize: [1000, 1000], width: this.map.width, height: this.map.height });  
  10. newLayer.imgsReference={ "1": { src: srcObj.bg }};  
  11. this.map.addLayer(newLayer); 

2.關(guān)于移動場景。 

在上一次的HTML5《游戲超級瑪麗游戲demo》中,我們通過使游戲玩家的移動轉(zhuǎn)換為游戲場景的移動來實現(xiàn)玩家固定,場景移動的效果,但是這種實現(xiàn)方法有比較大的問題,因為它干涉了地圖和玩家的xy值的變化,因此會帶來很多不便。更好的實現(xiàn)方法是,保持玩家和地圖的xy值不變,只改變繪制它們時原點的坐標。

view對象新增的方法:applyInView:

applyInView方法的作用是在不改變地圖和玩家實際坐標的前提下,在繪制時使view固定,其他游戲元素相對于view移動,實現(xiàn)移動背景的效果。例如,我們需要使玩家相對于view中點固定,該map上的其他所有游戲元素相對于view移動,我們只需要在初始化時:

  1. this.view=new cnGame.View({map:this.map,x:0,y:0,width:cnGame.width,height:cnGame.height});  
  2. this.view.centerElem(this.player,true); 

在繪制時:

  1. this.view.applyInView(function(){  
  2.             map.draw();          
  3.         }); 

這樣map內(nèi)所有元素都會相對于view而移動。

而applyInView的實現(xiàn)原理也非常簡單,它只是不斷使繪制的原點和view的坐標等長且相反:

  1. /**  
  2.             *使坐標相對于view  
  3.             **/  
  4.             applyInView:function(func){      
  5.                 cg.context.save();  
  6.                 cg.context.translate(-this.x, -this.y);  
  7.                 func();  
  8.                 cg.context.restore();  
  9.             }, 

這樣無論view的坐標如何變化,view在視覺上始終固定在canvas,其他元素的坐標在視覺上始終相對于view。

該游戲所有源碼下載地址:點擊下載

原文鏈接:http://www.cnblogs.com/Cson/archive/2012/03/15/2398129.html

【編輯推薦】

  1. HTML5人工智能基礎(chǔ)及OO實踐
  2. 10個絕對讓你瘋狂的HTML5和JS實驗性展示
  3. 淺談Web自動化測試原理
  4. HTML5游戲開發(fā)的五個最佳實踐
  5. 分享21個最新的超酷web設(shè)計特效
責(zé)任編輯:林師授 來源: Cson的博客
相關(guān)推薦

2012-03-16 09:35:52

HTML 5

2013-06-26 10:12:09

HTML5ichartjs

2013-03-06 15:05:44

移動瀏覽器移動游戲HTML5

2014-12-30 17:13:51

HTML5

2013-10-21 15:24:49

html5游戲

2013-06-24 14:55:30

HTML5

2015-07-08 16:38:10

Cocos游戲引擎

2016-04-18 16:20:55

2011-12-09 20:25:16

HTML5

2011-08-01 16:43:51

ibmdwHTML5Dojo

2013-08-01 10:28:52

移動通訊應(yīng)用KikHTML5游戲

2012-03-06 10:56:32

HTML 5

2013-03-06 16:14:16

UCHTML5游戲引擎

2015-07-06 09:57:04

HTML5CSS框架BootFlat

2012-03-29 09:18:47

HTML5WEB

2014-12-15 10:10:26

HTML5游戲引擎

2015-12-03 15:22:01

HTML5游戲建議

2014-11-12 16:00:12

火舞游戲

2013-01-24 10:26:04

HTML5HTML 5HTML5的未來

2015-10-23 13:44:14

巴巴獵
點贊
收藏

51CTO技術(shù)棧公眾號