gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

自己動(dòng)手打造html5星際迷航的示例代碼分享

學(xué)習(xí)html5的canvas第三天,覺得還沒過癮,轉(zhuǎn)眼就忘,于是趁著有空,準(zhǔn)備弄個(gè)小游戲來玩!游戲應(yīng)該需要注意性能,還有一些邏輯需要斟酌,我想還需要用戶可修改性,也就是用戶配置。好,開始我們簡單但有趣的旅程吧——

想先看效果的,先跳轉(zhuǎn)試玩一下吧!

第一步,當(dāng)然需要一張畫布

1 <canvas id="canvas" width="300" height="400">你的瀏覽器不支持Canvas</canvas>

JavaScript的總體結(jié)構(gòu)如下:

var定義一些變量  planeMoveTimer飛機(jī)移動(dòng)監(jiān)聽/計(jì)時(shí)器  attackEnemyTimer發(fā)射炮彈計(jì)時(shí)器  onkeydown監(jiān)聽  onkeyup監(jiān)聽  drawPlane畫飛機(jī)  drawEnemy畫敵人

首先預(yù)定義一些變量

var _keyA = _keyD = _keyW = _keyS = 0,  // 存儲(chǔ)按鍵狀態(tài)        step = 8,                          // 飛機(jī)移動(dòng)速率      w = 34, h = 44,                  // 飛機(jī)實(shí)際大小      planeX = 133, planeY = 356,      // 飛機(jī)目前位置      planeSrc = "feiji.png",          // 飛機(jī)素材位置      imgW = 177, imgH = 220,          // 飛機(jī)源圖尺寸        cw = 300, ch = 400,  // 畫布大小      canvas = document.getElementById("canvas"),      ctx = canvas.getContext("2d");

本游戲只用到一個(gè)外部資源,就是那張圖片,獲取地址請?jiān)L問本文底部給出的項(xiàng)目GitHub位置鏈接。跳轉(zhuǎn)

先看畫圖的兩個(gè)方法

function drawPlane(x, y) {      var img = new Image();      img.src = planeSrc;  // 飛機(jī)源圖地址      img.onload = function() {          ctx.drawImage(img, 0, 0, imgW, imgH, planeX, planeY, w, h);      }  }  function drawEnemy(){      for(var a=0;a<cw;a+=10) {          for(var b=0;b<ch-300;b+=10) {              ctx.beginPath();              ctx.fillStyle = "orange";              ctx.strokeStyle = "black";              ctx.strokeRect(a, b, 10 ,10);              ctx.fillRect(a, b, 10, 10);              ctx.closePath();          }      }  }

飛機(jī)的圖片一定要在onload()方法里才能把飛機(jī)畫出來,目前的敵人還是一堆橙色的不會(huì)動(dòng)的磚頭,通過遍歷在畫布的頂端把它們畫出來。

接著,看兩個(gè)鍵盤事件:

window.document.onkeydown = function(evt){      evt = (evt) ? evt : window.event;      switch(evt.keyCode) {          case 65:  // A              _keyA = 1;              break;          case 68:  // D              _keyD = 1;              break;          case 87:  // W              _keyW = 1;              break;          case 83:  // S              _keyS = 1;              break;      }  }  window.document.onkeyup = function(evt){      evt = (evt) ? evt : window.event;      switch(evt.keyCode) {          case 65:  // A              _keyA = 0;              break;          case 68:  // D              _keyD = 0;              break;          case 87:  // W              _keyW = 0;              break;          case 83:  // S              _keyS = 0;              break;      }  }

至于為什么要在兩個(gè)事件里設(shè)置變量_keyA、_keyD、_keyW、_keyS,而不是直接觸發(fā)畫圖事件,原因是——同時(shí)長按兩個(gè)鍵時(shí),無法同時(shí)觸發(fā)事件,先按者只觸發(fā)一次,只有后按者在按著鍵的時(shí)候才能一直觸發(fā)事件,簡單點(diǎn)來說,如果我想要向左上角移動(dòng),同時(shí)按下A和W,假設(shè)A比W慢了一點(diǎn)點(diǎn),即時(shí)很微小,那么飛機(jī)的移動(dòng)路徑是先上移一步然后一直向左移動(dòng),這顯然不是我想要的,我用4個(gè)變量來存儲(chǔ)按鍵的狀態(tài),按下鍵的時(shí)候,設(shè)置其狀態(tài)為1,在按鍵起來的時(shí)候,設(shè)置其狀態(tài)為0,然后我們用計(jì)時(shí)器來不斷地讀這些鍵的狀態(tài)并及時(shí)更新飛機(jī)的狀態(tài)。

飛機(jī)移動(dòng)計(jì)時(shí)器如下:

var planeMoveTimer = window.setInterval(function(){      if(_keyA||_keyD||_keyW||_keyS){          ctx.clearRect(planeX, planeY, w, h);          _keyA && (planeX-=step);          _keyD && (planeX+=step);          _keyW && (planeY-=step);          _keyS && (planeY+=step);          planeX>=0 || (planeX=0);          planeX<=(cw-w) || (planeX=cw-w);          planeY>=0 || (planeY=0);          planeY<=(ch-h) || (planeY=ch-h);          drawPlane(planeX, planeY);      }  }, 10);

ctx.clearRect()用來清除原來位置的飛機(jī),為繪制飛機(jī)的下一狀態(tài)做準(zhǔn)備,但是有一個(gè)很大的問題,它是直接清除整塊的,要是游戲有背景,有交疊,那不是要把這些不是飛機(jī)的東西也一并清空了?恕我愚昧,暫時(shí)不考慮這個(gè)問題。

通過判斷按鍵狀態(tài),每次移動(dòng)的步距為預(yù)先設(shè)置的step,并做好邊界處理。

然后是攻擊計(jì)時(shí)器:

var attackEnemyTimer = window.setInterval(function(){      var cannonX = planeX+Math.floor(w/2);  // 炮口X軸位置      var cannonY = planeY;  // 炮口Y軸位置      var tmpTimer = window.setInterval(function(){  // 每顆炮彈的移動(dòng)計(jì)時(shí)器          ctx.clearRect(cannonX-1, cannonY-3, 2, 3);          cannonY -= 3;  // 炮彈步距          if(cannonY<0){              // 炮彈的貫透效果              ctx.beginPath();              ctx.moveTo(cannonX, 100);  // 100為enemy的最低位置              ctx.strokeStyle = "white";              ctx.lineWidth = "4";  // 模擬不規(guī)則毀壞,暫時(shí)尚未沒實(shí)現(xiàn)              ctx.lineTo(cannonX, 0);              ctx.stroke();              ctx.closePath();              window.clearInterval(tmpTimer);  // 清除該炮彈的計(jì)時(shí)器          }          ctx.clearRect(cannonX-1, cannonY-3, 2, 3);          ctx.beginPath();          ctx.fillStyle="red";          ctx.fillRect(cannonX-1, cannonY-3, 2, 3);  // 炮彈大小:2X3          ctx.closePath();      }, 0);  }, 500);

每0.5s發(fā)射一顆炮彈,每顆炮彈又單獨(dú)設(shè)置一個(gè)計(jì)時(shí)器,以便控制,炮彈的移動(dòng)我也是采用先擦后畫的方式,由于炮彈移動(dòng)也有步距,所謂炮彈貫透效果就是直接畫一條顏色跟背景色一樣的直線而已。試著修改炮彈步距可以調(diào)節(jié)炮彈的移動(dòng)速度,也可以調(diào)節(jié)炮彈的尺寸。

最后一步了,還差點(diǎn)什么,一開始就要畫好敵人和飛機(jī)啦!

1 drawPlane();  2 drawEnemy();

大功告成!還想繼續(xù)優(yōu)化增加可玩性的,但實(shí)在是沒時(shí)間弄了,還有很多其他的東西要學(xué),所以這個(gè)游戲就先這樣啦!是不是很簡單!哈哈,囧了吧,標(biāo)題太誘惑人,沒辦法!

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
av磁力番号网| 97免费视频观看| 久久成人免费观看| 亚洲一区二区三区四区精品| 日日橹狠狠爱欧美超碰| 欧美 亚洲 视频| 午夜xxxxx| av中文字幕网址| 狠狠躁狠狠躁视频专区| av免费中文字幕| 欧美久久在线观看| 国产精品久久久久久久久电影网| 日韩av一卡二卡三卡| 另类小说色综合| 狠狠热免费视频| 人妻无码视频一区二区三区| 国产精品免费入口| 欧美精品色婷婷五月综合| 久久久一本二本三本| 水蜜桃色314在线观看| 一卡二卡三卡视频| 国产淫片免费看| 日韩欧美一区二| 老子影院午夜伦不卡大全| av动漫在线播放| 久久国产精品国产精品| 免费一区二区三区在线观看| 欧美性猛交内射兽交老熟妇| 国产欧美高清在线| 欧美黄色免费网址| 伊人影院综合在线| 日韩网站在线免费观看| 亚洲天堂国产视频| 国产亚洲综合视频| 蜜桃视频成人在线观看| 玩弄japan白嫩少妇hd| 久久久久久久久网| 9久久婷婷国产综合精品性色 | 无码日韩人妻精品久久蜜桃| 欧美少妇一级片| 久久久国产欧美| 免费网站在线观看视频 | 四虎免费在线观看视频| 国产成人亚洲精品无码h在线| 国内av免费观看| 国产一区二区视频免费在线观看 | 国产aⅴ爽av久久久久| 91国视频在线| 国产精品又粗又长| 成人高清dvd| 天天看片天天操| 看欧美ab黄色大片视频免费| 分分操这里只有精品| 黄网站色视频免费观看| 999热精品视频| 性生活免费在线观看| 国产精彩免费视频| 97国产在线播放| 久久99久久99精品| 国产乱子伦精品视频| 特色特色大片在线| 波多野结衣在线免费观看| 特级丰满少妇一级| 免费一区二区三区在线观看| 手机在线成人免费视频| www日韩在线观看| 久久黄色免费看| 久久综合久久色| 99福利在线观看| 国产偷人视频免费| 国产又黄又猛视频| 欧美美女一级片| 中文字幕在线视频一区二区三区 | 日本久久久久久久久久久久| 欧美日韩中文在线视频| 男人搞女人网站| 亚洲免费av一区| 手机在线免费毛片| 在线观看视频黄色| 4444亚洲人成无码网在线观看 | 日本黄色三级大片| 国产一二三四在线视频| 8x8x成人免费视频| 99热一区二区三区| 欧美国产综合在线| 18岁视频在线观看| 性欧美videossex精品| 成人亚洲免费视频| 精品无码av无码免费专区| 国产人妻人伦精品| 女性隐私黄www网站视频| 999精彩视频| 女女同性女同一区二区三区按摩| 中国女人做爰视频| 欧美日韩在线中文| www.久久av.com| 国产乱子伦精品无码专区| 欧美日韩在线视频一区二区三区| 美女少妇一区二区| 成人小视频在线观看免费| 久久网站免费视频| 欧美成人三级在线播放| 9色porny| 日韩一级理论片| 日韩一二区视频| 高清一区在线观看| 黄网站欧美内射| 色偷偷中文字幕| 国产精品自拍片| 午夜大片在线观看| 日韩av在线第一页| 日韩video| 国产精品亚洲a| www.九色.com| 天天久久综合网| 久久久久久久午夜| 午夜啪啪免费视频| 日韩a在线播放| 国产aaa免费视频| 午夜大片在线观看| 妓院一钑片免看黄大片| 男人添女人荫蒂免费视频| 中文字幕成人免费视频| 欧美视频第一区| 妞干网在线观看视频| 亚洲女人在线观看| 尤蜜粉嫩av国产一区二区三区| 人人妻人人做人人爽| 三级性生活视频| 9久久婷婷国产综合精品性色| 丝袜人妻一区二区三区| 欧美精品色视频| av免费一区二区| 亚洲五月天综合| 日韩在线一级片| www.日本少妇| 人人妻人人澡人人爽欧美一区| www.色欧美| 鲁一鲁一鲁一鲁一av| 天天影视综合色| 亚洲色欲综合一区二区三区| 国产一区二区四区| 四虎精品欧美一区二区免费| 国产一区二区在线观看免费视频| 国产福利一区视频| 免费裸体美女网站| 亚洲自偷自拍熟女另类| 少妇高潮喷水在线观看| 可以看毛片的网址| 国产不卡一区二区视频| 特级西西人体www高清大胆| 欧美日韩视频免费在线观看| 日本中文字幕二区| 手机在线国产视频| 国产免费中文字幕| 国产福利精品一区二区三区| 国产又猛又黄的视频| 依人在线免费视频| 三年中文在线观看免费大全中国| 欧洲在线免费视频| 国产四区在线观看| 青青草视频在线视频| 日韩精品视频在线观看视频| 精品视频在线观看一区| 国产在线青青草| 黄色一级一级片| 天天综合网久久| 亚洲欧美天堂在线| 亚洲欧美日韩一二三区| 最新黄色av网站| www污在线观看| 黄色一级一级片| 亚洲午夜激情影院| 精品一区二区成人免费视频 | 天堂av手机在线| 69精品丰满人妻无码视频a片| 久久久久99精品成人片| 东京热加勒比无码少妇| 17c国产在线| 日韩在线视频在线| 成年人网站大全| 日本美女视频一区| 国产成人一区二区三区别| 69堂免费视频| 欧美一级xxxx| 国产日韩亚洲欧美在线| www.日本xxxx| 今天免费高清在线观看国语| 国产主播自拍av| 日韩av.com| 欧美亚洲精品一区二区| 污污的网站18| bt天堂新版中文在线地址| 一本久道综合色婷婷五月| www.桃色.com| 成年人小视频网站| 免费在线观看污污视频| 又粗又黑又大的吊av| 亚洲一区二区中文字幕在线观看| 老太脱裤子让老头玩xxxxx|