麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

純javascript實(shí)現(xiàn)的小游戲《Flappy Pig》實(shí)例

2024-05-06 16:23:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了純javascript實(shí)現(xiàn)的小游戲《Flappy Pig》,較為詳細(xì)的分析了javascript實(shí)現(xiàn)小游戲《Flappy Pig》的相關(guān)技巧,涉及javascript操作頁(yè)面元素移動(dòng)、碰撞、事件監(jiān)聽(tīng)與觸發(fā)的相關(guān)技巧,需要的朋友可以參考下

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

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

option.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實(shí)現(xiàn)的《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. //設(shè)置 
  10. self.option = { 
  11. //重力加速度,屏幕像素和實(shí)際物理上的米有差別,所以存在換算 
  12. g: 400, 
  13. //跳躍的初速度,控制豬的彈跳力 
  14. v0: 400, 
  15. //柱子移動(dòng)速度 
  16. vp: 2.5, 
  17. //頻率,控制動(dòng)畫(huà)幀數(shù),默認(rèn)20ms 
  18. frequency: 20, 
  19. //關(guān)卡數(shù) 
  20. levels: 100, 
  21. //開(kāi)頭的空白距離 
  22. safeLift: 500, 
  23. //地板高度(和圖片有關(guān)) 
  24. floorHeight: 64, 
  25. //豬的寬度 
  26. pigWidth: 33, 
  27. //豬的高度 
  28. pigHeight: 30, 
  29. //豬當(dāng)前高度 
  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. //上柱子的基礎(chǔ)定位值(就是top值,和css寫(xiě)法有關(guān)) 
  42. pillarTop: -550, 
  43. //下柱子的基礎(chǔ)定位值 
  44. pillarBottom: -500 
  45. }; 
  46. return self; 
  47. })(flappy || {}) 

util.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實(shí)現(xiàn)的《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實(shí)現(xiàn)的《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, //豬當(dāng)前高度(底邊) 
  14. init: function (overCallback, controller) { 
  15. var t = this
  16. t.s = 0, //位移 
  17. t.time = 0, //時(shí)間 
  18. t.$pig = $('pig'); 
  19. t.$pig.style.left = option.pigLeft + 'px'
  20. t._controller = controller; 
  21. t._addListener(overCallback); 
  22. }, 
  23. //添加監(jiān)聽(tīng) 
  24. _addListener: function (overCallback) { 
  25. this._overCallback = overCallback; 
  26. }, 
  27. //啟動(dòng) 
  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; //豎直上拋運(yùn)動(dòng)公式 
  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. //撞到地面時(shí)觸發(fā) 
  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實(shí)現(xiàn)的《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, //當(dāng)前柱子id 
  15. init: function () { 
  16. var t = this
  17. //緩存上下柱子位置的換算因子 
  18. t._factor = option.pillarBottom - option.pillarGapY + 450; 
  19. //s表示一個(gè)位置,到達(dá)這個(gè)位置的柱子就是“當(dāng)前的柱子”,就算是靠近豬了,開(kāi)始計(jì)算豬有沒(méi)有撞到這根柱子,10是提前量。 
  20. t._s = option.pigLeft + option.pigWidth + 10; 
  21. t._render(); 
  22. }, 
  23. //把柱子渲染到DOM樹(shù)中 
  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. //計(jì)算柱子位置 
  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. //移動(dòng)柱子 
  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. //找到當(dāng)前的柱子 
  65. _find: function (l) { 
  66. var t = this
  67. x = (t._s + l - option.safeLift) / option.pillarGapX, 
  68. intX = parseInt(x); //intX是當(dāng)前柱子 
  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實(shí)現(xiàn)的《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. //添加監(jiān)聽(tīng) 
  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. //撞到柱子時(shí)觸發(fā) 
  44. _dead: function () { 
  45. this._overCallback.call(this._controller); 
  46. }, 
  47. }; 
  48. return self; 
  49. })(flappy || {}) 

controller.js如下:

 

 
  1. ?/** 
  2. * 原生javascript實(shí)現(xiàn)的《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實(shí)現(xiàn)的《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 || {}) 

希望本文所述對(duì)大家的javascript程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: sese在线视频 | 国产资源在线视频 | 杏美月av | 宅男噜噜噜66国产免费观看 | 日日狠狠久久 | 日韩精品a在线观看 | 久久草在线观看视频 | 撅高 自己扒开 调教 | 在线a免费观看 | 欧美特黄一级高清免费的香蕉 | 国产精品亚洲激情 | 叉逼视频 | 精品无码久久久久久国产 | 九九热免费视频在线观看 | 国产午夜三级一区二区三桃花影视 | 万圣街在线观看免费完整版 | 成人短视频在线观看免费 | 99re热精品视频 | 久章草影院 | 日本不卡视频在线观看 | 黄色高清免费 | 激情大乳女做爰办公室韩国 | 欧美成人高清视频 | 欧美日本中文字幕 | www国产成人免费观看视频,深夜成人网 | 国产在线欧美日韩 | 草草视频免费 | 久久久资源网 | 成人电影毛片 | 亚洲欧美国产高清va在线播放 | 欧美1区2区在线观看 | av91肉丝一区二区电影 | 国产午夜亚洲精品理论片大丰影院 | 久久亚洲视频网 | 日韩中文字幕三区 | 亚洲骚综合 | 欧美在线观看视频网站 | 国产毛片视频 | 久章草在线视频 | 国产精品久久久久久238 | 91在线播放国产 |