精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

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

 功能說明:

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

該游戲基于自己開發的HTML5游戲框架cnGameJS。

效果預覽:

實現分析:

1.關于多層地圖。

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

新增的layer對象:

每個layer對象維護該層的sprite,負責更新和繪制它們,并且可以獲取指定坐標在該層的矩陣上的值。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.             *設置layer對應位置的值 
  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.             *根據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]) {    //根據地圖矩陣,繪制每個方格 
  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.         } 

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

  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.關于移動場景。

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

view對象新增的方法:applyInView:

applyInView方法的作用是在不改變地圖和玩家實際坐標的前提下,在繪制時使view固定,其他游戲元素相對于view移動,實現移動背景的效果。例如,我們需要使玩家相對于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內所有元素都會相對于view而移動。

而applyInView的實現原理也非常簡單,它只是不斷使繪制的原點和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. 10個超炫的、激發靈感的HTML 5游戲
  2. HTML 5中的文件處理之File Writer API
  3. 如何在ASP.NET網站中使用HTML 5拖放功能
  4. 基于引擎開發HTML 5游戲實戰
  5. 8個非常有用的HTML 5工具你值得擁有
責任編輯:陳貽新 來源: CSON的博客
相關推薦

2012-04-01 10:02:00

HTML5

2012-04-13 09:42:34

2012-03-06 10:56:32

HTML 5

2012-06-29 09:49:51

HTML5

2013-06-26 10:12:09

HTML5ichartjs

2013-03-06 15:05:44

移動瀏覽器移動游戲HTML5

2012-06-07 14:54:58

2014-10-30 10:28:09

HTML5

2010-05-24 08:53:33

HTML 5開發工具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

2016-09-21 09:37:57

2014-12-30 17:13:51

HTML5

2011-04-14 09:36:53

Silverlight

2012-01-06 14:10:13

HTML 5

2012-05-15 10:35:35

HTML5

2012-06-06 14:46:52

HTML5

2011-06-09 15:30:31

HTML 5
點贊
收藏

51CTO技術棧公眾號

欧洲不卡av| 中文字幕视频网站| 日韩电影免费观看高清完整版在线观看| 中文幕一区二区三区久久蜜桃| 成人久久精品视频| 久久久久99精品| 欧美军人男男激情gay| 在线不卡免费av| 日本十八禁视频无遮挡| 国产一二三区在线视频| 国内成人免费视频| 2019中文字幕在线免费观看| 亚洲少妇xxx| 亚洲三级中文字幕| 欧美不卡高清| 亚洲精品一区在线观看香蕉| 免费看毛片的网址| 国产午夜视频在线观看| 国产精品亚洲一区二区三区妖精 | 夜夜嗨网站十八久久| 亚洲天堂第一页| 国产大尺度视频| 国产一区高清| 日韩欧美在线观看| 白白操在线视频| 成人全视频高清免费观看| 成人国产免费视频| 成人性生交大片免费看视频直播| 天堂а√在线中文在线新版 | 国产精品色呦| 欧美精品久久天天躁| 亚洲午夜精品久久久久久人妖| 国产成人无吗| 国产欧美日韩久久| 97在线观看视频国产| 尤物在线免费视频| 成人免费看片39| 精品视频www| 大尺度做爰床戏呻吟舒畅| 国产一区二区三区免费在线 | 午夜精品理论片| 久久爱一区二区| 欧美亚洲激情| 亚洲日本欧美中文幕| 少妇被狂c下部羞羞漫画| 久久中文字幕一区二区| 555www色欧美视频| 亚洲欧美日本一区二区三区| 日韩中文在线播放| 91高清视频在线| 五月天国产一区| 视频国产在线观看| 94色蜜桃网一区二区三区| 538国产精品一区二区免费视频| 亚洲xxxx3d动漫| 五月天久久久| www日韩中文字幕在线看| 日韩精品卡通动漫网站| 伊甸园亚洲一区| 亚洲人成在线观看网站高清| 丰满少妇一区二区三区| 99久久香蕉| 六月丁香婷婷久久| 日韩av色在线| 中文字幕有码视频| 免费在线观看一区二区三区| 国产精品美女网站| 亚洲图片视频小说| 极品销魂美女一区二区三区| 成人欧美一区二区三区在线湿哒哒| 亚洲中文字幕在线观看| 国产在线一区二区| 久久久亚洲精选| 国产一级片播放| av不卡在线看| 国产精品99久久久久久人 | 日韩亚洲国产中文字幕欧美| 成人毛片一区二区| 中文字幕在线免费观看视频| 欧美色综合天天久久综合精品| 在线免费视频一区| 国产一区二区| 亚洲精品成人网| 欧美 日韩 成人| 一区二区三区四区在线观看国产日韩| 久久国产视频网站| 精品成人av一区二区在线播放| 三级一区在线视频先锋 | 亚洲精品在线播放| 亚洲成av人片在线观看香蕉| 在线免费观看日韩av| 成人网18免费网站| 欧美黑人性视频| 国产精品免费精品一区| 精品亚洲国产成人av制服丝袜 | 亚洲一区免费观看| 人妻有码中文字幕| 国产激情精品一区二区三区| 亚洲国产精品久久久久秋霞不卡| 久久久久无码精品国产sm果冻| 中文字幕人成人乱码| 欧美做爰性生交视频| 97人妻人人澡人人爽人人精品| 国产成人精品一区二| 蜜桃91精品入口| 老司机午夜在线视频| 午夜精品视频一区| www.涩涩涩| 亚洲三级av| 亚洲一区二区福利| 一区二区三区免费高清视频| 日本三级亚洲精品| 日韩av日韩在线观看| 国产成人免费看一级大黄| 精品一区二区三区在线观看| 国产一区二区在线网站| 免费看美女视频在线网站| 精品女同一区二区三区在线播放| 亚洲免费黄色录像| 亚洲欧洲美洲国产香蕉| 九九精品视频在线| 欧美在线视频精品| jlzzjlzz国产精品久久| 这里只有精品66| 成人软件在线观看| 亚洲激情视频网| 青青操视频在线播放| 热久久免费视频| 日本10禁啪啪无遮挡免费一区二区| 美女91在线| 欧美一区二区高清| 成人欧美一区二区三区黑人一| 香蕉成人久久| 黑人另类av| 巨骚激情综合| 婷婷综合五月天| 久久国产劲爆∧v内射| 亚洲影视一区| 成人精品视频久久久久 | 欧美第一黄网免费网站| 91中文字幕在线视频| 欧美激情在线看| 欧美三级理论片| 成人av资源电影网站| 国产99久久久欧美黑人| 青青青草原在线| 欧美日韩激情网| 国产在线观看无码免费视频| 亚洲综合社区| 欧美日韩一区二区视频在线观看| 在线观看特色大片免费视频| 日韩精品久久久久久久玫瑰园| 日本一级黄色大片| 97se亚洲国产综合自在线不卡 | 免费看一级一片| 国产福利不卡视频| 久久这里只有精品23| 国产精品对白久久久久粗| 久久青草福利网站| 男人天堂一区二区| 欧美午夜www高清视频| 少妇大叫太粗太大爽一区二区| 噜噜噜在线观看免费视频日韩| 国产日韩精品电影| 日本天堂在线观看| 欧美一级专区免费大片| 久久久久久久福利| 成人avav影音| 国产欧美高清在线| 日韩精品1区| 91精品久久久久久久久久| www久久日com| 亚洲精品美女在线| 日韩欧美国产另类| 成人免费观看男女羞羞视频| 欧美 丝袜 自拍 制服 另类| 伊人久久综合影院| 国产美女被下药99| 日韩专区av| 日韩av在线一区二区| 欧美亚洲另类小说| 最近日韩中文字幕| 日本黄色动态图| 日本欧美久久久久免费播放网| 中文字幕在线亚洲三区| 中文字幕一区图| 国产成人精品电影久久久| 在线观看免费版| 欧美精品一区二区三区蜜桃视频| 在线能看的av| 综合中文字幕亚洲| 亚洲第一黄色网址| 久久99蜜桃精品| 青青草成人免费在线视频| 国产精品一在线观看| 亚洲iv一区二区三区| 国产高潮在线| 亚洲第一精品福利| 国产真人无遮挡作爱免费视频| 亚洲色图19p| 中文字幕高清视频| 国产精品资源在线观看| 成人免费无码av| 欧美精选一区| 91中文在线视频| 成人免费短视频| 欧美成人手机在线| 男同在线观看| 欧美成人vps| 中文字幕一区二区人妻痴汉电车| 五月综合激情网| 老湿机69福利| 国产美女一区二区| 少妇性饥渴无码a区免费| 亚洲国产精品久久久天堂| 日本不卡二区高清三区| 高清精品视频| 亚洲最大福利网站| 成人自拍视频网| 91爱爱小视频k| 欧美午夜大胆人体| 日韩一二三在线视频播| 蜜桃成人在线视频| 亚洲国语精品自产拍在线观看| 91亚洲精品国偷拍自产在线观看| 色婷婷av一区二区三区gif| 国产精品99精品| 亚洲综合久久久久| 国产麻豆视频在线观看| 国产精品国产三级国产专播品爱网| 国产美女精品久久| 91色综合久久久久婷婷| 制服丝袜av在线| 国产成人一区在线| 手机在线观看日韩av| 久久精品国产**网站演员| 一区二区成人网| 久久久亚洲一区| 日韩免费毛片视频| 久久精品一区二区国产| 国产高清精品在线观看| 99国产成+人+综合+亚洲欧美| 国产一级不卡视频| 欧美日韩网址| 香港三级日本三级a视频| 亚洲欧美综合| 东北少妇不带套对白| 精品电影一区| 日韩av在线第一页| 乱人伦精品视频在线观看| 红桃av在线播放| 欧美亚洲三区| 人妻内射一区二区在线视频| 免费在线亚洲| 不卡av免费在线| 激情国产一区二区| 亚洲国产综合av| 成人午夜免费视频| a视频免费观看| 国产欧美精品一区二区色综合| 日本一道本视频| 成人免费小视频| 久久久久亚洲AV| 亚洲国产aⅴ成人精品无吗| 国产 日韩 欧美 成人| 姬川优奈aav一区二区| 中文字幕在线欧美| 欧美性感一类影片在线播放| 在线观看国产成人| 91精品国产乱码| 日韩永久免费视频| 亚洲欧洲在线免费| 麻豆传媒视频在线| 欧美激情国产高清| 午夜不卡影院| 国产在线日韩在线| 91麻豆精品国产91久久久久推荐资源| 国模精品一区二区三区| 国产乱码精品一区二区亚洲| youjizz.com亚洲| 亚洲精品四区| 日本人视频jizz页码69| 国产精品18久久久久久久久久久久 | 老色鬼在线视频| 国产精品你懂得| 午夜精品在线| 成人av资源在线播放| 亚洲精品一区二区三区中文字幕| 久久精品中文字幕一区二区三区 | 欧美成人手机视频| 精品福利樱桃av导航| 中文字幕网址在线| 亚洲成人激情在线观看| av网站在线免费观看| 欧美激情一区二区三区久久久| 三级中文字幕在线观看| 成人免费视频网址| 亚洲国产欧美日韩在线观看第一区| 一区二区视频在线观看| 亚洲区国产区| 亚洲一区二区偷拍| 国产亚洲成aⅴ人片在线观看| 一区二区在线观看免费视频| 在线观看视频一区二区| 国产香蕉在线观看| 久久激情视频久久| 新片速递亚洲合集欧美合集| 99影视tv| 999国产精品| 能看的毛片网站| 99久免费精品视频在线观看| 国产大片免费看| 欧美性受极品xxxx喷水| 黄色一级大片在线免费看国产| 神马国产精品影院av| 中文字幕在线中文字幕在线中三区| 99porn视频在线| 欧美成免费一区二区视频| 欧美视频第三页| 本田岬高潮一区二区三区| www深夜成人a√在线| 欧美亚洲一区二区三区四区| 日韩大胆视频| 韩国三级电影久久久久久| 成人福利一区二区| 视频一区免费观看| 丝袜亚洲另类欧美| 日韩精品无码一区二区三区久久久| 亚洲福利视频导航| 亚洲AV无码精品自拍| 久久久国产视频91| 亚洲日韩中文字幕一区| 亚洲免费不卡| 欧美人与禽猛交乱配视频| 超碰超碰在线观看| 国产a视频精品免费观看| 国产三级aaa| 欧美日韩视频在线一区二区| 国产污视频在线| 国产精品扒开腿做爽爽爽视频 | 国产在线xxx| 91丨九色丨国产| 中文字幕一区二区三区乱码图片| 午夜剧场高清版免费观看| 国产网站一区二区| 久久这里只有精品9| 一个人www欧美| 亚洲网站三级| 欧美精品一区二区性色a+v| 国产一区二区三区香蕉| 黄色录像二级片| 欧美一级黄色片| 久久久123| 久草热久草热线频97精品| 麻豆9191精品国产| 国产jk精品白丝av在线观看| 欧美日韩综合一区| 免费黄色在线看| 999热视频在线观看| 在线看片成人| 成人免费看aa片| 欧美午夜精品一区| av在线影院| 国产一区二区中文字幕免费看| 欧美综合二区| 女教师淫辱の教室蜜臀av软件| 51精品视频一区二区三区| 国产在线xxx| 日韩视频在线播放| 国产一区二区日韩精品| 久久伊人成人网| 亚洲男人天堂久| 欧美91在线|欧美| 日本免费a视频| 久久九九久久九九| 999久久久久| 欧美孕妇与黑人孕交| 欧美xxav| 欧产日产国产精品98| 欧美在线制服丝袜| 2024最新电影免费在线观看| 精品国产乱码久久久久久郑州公司| 视频一区在线播放| 青春草免费视频| 一区二区成人精品| 国产福利一区二区精品秒拍| 久久婷婷国产91天堂综合精品| 一区二区三区四区在线| 户外极限露出调教在线视频| 91在线视频九色| 久久久久欧美精品| 国产精品白嫩白嫩大学美女| 亚洲欧美制服另类日韩| 成人久久精品| av片中文字幕| 亚洲一卡二卡三卡四卡无卡久久| 国产女人在线观看| 国产99视频精品免费视频36| 日本视频在线一区| 国产成人无码一区二区三区在线 |