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

基于HTML 5的橫版射擊游戲發(fā)布 附源碼

開(kāi)發(fā) 后端
基于HTML5的橫版射擊游戲,參考自flash游戲《雙面特工》。左右方向鍵控制移動(dòng),下方向鍵蹲下,上方向鍵跳躍,空格鍵射擊。體驗(yàn)前請(qǐng)先關(guān)閉輸入法。

 功能說(shuō)明:

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

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

效果預(yù)覽:

實(shí)現(xiàn)分析:

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

在上一個(gè)HTML5游戲《坦克后援隊(duì)》中,所用的地圖只為簡(jiǎn)單的單層地圖,意思是地圖中除了石頭就是空地,僅僅只有一層的地圖。但是這種單層地圖具有比較大的局限性,如果需要實(shí)現(xiàn)場(chǎng)景類(lèi)的游戲(例如超級(jí)瑪麗和上面的游戲),只有一層的地圖往往是不夠的,因?yàn)槲覀兂擞螒蛑鹘撬镜恼系K物外,還有游戲背景等元素(例如后面的墻壁等),因此我們需要為地圖對(duì)象分層,從而達(dá)到多層展示的目的。

新增的layer對(duì)象:

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

  1. /** 
  2.         *層對(duì)象 
  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.                 *默認(rèn)對(duì)象 
  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.             *獲取特定對(duì)象在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.             *獲取特定對(duì)象在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.             *獲取特定對(duì)象是否剛好與格子重合 
  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對(duì)應(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的矩陣?yán)L制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ù)地圖矩陣,繪制每個(gè)方格 
  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.                             //繪制特定坐標(biāo)的圖像 
  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)于移動(dòng)場(chǎng)景。

在上一次的HTML5《游戲超級(jí)瑪麗游戲demo》中,我們通過(guò)使游戲玩家的移動(dòng)轉(zhuǎn)換為游戲場(chǎng)景的移動(dòng)來(lái)實(shí)現(xiàn)玩家固定,場(chǎng)景移動(dòng)的效果,但是這種實(shí)現(xiàn)方法有比較大的問(wèn)題,因?yàn)樗缮媪说貓D和玩家的xy值的變化,因此會(huì)帶來(lái)很多不便。更好的實(shí)現(xiàn)方法是,保持玩家和地圖的xy值不變,只改變繪制它們時(shí)原點(diǎn)的坐標(biāo)。

view對(duì)象新增的方法:applyInView:

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

  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); 

在繪制時(shí):

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

這樣map內(nèi)所有元素都會(huì)相對(duì)于view而移動(dòng)。

而applyInView的實(shí)現(xiàn)原理也非常簡(jiǎn)單,它只是不斷使繪制的原點(diǎn)和view的坐標(biāo)等長(zhǎng)且相反:

  1. /** 
  2.             *使坐標(biāo)相對(duì)于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.             }, 

這樣無(wú)論view的坐標(biāo)如何變化,view在視覺(jué)上始終固定在canvas,其他元素的坐標(biāo)在視覺(jué)上始終相對(duì)于view。

該游戲所有源碼下載地址:點(diǎn)擊下載

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

【編輯推薦】

  1. 10個(gè)超炫的、激發(fā)靈感的HTML 5游戲
  2. HTML 5中的文件處理之File Writer API
  3. 如何在ASP.NET網(wǎng)站中使用HTML 5拖放功能
  4. 基于引擎開(kāi)發(fā)HTML 5游戲?qū)崙?zhàn)
  5. 8個(gè)非常有用的HTML 5工具你值得擁有
責(zé)任編輯:陳貽新 來(lái)源: CSON的博客
相關(guān)推薦

2012-04-01 10:02:00

HTML5

2012-04-13 09:42:34

2012-03-06 10:56:32

HTML 5

2012-06-07 14:54:58

2012-06-29 09:49:51

HTML5

2014-10-30 10:28:09

HTML5

2013-06-26 10:12:09

HTML5ichartjs

2013-03-06 15:05:44

移動(dòng)瀏覽器移動(dòng)游戲HTML5

2010-05-24 08:53:33

HTML 5開(kāi)發(fā)工具Adobe HTML5

2011-04-15 12:48:28

雙搖桿射擊游戲游戲iOS

2012-05-09 09:41:58

HTML5

2012-05-10 09:45:14

HTML5

2011-12-21 09:38:31

HTML 5

2014-12-30 17:13:51

HTML5

2016-09-21 09:37:57

2012-05-15 10:35:35

HTML5

2012-01-06 14:10:13

HTML 5

2012-06-06 14:46:52

HTML5

2011-06-09 15:30:31

HTML 5

2012-02-23 14:08:44

點(diǎn)贊
收藏

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