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

一個HTML 5 躲避游戲的實現

開發 前端
HTML5寫游戲和傳統的游戲思路完全一樣,同樣也是不停刷新屏幕,游戲實際上也就是圖片的適時擺放問題,HTML5無非就只用到了一個canvas(畫布)的性質用來擺放圖片。

前段時間BrowserQuest激起了我對html5的樂趣,接下來記下一個小型html5躲避游戲的實現。

先上圖

QQ20120921 3

游戲很簡單,鍵盤控制人物上下左右移動,躲開怪物,時間越長越牛x。

主要是兩部分組成:一部分就是人物、地圖的結構搭建,另一部分就是讓英雄、怪物相應地動起來。

HTML5寫游戲和傳統的游戲思路完全一樣,同樣也是不停刷新屏幕,游戲實際上也就是圖片的適時擺放問題,HTML5無非就只用到了一個canvas(畫布)的性質用來擺放圖片。

Step 1 做好準備

新建一個html文件,命名為index.html,用作游戲的容器。代碼如下:

  1. <html>   
  2. <head>   
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
  4. <title>html5 game</title>   
  5. </head>   
  6. <body>   
  7. <h1>html5 game</h1>   
  8. <script type="text/javascript" src="move.js"></script>   
  9. </body>   
  10. </html> 

ps:script的引用最好放在body里放在body會有問題。

再新建個文件,move.js

  1. var canvas = document.createElement("canvas"); //創建元素canvas,即我們要用的畫布   
  2. var ctx = canvas.getContext("2d");//說明我們要用的畫布是2d,因為canvas也有WebGL支持3d   
  3. canvas.width = 512;//設置畫布的長寬   
  4. canvas.height = 480;   
  5. document.body.appendChild(canvas);//前面基本信息都設置好了之后,將這個元素添加到body標簽下。 

這樣畫布就算是搭建好了。

順帶在下面加幾個和圖片有關的函數。

  1. var bgReady = false;   
  2. var bgImage = new Image();   
  3. bgImage.src = "move/background.png";   
  4. bgImage.onload = function(){   
  5. bgReady = true;   
  6. }   
  7.     
  8. var heroReady = false;   
  9. var heroImage = new Image();   
  10. heroImage.src = "move/hero.png";   
  11. heroImage.onload = function(){   
  12. heroReady = true;   
  13. }   
  14.     
  15. var monsterReady = false;   
  16. var monsterImage = new Image();   
  17. monsterImage.src = "move/monster.png";   
  18. monsterImage.onload = function(){   
  19. monsterReady = true;   

這個游戲用了三張圖片,依次為背景、英雄、怪物。這段代碼很容易理解,為了不在圖片沒有加載完成的時候就draw圖片。

#p#

Step 2 定義原型

接下來定義一下英雄的原型。

  1. var hero = {   
  2. speed: 256,   
  3. x: canvas.width/2,   
  4. y: canvas.height/2   

這個原型也很好理解,每秒鐘英雄可以移動256個像素,英雄初始的位置為畫布中央(x,y分別為坐標)。

接下來輪到怪物了。: )

  1. function monster() {   
  2. this.x = Math.random() * canvas.width;//初始為止隨機   
  3. this.y = Math.random() * canvas.height;   
  4. this.speed = 100;   
  5. this.xDirection = 1;//默認移動方向為x軸正方向(以左上角為零點,下方和右方為正)   
  6. this.yDirection = 1;//同樣也為y軸正方向   
  7. this.move = function (modifier) {//移動函數   
  8. this.x += this.xDirection * this.speed * modifier;   
  9. this.y += this.yDirection * this.speed * modifier;   
  10. if (this.x >= canvas.width - 32)//碰撞返回部分   
  11. {   
  12. this.x = canvas.width - 32;   
  13. this.xDirection = -1;   
  14. }else if (this.x <= 0)   
  15. {   
  16. this.x = 0;   
  17. this.xDirection = 1;   
  18. }else if (this.y >= canvas.height - 32)   
  19. {   
  20. this.y = canvas.height - 32;   
  21. this.yDirection = -1;   
  22. }else if (this.y <= 0)   
  23. {   
  24. this.y = 0;   
  25. this.yDirection = 1;   
  26. }   
  27. };   

怪物比英雄的定義要復雜得多。首先,怪物每隔五秒會增加一個(為增加難度),故不能單純創建一個數組,而是需要一個類,再用類創建怪物對象。js當中只有類的半實現,具體使用function來創建。然后,怪物需要有撞墻返回的性質。

怪物的速度比英雄略慢,為100像素/秒。默認坐標在畫布當中隨機。怪物以45度移動。xDirection,yDirection合起來表示左上、左下、右上、右下4個方向。然后monster這個類有個move的動作,modifier表示兩次刷新的時間間隔,可以計算出經過時間間隔后怪物的坐標。下面4個if函數用來判斷,是否超越邊界,超越則馬上轉向,以實現碰撞的效果。

  1. var monsterSum = 0;   
  2. var monsterList = new Array();   
  3. monsterList[monsterSum] = new monster(); 

前面用var已經創建了英雄的實例,但是monster我們只建立了類而已,接下來要實例化。monsterSum表示怪物的數量,為方便,按照c的習慣,從0開始技術,即0表示有一個怪物。monsterList用來表示一個存怪物對象的數組,然后順帶新建一個怪物。

#p#

Step 3 游戲動起來!

先添加一個事件來接收鍵盤的動作,上下左右用對應的ascii碼。因為游戲并不是摁一下方向鍵,就移動一段距離。而是,判斷一個時間間隔內的動作(最后的動作,中間有可能會變化,故用數組保存最后結果)。

  1. var keysDown = {};   
  2. addEventListener("keydown", function (e) {   
  3. keysDown[e.keyCode] = true;//如果有"keydown"這個動作,即摁下某鍵,就會存進keysDown數組   
  4. }, false);   
  5. addEventListener("keyup", function (e) {   
  6. delete keysDown[e.keyCode];   
  7. }); 

下面上主函數

  1. var main = function () {   
  2. var now = Date.now();   
  3. var delta = now - then;   
  4. Move(delta / 1000);//每次間隔時間根本不是1ms,比1ms要大得多   
  5. Draw();   
  6. Check();   
  7. then = now;   

main函數就是主函數,就是一個刷新所執行的函數。now、then兩個變量記錄兩次刷新的時間間隔,這個時間間隔并不是固定的,一般為幾百毫秒。delta 是兩者之差,單位為毫秒。下面依次解釋各個函數:Move()用來計算英雄和怪物的新位置。Draw()用來畫背景、人物、文字。Check()用來檢查,怪物和英雄是否相撞。

Move():

  1. var Move = function (modifier) {   
  2. if (38 in keysDown) {   
  3. hero.y -hero.speed * modifier;   
  4. }   
  5. if (40 in keysDown) {   
  6. hero.y += hero.speed * modifier;   
  7. }   
  8. if (37 in keysDown) {   
  9. hero.x -hero.speed * modifier;   
  10. }   
  11. if (39 in keysDown) {   
  12. hero.x += hero.speed * modifier;   
  13. }   
  14. if (hero.x >= canvas.width - 32) {   
  15. hero.x = 0;   
  16. }else if (hero.x <= 0) {   
  17. hero.x = canvas.width - 32;   
  18. }   
  19. if (hero.y >= canvas.height - 32) {   
  20. hero.y = 0;   
  21. }else if (hero.y <= 0) {   
  22. hero.y = canvas.height - 32;   
  23. }   
  24. for (var i = 0; i <= monsterSum; i++) {   
  25. monsterList[i].move(modifier);   
  26. }   

這里很好理解,判斷這段時間間隔英雄的動作。算出新位置后,判斷英雄是否跑出了畫布,跑出了就從另一頭出來(感謝 @昭曈 的創意)。接下來依次調用各個怪物的move函數,計算他們的新位置。

Draw():

  1. var Draw = function () {   
  2. if (bgReady) {   
  3. ctx.drawImage(bgImage, 0 ,0);   
  4. }   
  5. if (heroReady) {   
  6. ctx.drawImage(heroImage, hero.x, hero.y);   
  7. }   
  8. if (monsterReady) {   
  9. for (var i = 0; i <= monsterSum; i++)   
  10. ctx.drawImage(monsterImage, monsterList[i].x, monsterList[i].y);   
  11. }   
  12. ctx.fillStyle = "rgb(250, 250, 250)";   
  13. ctx.font = "24px Helvetica";   
  14. ctx.textAlign = "left";   
  15. ctx.textBaseline = "top";   
  16. last = Date.now() - start;   
  17. ctx.fillText(last/1000, 32, canvas.height - 64);   

前三個函數類似,就是如果準備好了圖片就畫東西上去(前面的三個ready函數派上了用場)。下面先定義了文字的style,然后計算出時間間隔last,然后畫上去。

Check():

  1. var Check = function () {   
  2. if (monsterSum != Math.floor(last / 5000)){//如果時間經過5秒就增加一個怪獸實例   
  3. monsterSum ++;   
  4. monsterList[monsterSum] = new monster();   
  5. }   
  6. for (var i = 0; i <= monsterSum; i++) {   
  7. if (   
  8. (monsterList[i].x - 32) <= hero.x   
  9. && hero.x <= (monsterList[i].x + 32)   
  10. && (monsterList[i].y - 32) <= hero.y   
  11. && hero.y <= (monsterList[i].y + 32)   
  12. ) {   
  13. end = Date.now();   
  14. alert("你堅持了" + (end - start)/1000 + "秒");   
  15. End();   
  16. }   
  17. }   

第一步是 如果經過5秒就增加一個怪獸,然后下面一個個判斷怪獸與英雄是否接觸。(這里用的是矩形,@小樟 說可以用圓心,感興趣的可以試試: ) )

大家注意到了下面用到了一個end函數。下面補充,如果不停止一直刷新就瀏覽器就一直動了,故要有個結束函數。

End():

  1. var End = function () {   
  2. if (bgReady) {   
  3. ctx.drawImage(bgImage, 0 ,0); //留住背景   
  4. }   
  5. window.clearInterval(timer);   
  6. return;   

用到的clearInterval()稍后會說到。

#p#

Step 4 程序入口

  1. var then = Date.now();   
  2. var start = then;   
  3. timer = setInterval(main, 1); 

定義了初始的then和start,接下里用了setInterval(),意為每隔1ms就執行一次main函數。1ms是虛指,就是立即執行的意思。要想停止就用前面的clearInterval()函數。

到這里為止一個完整的游戲就寫好了~ : )

后來 @志謙 實踐出了一個bug,就是窗口如果最小化后,會一直計時,但不會被撞。問題在于高級的瀏覽器(當然沒在說IE : ) ),默認如果最小化后,會終止interval、timeout這類函數的執行,以節約資源。但我們計時的方法是結束時間減去開始時間,所以就造成這個刷分的bug。感謝 @小樟 提供了main函數遞歸,全局變量表示是否停止的辦法。

哦,第一次就那么沒了~

源碼下載地址:html5game

原文鏈接:http://billyellow.com/?p=10

責任編輯:張偉 來源: Billyellow's
相關推薦

2012-05-14 13:29:25

HTML5

2012-05-15 13:10:57

HTML5

2011-11-18 16:09:37

jQuery

2013-04-22 11:06:47

移動游戲盈利手機游戲

2012-03-29 09:18:47

HTML5WEB

2012-03-09 09:37:01

HTML 5

2020-11-30 06:20:13

javascript

2012-05-09 09:41:58

HTML5

2012-05-10 09:45:14

HTML5

2011-12-21 09:38:31

HTML 5

2012-05-28 15:31:57

App-UI

2010-02-05 09:28:13

HTML5Flash

2015-12-03 15:22:01

HTML5游戲建議

2014-12-30 17:13:51

HTML5

2013-12-19 09:58:36

移動應用產品市場

2012-09-11 13:34:27

HTML5JS

2011-12-21 20:13:31

2012-04-25 14:06:45

HTML5

2012-01-06 14:10:13

HTML 5

2012-05-15 10:35:35

HTML5
點贊
收藏

51CTO技術棧公眾號

欧美精品久久96人妻无码| 国产激情视频一区| 污污污www精品国产网站| 鲁鲁在线中文| 国产欧美视频一区二区三区| 成人国产精品久久久| 久草免费新视频| 亚洲宅男网av| 欧美一区二区精品在线| www黄色日本| 免费人成在线观看播放视频| 成人黄色综合网站| 国产精品视频午夜| 国产精品成人免费一区二区视频| 九九热爱视频精品视频| 91麻豆精品国产91久久久资源速度| 大西瓜av在线| 91精彩视频在线观看| 成人午夜av在线| 国产这里只有精品| 日韩精品一区二区亚洲av| 亚洲字幕久久| 尤物yw午夜国产精品视频| 国产sm在线观看| 中文.日本.精品| 天天综合色天天| 四虎免费在线观看视频| 国产高清视频在线播放| 99久久国产综合精品色伊| 成人羞羞国产免费| 精品国产青草久久久久96| 亚洲在线国产日韩欧美| 欧美精品videossex性护士| 日本少妇aaa| 国产欧美日韩视频在线| 亚洲国产精品人久久电影| 在线观看视频你懂得| 日韩成人精品一区二区三区| 在线观看区一区二| 免费男同深夜夜行网站| 精品人人视频| 婷婷综合久久一区二区三区| 波多野结衣与黑人| 国产黄色在线观看| 国产精品二三区| 亚洲欧美日韩综合一区| 国产中文在线| 欧美激情一二三区| 色爱区成人综合网| www在线播放| 国产欧美一区二区在线观看| 日本一区二区三区www| 三级在线观看| 久久久午夜电影| 日本不卡高清视频一区| 久草福利在线| 久久久99免费| 日韩国产精品一区二区| 国产视频第一区| 国产日韩欧美精品电影三级在线| 日本a级片久久久| 国产youjizz在线| 国产欧美日韩视频一区二区| 日韩中文字幕一区| 午夜激情视频在线观看| 成人免费在线视频观看| 男女啪啪的视频| 性网站在线观看| 亚洲成人av福利| 看av免费毛片手机播放| a欧美人片人妖| 欧美性猛交一区二区三区精品 | 一本一本久久a久久综合精品| 精品国模在线视频| 精品99久久久久成人网站免费| 欧美日韩第一区| 26uuu另类亚洲欧美日本一| 人妻丰满熟妇av无码区| 久久成人免费网站| 99免费在线观看视频| 特黄aaaaaaaaa真人毛片| 久久综合色之久久综合| 亚洲午夜久久久影院伊人| 麻豆传媒视频在线| 亚洲国产人成综合网站| 亚洲精品无码久久久久久| 国产成人a视频高清在线观看| 欧美精品v国产精品v日韩精品 | 日韩中文在线中文网三级| 日本在线一级片| 亚洲美女一区| 国产精品一区二区久久| 亚洲第一成年人网站| ww久久中文字幕| 青青草影院在线观看| 在线观看特色大片免费视频| 欧美日韩午夜在线视频| 久久久久久久久久久影视| 日韩美女毛片| 久久不射电影网| 亚洲va在线观看| 国产在线国偷精品产拍免费yy| 含羞草久久爱69一区| 日韩三级影院| 欧美天天综合色影久久精品| 国产乱叫456| 农村少妇一区二区三区四区五区| 色婷婷综合久久久久| 免费人成年激情视频在线观看| 久久亚洲风情| 国产伦精品一区二区三区四区免费 | 男人午夜免费视频| 国产成人免费视频网站高清观看视频| 欧美日韩国产一二| 乱插在线www| 欧美日韩精品一区二区三区 | 一区二区三区精品久久久| 欧美性猛交久久久乱大交小说| 精品视频在线观看免费观看| 亚洲性生活视频| 日韩av电影网| 国产精品一级片在线观看| 日本欧美精品久久久| av2020不卡| 日韩欧美国产1| 三级黄色免费观看| 奇米在线7777在线精品| 蜜桃av久久久亚洲精品| 2020日本在线视频中文字幕| 欧美一二三区在线观看| 少妇的滋味中文字幕bd| 久久国产直播| 久久精品人人做人人爽电影| 成人av影院在线观看| 91麻豆精品国产自产在线| 日本综合在线观看| 天堂蜜桃91精品| 免费观看成人高| 色资源二区在线视频| 亚洲成人av中文字幕| 欧美日韩国产精品综合| 国产精品亚洲第一区在线暖暖韩国| 亚洲综合网中心| av成人在线播放| 夜夜嗨av色综合久久久综合网| 亚洲va在线观看| 久久精品一区四区| 超碰网在线观看| 国产免费播放一区二区| 国产成人91久久精品| 第九色区av在线| 精品污污网站免费看| 亚洲欧美va天堂人熟伦| 日本aⅴ精品一区二区三区| 少妇免费毛片久久久久久久久| 另类中文字幕国产精品| 伊人久久久久久久久久久久久| 久久久久亚洲视频| 国产精品久久久久久久裸模 | 成人免费毛片aaaaa**| 欧美亚洲色图视频| 美女一区二区在线观看| 68精品久久久久久欧美 | 不卡中文字幕av| 亚洲第一成年人网站| 亚洲1区2区3区视频| 野花社区视频在线观看| 久久九九国产| 久久久国产精华液999999| 国内不卡的一区二区三区中文字幕| 久久综合国产精品台湾中文娱乐网| 国产成人精品一区二三区四区五区 | 国产黄色一区| 久久精品国产69国产精品亚洲 | 日韩激情第一页| 日批视频免费在线观看| 国产精品久久久久久久第一福利| 成人黄色一级大片| 欧美久久成人| 欧美一区二区三区成人久久片 | 久久久久久自在自线| 日韩欧美手机在线| 精品国产亚洲一区二区三区在线 | 综合欧美亚洲| 7m第一福利500精品视频| 岛国在线视频免费看| 日韩视频不卡中文| 久久久久久91亚洲精品中文字幕| 国产日韩三级在线| 69xxx免费视频| 肉色丝袜一区二区| 免费在线观看污污视频| 欧美福利在线播放网址导航| 国产精品网站大全| eeuss鲁一区二区三区| 伊人久久大香线蕉av一区二区| 国产女人高潮时对白| 狠狠色噜噜狠狠狠狠97| 免费成人深夜夜行网站| 91丝袜高跟美女视频| 中文字幕亚洲欧洲| 一本色道久久综合一区| 亚洲欧洲久久| 午夜欧洲一区| 亚洲伊人久久综合| 天天免费亚洲黑人免费| 欧美高清激情视频| av中文在线| 亚洲精品福利在线观看| 99热这里只有精品在线观看| 91国产免费观看| 国产一区二区三区影院| 亚洲欧美乱综合| 四虎国产精品成人免费入口| 不卡一区在线观看| 原创真实夫妻啪啪av| 视频一区欧美日韩| 午夜精品久久久久久久无码| 综合在线视频| 在线观看成人av电影| 久久不见久久见中文字幕免费| 国产成人精品日本亚洲11| 91精品福利观看| 国产精品午夜国产小视频| 在线观看特色大片免费视频| 久久久久久久久久久av| 黄网站在线免费| 日韩视频中文字幕| 国产精品四虎| 亚洲视频国产视频| 视频午夜在线| 亚洲国产一区自拍| 六月丁香综合网| 日韩欧美高清dvd碟片| 国产欧美日韩综合精品一区二区三区 | 国产青草视频在线观看| 五月精品视频| 在线观看欧美亚洲| 日韩一区二区三区免费播放| 秋霞毛片久久久久久久久| 久久93精品国产91久久综合| 看高清中日韩色视频| 日韩三区视频| 久久青青草原| 自拍偷拍一区| 日本一区二区三区免费观看| 九热爱视频精品视频| 久久这里精品国产99丫e6| 综合国产视频| 日韩久久久久久久| 久久日文中文字幕乱码| 亚洲乱码一区二区三区三上悠亚 | 国产婷婷一区二区| 亚洲色成人网站www永久四虎 | 欧美精品一区男女天堂| 日本激情视频网站| 精品亚洲aⅴ在线观看| 飘雪影院手机免费高清版在线观看| 亚洲免费精彩视频| 国产精品视频一区二区久久| 精品国产欧美一区二区五十路| 成人免费视屏| 高清欧美电影在线| 一个人看的www视频在线免费观看| 欧美亚洲视频在线观看| 写真福利精品福利在线观看| 国产免费一区视频观看免费| 久久精品九色| 久久久久资源| 成人一二三区| 日本免费成人网| 国产精品入口66mio| 天天操天天爱天天爽| 国产在线视频不卡二| 亚洲香蕉中文网| 久久精品无码一区二区三区| 二区三区四区视频| 午夜欧美2019年伦理| www.五月婷婷.com| 欧美一区二区三区四区五区| 亚洲av成人无码网天堂| 视频在线一区二区| 后进极品白嫩翘臀在线播放| 日本免费一区二区三区视频观看| 国产欧美自拍| 97人人干人人| 欧美日韩在线二区| 在线免费一区| 国产精品久久久免费| 午夜久久久精品| 成人丝袜视频网| 日韩中文字幕有码| 亚洲乱码国产乱码精品精98午夜| 国语对白永久免费| 欧美浪妇xxxx高跟鞋交| 日本韩国在线观看| 神马国产精品影院av| 成人一级福利| 成人中文字幕在线观看| 牛牛精品成人免费视频| 亚洲天堂av免费在线观看| 亚洲一区一卡| 亚洲精品久久久久久| 国产视频911| 日本一级黄色大片| 欧美精品自拍偷拍| 国产在线日本| 午夜精品一区二区三区在线视| 国产视频一区二| 日韩欧美在线电影| 亚洲免费播放| 少妇伦子伦精品无吗| 中文字幕亚洲区| 国产精品久久久久久久久夜色| 欧美成人aa大片| 九七电影韩国女主播在线观看| 国产91亚洲精品| 丝袜连裤袜欧美激情日韩| 999久久欧美人妻一区二区| 麻豆成人久久精品二区三区红| 亚洲国产综合视频| 亚洲综合在线免费观看| 国产精品久久久久久免费 | 欧美精品一区二区三区在线看午夜 | 136福利精品导航| 欧美h视频在线观看| 男女男精品视频网| 国产aⅴ激情无码久久久无码| 天天操天天干天天综合网| 亚洲av永久纯肉无码精品动漫| 久久九九亚洲综合| 涩涩涩久久久成人精品| 涩涩涩999| 免费在线一区观看| 永久免费av无码网站性色av| 日韩欧美国产一区二区| 涩涩视频在线观看免费| 91精品国产91| 成功精品影院| 日本人体一区二区| 成人av网址在线观看| 日本五十路女优| 日韩成人在线播放| 亚洲色图官网| 日本福利一区二区三区| 日韩精品久久理论片| 97在线观看免费视频| 欧美视频在线观看一区二区| av网站在线免费播放| 国产精品偷伦免费视频观看的| 色男人天堂综合再现| caoporm在线视频| 亚洲欧美国产三级| 精品人妻一区二区三区换脸明星 | 亚洲欧美综合另类中字| 欧美舌奴丨vk视频| 视频一区在线免费观看| 久久国产精品99久久久久久老狼| 四虎影院中文字幕| 欧美成人性福生活免费看| 国产偷倩在线播放| 精品国产福利| 日韩不卡一二三区| 美女三级黄色片| 精品久久国产字幕高潮| 欧美亚洲日本精品| 日本免费高清一区| 国内一区二区视频| 久久久久香蕉视频| 精品调教chinesegay| av在线一区不卡| 亚洲激情免费视频| 91麻豆swag| 怡红院男人天堂| 欧美激情图片区| 天海翼精品一区二区三区| 爱情岛论坛成人| 一区二区三区四区亚洲| 日本国产在线| 成人激情在线播放| 1024日韩| 免费看一级黄色| 亚洲福利精品在线| 一区在线影院| 亚洲 欧美 综合 另类 中字| 久久久影院官网| 国产色综合视频| 欧美一级大胆视频| 亚洲免费二区| 国产美女精品久久| 欧美一区二区免费观在线| 都市激情亚洲综合| 精品嫩模一区二区三区| 久久久夜色精品亚洲| 国产乱淫a∨片免费视频| 欧美性视频网站| 一本一道久久a久久精品蜜桃| 中文字幕一区二区三区人妻不卡| 欧美精品久久99| 毛片免费看不卡网站|