亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

純javascript實現的小游戲《Flappy Pig》實例

2024-05-06 16:23:48
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了純javascript實現的小游戲《Flappy Pig》,較為詳細的分析了javascript實現小游戲《Flappy Pig》的相關技巧,涉及javascript操作頁面元素移動、碰撞、事件監聽與觸發的相關技巧,需要的朋友可以參考下

本文實例講述了純javascript實現的小游戲《Flappy Pig》。分享給大家供大家參考。具體如下:

Flappy Pig,是Pig,使用原生javascript寫的網頁版“Flappy Bird”。我也奇了個怪為什么搞這個東西出來,而且還花了一天寶貴的周末,但是既然寫出來,就拿出來和大家分享一下。

option.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實現的《Flappy Pig》v0.1.0 
  3. * ======================================= 
  4. * @author keenwon 
  5. * Full source at http://keenwon.com 
  6. */ 
  7. var flappy = (function (self) { 
  8. 'use strict'
  9. //設置 
  10. self.option = { 
  11. //重力加速度,屏幕像素和實際物理上的米有差別,所以存在換算 
  12. g: 400, 
  13. //跳躍的初速度,控制豬的彈跳力 
  14. v0: 400, 
  15. //柱子移動速度 
  16. vp: 2.5, 
  17. //頻率,控制動畫幀數,默認20ms 
  18. frequency: 20, 
  19. //關卡數 
  20. levels: 100, 
  21. //開頭的空白距離 
  22. safeLift: 500, 
  23. //地板高度(和圖片有關) 
  24. floorHeight: 64, 
  25. //豬的寬度 
  26. pigWidth: 33, 
  27. //豬的高度 
  28. pigHeight: 30, 
  29. //豬當前高度 
  30. pigY: 300, 
  31. //豬距離左邊的距離, 
  32. pigLeft: 80, 
  33. //柱子Html 
  34. pillarHtml: '<div class="top"></div><div class="bottom"></div>'
  35. //柱子寬度 
  36. pillarWidth: 45, 
  37. //柱子上下間隔高度 
  38. pillarGapY: 108, 
  39. //柱子左右間隔寬度 
  40. pillarGapX: 250, 
  41. //上柱子的基礎定位值(就是top值,和css寫法有關) 
  42. pillarTop: -550, 
  43. //下柱子的基礎定位值 
  44. pillarBottom: -500 
  45. }; 
  46. return self; 
  47. })(flappy || {}) 

util.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實現的《Flappy Pig》v0.1.0 
  3. * ======================================= 
  4. * @author keenwon 
  5. * Full source at http://keenwon.com 
  6. */ 
  7. var flappy = (function (self) { 
  8. 'use strict'
  9. //工具 
  10. self.util = { 
  11. preventDefaultEvent: function (event) { 
  12. event = window.event || event; 
  13. if (event) { 
  14. if (event.preventDefault) { 
  15. event.preventDefault(); 
  16. else { 
  17. event.returnValue = false
  18. }, 
  19. $: function (id) { 
  20. return document.getElementById(id); 
  21. }, 
  22. getChilds: function (obj) { 
  23. var childs = obj.children || obj.childNodes, 
  24. childsArray = new Array(); 
  25. for (var i = 0, len = childs.length; i < len; i++) { 
  26. if (childs[i].nodeType == 1) { 
  27. childsArray.push(childs[i]); 
  28. return childsArray; 
  29. }; 
  30. return self; 
  31. })(flappy || {}) 

pig.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實現的《Flappy Pig》v0.1.0 
  3. * ======================================= 
  4. * @author keenwon 
  5. * Full source at http://keenwon.com 
  6. */ 
  7. var flappy = (function (self) { 
  8. 'use strict'
  9. var option = self.option, 
  10. $ = self.util.$; 
  11. //豬 
  12. self.pig = { 
  13. Y: 0, //豬當前高度(底邊) 
  14. init: function (overCallback, controller) { 
  15. var t = this
  16. t.s = 0, //位移 
  17. t.time = 0, //時間 
  18. t.$pig = $('pig'); 
  19. t.$pig.style.left = option.pigLeft + 'px'
  20. t._controller = controller; 
  21. t._addListener(overCallback); 
  22. }, 
  23. //添加監聽 
  24. _addListener: function (overCallback) { 
  25. this._overCallback = overCallback; 
  26. }, 
  27. //啟動 
  28. start: function () { 
  29. var t = this
  30. interval = option.frequency / 1000; 
  31. t.s = option.v0 * t.time - t.time * t.time * option.g * 2; //豎直上拋運動公式 
  32. t.Y = option.pigY + t.s; 
  33. if (t.Y >= option.floorHeight) { 
  34. t.$pig.style.bottom = t.Y + 'px'
  35. else { 
  36. t._dead(); 
  37. t.time += interval; 
  38. }, 
  39. //跳 
  40. jump: function () { 
  41. var t = this
  42. option.pigY = parseInt(t.$pig.style.bottom); 
  43. t.s = 0; 
  44. t.time = 0; 
  45. }, 
  46. //撞到地面時觸發 
  47. _dead: function () { 
  48. this._overCallback.call(this._controller); 
  49. }, 
  50. //撞到地面的處理 
  51. fall: function () { 
  52. var t = this
  53. //摔到地上,修正高度 
  54. t.Y = option.floorHeight; 
  55. t.$pig.style.bottom = t.Y + 'px'
  56. }, 
  57. //撞到柱子的處理 
  58. hit: function () { 
  59. var t = this
  60. //墜落 
  61. var timer = setInterval(function () { 
  62. t.$pig.style.bottom = t.Y + 'px'
  63. if (t.Y <= option.floorHeight) { 
  64. clearInterval(timer); 
  65. t.Y -= 12; 
  66. }, option.frequency); 
  67. }; 
  68. return self; 
  69. })(flappy || {}) 

pillar.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實現的《Flappy Pig》v0.1.0 
  3. * ======================================= 
  4. * @author keenwon 
  5. * Full source at http://keenwon.com 
  6. */ 
  7. var flappy = (function (self) { 
  8. 'use strict'
  9. var option = self.option, 
  10. util = self.util, 
  11. $ = util.$; 
  12. //柱子 
  13. self.pillar = { 
  14. currentId: -1, //當前柱子id 
  15. init: function () { 
  16. var t = this
  17. //緩存上下柱子位置的換算因子 
  18. t._factor = option.pillarBottom - option.pillarGapY + 450; 
  19. //s表示一個位置,到達這個位置的柱子就是“當前的柱子”,就算是靠近豬了,開始計算豬有沒有撞到這根柱子,10是提前量。 
  20. t._s = option.pigLeft + option.pigWidth + 10; 
  21. t._render(); 
  22. }, 
  23. //把柱子渲染到DOM樹中 
  24. _render: function () { 
  25. var t = this
  26. initleft = option.safeLift; 
  27. t.left = 0; 
  28. t.dom = document.createElement('div'); 
  29. t.dom.className = t.dom.id = 'pillarWrapper'
  30. for (var i = 0, j = option.levels; i < j; i++) { 
  31. var el = document.createElement('div'); 
  32. el.innerHTML = option.pillarHtml; 
  33. el.className = 'pillar'
  34. el.id = 'pillar-' + i; 
  35. el.style.left = initleft + 'px'
  36. var childs = util.getChilds(el), 
  37. topEl = childs[0], 
  38. bottomEl = childs[1], 
  39. pos = t._random(i); 
  40. topEl.style.top = pos.top + 'px'
  41. bottomEl.style.bottom = pos.bottom + 'px'
  42. el.setAttribute('top', 600 + pos.top); 
  43. el.setAttribute('bottom', 0 - pos.bottom); 
  44. t.dom.appendChild(el); 
  45. initleft += option.pillarGapX; 
  46. $('screen').appendChild(t.dom); 
  47. }, 
  48. //計算柱子位置 
  49. _random: function (i) { 
  50. var t = this
  51. x = Math.random(), 
  52. h = Math.abs(Math.sin((i+1) * x)) * 290; 
  53. return { 
  54. top: option.pillarTop + h, 
  55. bottom: t._factor - h 
  56. }, 
  57. //移動柱子 
  58. move: function () { 
  59. var t = this
  60. t.dom.style.left = -t.left + 'px'
  61. t._find(t.left); 
  62. t.left += option.vp; 
  63. }, 
  64. //找到當前的柱子 
  65. _find: function (l) { 
  66. var t = this
  67. x = (t._s + l - option.safeLift) / option.pillarGapX, 
  68. intX = parseInt(x); //intX是當前柱子 
  69. if (x > 0 && t.currentId != intX && Math.abs(x - intX) < 0.1) { 
  70. t.currentId = intX; 
  71. }; 
  72. return self; 
  73. })(flappy || {}) 

position.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實現的《Flappy Pig》v0.1.0 
  3. * ======================================= 
  4. * @author keenwon 
  5. * Full source at http://keenwon.com 
  6. */ 
  7. var flappy = (function (self) { 
  8. 'use strict'
  9. var pig = self.pig, 
  10. pillar = self.pillar, 
  11. option = self.option, 
  12. $ = self.util.$; 
  13. //位置判斷 
  14. self.position = { 
  15. init: function (overCallback, controller) { 
  16. var t = this
  17. t.pillarWrapper = $('pillarWrapper'); 
  18. t.pigX1 = option.pigLeft, 
  19. t.pigX2 = option.pigLeft + option.pigWidth, //豬的左右位置,固定的 
  20. t._controller = controller; 
  21. t._addListener(overCallback); 
  22. }, 
  23. //添加監聽 
  24. _addListener: function (overCallback) { 
  25. this._overCallback = overCallback; 
  26. }, 
  27. judge: function () { 
  28. var t = this
  29. currentPillar = $('pillar-' + pillar.currentId); 
  30. if (pillar.currentId == -1) { 
  31. return
  32. t.pigY2 = 600 - pig.Y; 
  33. t.pigY1 = t.pigY2 - option.pigHeight; //豬的上下位置 
  34. t.pY1 = currentPillar.getAttribute('top'); 
  35. t.pY2 = currentPillar.getAttribute('bottom'); 
  36. t.pX1 = parseInt(currentPillar.style.left) + parseInt(t.pillarWrapper.style.left); 
  37. t.pX2 = t.pX1 + option.pillarWidth; //柱子的上下左右位置 
  38. console.log(t.pillarWrapper.style.left); 
  39. if (option.pigLeft + option.pigWidth >= t.pX1 && option.pigLeft <= t.pX2) { 
  40. if (t.pigY1 < t.pY1 || t.pigY2 > t.pY2) { 
  41. t._dead(); 
  42. }, 
  43. //撞到柱子時觸發 
  44. _dead: function () { 
  45. this._overCallback.call(this._controller); 
  46. }, 
  47. }; 
  48. return self; 
  49. })(flappy || {}) 

controller.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實現的《Flappy Pig》v0.1.0 
  3. * ======================================= 
  4. * @author keenwon 
  5. * Full source at http://keenwon.com 
  6. */ 
  7. var flappy = (function (self) { 
  8. 'use strict'
  9. var pig = self.pig, 
  10. pillar = self.pillar, 
  11. pos = self.position, 
  12. util = self.util, 
  13. $ = util.$, 
  14. option = self.option; 
  15. //控制器 
  16. self.controller = { 
  17. init: function () { 
  18. var t = this
  19. t._isStart = false
  20. t._timer = null
  21. pig.init(t.fall, t); 
  22. pillar.init(); 
  23. pos.init(t.hit, t); 
  24. t.addKeyListener(); 
  25. }, 
  26. addKeyListener: function () { 
  27. var t = this
  28. document.onkeydown = function (e) { 
  29. var e = e || event; 
  30. var currKey = e.keyCode || e.which || e.charCode; 
  31. if (currKey == 32) { 
  32. t.jump(); 
  33. util.preventDefaultEvent(e); 
  34. }, 
  35. jump: function () { 
  36. var t = this
  37. if (!t._isStart) { 
  38. $('begin').style.display = 'none'
  39. t._createTimer(function () { 
  40. pig.start(); 
  41. pillar.move(); 
  42. pos.judge(); 
  43. $('score').innerHTML = pillar.currentId + 1; 
  44. }); 
  45. t._isStart = true
  46. else { 
  47. pig.jump(); 
  48. }, 
  49. hit: function () { 
  50. var t = this
  51. t.over(); 
  52. pig.hit(); 
  53. }, 
  54. fall: function () { 
  55. var t = this
  56. t.over(); 
  57. pig.fall(); 
  58. }, 
  59. over: function () { 
  60. var t = this
  61. clearInterval(t._timer); 
  62. $('end').style.display = 'block'
  63. }, 
  64. _createTimer: function (fn) { 
  65. var t = this
  66. t._timer = setInterval(fn, option.frequency); 
  67. }; 
  68. return self; 
  69. })(flappy || {}) 

game.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實現的《Flappy Pig》v0.1.0 
  3. * ======================================= 
  4. * @author keenwon 
  5. * Full source at http://keenwon.com 
  6. */ 
  7. var flappy = (function (self) { 
  8. 'use strict'
  9. var controller = self.controller, 
  10. option = self.option, 
  11. pig = self.pig, 
  12. pillar = self.pillar, 
  13. pos = self.position, 
  14. util = self.util, 
  15. $ = self.util.$; 
  16. //主程序 
  17. self.game = { 
  18. init: function () { 
  19. var t = this
  20. t._isStart = false
  21. t._isEnd = false
  22. t._timer = null
  23. pig.init(t.fall, t); 
  24. pillar.init(); 
  25. pos.init(t.hit, t); 
  26. t.addKeyListener(); 
  27. }, 
  28. addKeyListener: function () { 
  29. var t = this
  30. document.onkeydown = function (e) { 
  31. var e = e || event; 
  32. var currKey = e.keyCode || e.which || e.charCode; 
  33. if (currKey == 32) { 
  34. if (!t._isEnd) { 
  35. t.jump(); 
  36. else { 
  37. window.location.reload(); 
  38. util.preventDefaultEvent(e); 
  39. }, 
  40. jump: function () { 
  41. var t = this
  42. if (!t._isStart) { 
  43. $('start').style.display = 'none'
  44. t._createTimer(function () { 
  45. pig.start(); 
  46. pillar.move(); 
  47. pos.judge(); 
  48. $('score').innerHTML = pillar.currentId + 1; 
  49. }); 
  50. t._isStart = true
  51. else { 
  52. pig.jump(); 
  53. }, 
  54. hit: function () { 
  55. var t = this
  56. t.over(); 
  57. pig.hit(); 
  58. }, 
  59. fall: function () { 
  60. var t = this
  61. t.over(); 
  62. pig.fall(); 
  63. }, 
  64. over: function () { 
  65. var t = this
  66. clearInterval(t._timer); 
  67. t._isEnd = true
  68. $('end').style.display = 'block'
  69. }, 
  70. _createTimer: function (fn) { 
  71. var t = this
  72. t._timer = setInterval(fn, option.frequency); 
  73. }; 
  74. flappy.init = function () { 
  75. self.game.init(); 
  76. return self; 
  77. })(flappy || {}) 

希望本文所述對大家的javascript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情av在线播放| 国产国语刺激对白av不卡| 国产午夜精品全部视频播放| 97精品视频在线观看| 欧美韩国理论所午夜片917电影| 国产亚洲欧美日韩一区二区| 欧美成人午夜激情视频| 国产成人在线一区二区| 欧美成人亚洲成人| 久久久日本电影| 日韩在线视频网| 欧美丰满少妇xxxx| 国产成人91久久精品| 欧美一区二区大胆人体摄影专业网站| 日韩av黄色在线观看| 日韩av影视在线| 2019中文字幕免费视频| 91视频88av| 国内精品国产三级国产在线专| 久久亚洲成人精品| 成人做爰www免费看视频网站| 久久久精品影院| 欧美性色19p| 毛片精品免费在线观看| 精品久久在线播放| 成人激情综合网| 91久久国产综合久久91精品网站| 高清欧美一区二区三区| 日韩精品中文字幕在线| 亚洲欧美国内爽妇网| 91高清视频免费观看| 国产成人激情小视频| 国产成人精品综合| 国产一区二区av| 少妇激情综合网| 久久精品欧美视频| 亚洲色无码播放| 国产精品第8页| 日韩欧美在线视频免费观看| 久久久久久国产精品久久| 91在线精品视频| 51ⅴ精品国产91久久久久久| 欧美日韩激情视频| 久久久精品国产网站| 日韩av免费看| 亚洲伊人一本大道中文字幕| 国内偷自视频区视频综合| 久久久久久久久久久网站| 成人疯狂猛交xxx| 欧美成人在线影院| 日韩免费av一区二区| 国产日韩欧美在线观看| 国产日韩专区在线| 国产在线精品自拍| 国产精品成av人在线视午夜片| 日韩欧美中文字幕在线播放| 精品亚洲一区二区三区| 性欧美激情精品| 一本色道久久88综合亚洲精品ⅰ| 亚洲国产成人av在线| 国产剧情日韩欧美| 日韩在线免费视频观看| 亚洲社区在线观看| 日韩av资源在线播放| 国产精品久久久久久久久影视| 精品亚洲一区二区三区在线观看| 中文亚洲视频在线| 91在线免费观看网站| 欧美亚洲日本网站| 欧美国产欧美亚洲国产日韩mv天天看完整| 91麻豆桃色免费看| 久久精品福利视频| 欧美片一区二区三区| 国产色综合天天综合网| 一区二区亚洲精品国产| 日韩a**中文字幕| 亚洲欧美日韩第一区| 国产欧美韩国高清| 日韩精品久久久久| 欧美激情女人20p| 色悠久久久久综合先锋影音下载| 深夜福利一区二区| 欧美精品久久久久久久免费观看| 亚洲国产高清高潮精品美女| 欧美中文字幕在线视频| 亚洲国产精品网站| 亚洲欧美国产va在线影院| 国产亚洲a∨片在线观看| 菠萝蜜影院一区二区免费| 欧美精品久久久久久久| 在线观看成人黄色| 日产精品99久久久久久| 日韩精品视频在线| 亚洲欧美精品一区二区| 日本韩国在线不卡| 精品久久久久久久久久| 午夜精品在线视频| 91九色蝌蚪国产| 欧美又大又粗又长| 亚洲成年人在线| 亚洲成人av片在线观看| 亚洲人成电影网站| 精品视频偷偷看在线观看| 久久久影视精品| 成人网页在线免费观看| 国产午夜精品视频免费不卡69堂| 日韩av免费在线观看| 国产精品极品美女粉嫩高清在线| 久久久国产精品亚洲一区| 欧美国产乱视频| 国产精品视频导航| 日韩电影免费观看在线观看| 国产日韩精品电影| 高清在线视频日韩欧美| 亚洲性视频网址| 欧美大尺度电影在线观看| 国产精品久久久久久久av电影| 日韩av免费看网站| 不卡av在线网站| 欧美大片大片在线播放| 亚洲男人的天堂在线| 高清亚洲成在人网站天堂| 日韩激情视频在线播放| 美日韩在线视频| 九九综合九九综合| 久久人人爽国产| 日韩亚洲一区二区| 久久亚洲私人国产精品va| 欧美电影在线观看| 久久久久国产一区二区三区| 日韩欧美在线看| 精品自拍视频在线观看| 91精品国产综合久久久久久蜜臀| 亚洲在线观看视频网站| 91精品国产91| 久久久精品视频在线观看| 中文字幕视频一区二区在线有码| 午夜精品久久久久久久久久久久| 亚洲国产精彩中文乱码av| 欧美韩国理论所午夜片917电影| 欧美一区在线直播| 性欧美暴力猛交69hd| 8x海外华人永久免费日韩内陆视频| 久久综合电影一区| 国产午夜精品免费一区二区三区| 欧美中文在线视频| 精品高清一区二区三区| 日韩欧美在线视频日韩欧美在线视频| 日本老师69xxx| 一区二区三区美女xx视频| 亚洲欧美一区二区三区四区| 日韩精品免费综合视频在线播放| 精品久久久香蕉免费精品视频| 亚洲成色777777女色窝| 国产精品美乳在线观看| 国产精品久久综合av爱欲tv| 日韩av有码在线| 性欧美亚洲xxxx乳在线观看| 91精品国产自产在线观看永久| 日韩在线精品视频| 亚洲一级黄色av| 亚洲小视频在线观看| 日韩欧美在线播放| 欧美性xxxxx|