flyline.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. Main.flyLine = function(angle){
  2. var speedRate = 7;//速度倍率
  3. var gRate = 100;//重力倍率
  4. var flyBird;
  5. var stage = Main.stage;
  6. var fps = Main.fps;
  7. var startX = 0;
  8. var startY = 0;
  9. var sWidth = Main.width;
  10. var sHeight = Main.height;
  11. var flySpeed = Main.speed * (Math.random() * 0.2 + 0.8) * speedRate;
  12. var flyRad;
  13. function initFlyLine() {
  14. // code here.
  15. //Main.stage.removeChild(Main.penguin);
  16. Main.penguin.alpha = 0;
  17. flyRad = angleToRad(angle);
  18. var flyData = {
  19. images: ["img/fly.png"],
  20. frames: {width:180, height:170},
  21. animations: {fly:[0,2]},
  22. framerate: 6
  23. };
  24. var spriteSheet = new createjs.SpriteSheet(flyData);
  25. flyBird = new createjs.Sprite(spriteSheet, "fly");
  26. flyBird.regX = 105;
  27. flyBird.regY = 105;
  28. stage.addChild(flyBird);
  29. startFly();
  30. }
  31. var tParam = 0;
  32. var g = 9.8 * gRate;
  33. function clock(){
  34. tParam += 1/fps;
  35. moveBird(flySpeed, flyRad);
  36. // stage.update();
  37. }
  38. function stageMove(difDistance, totalDistance){
  39. Main.fire("moveStage", difDistance, totalDistance);
  40. }
  41. var offsetX = Main.penguinOffsetX;
  42. var offsetY = Main.height - Main.floorLine + 32;
  43. var flyStageDistance = Main.visibleDistance;
  44. var fadeCnt = 0;
  45. // var hitOffsetY = 100;//地平线与击打的距离
  46. var hitOffsetY = Main.floorLine - Main.penguin.y - Main.penguinHeight / 2;
  47. var tween;
  48. function moveBird(speed, rad){
  49. var x = speed * Math.cos(rad) * tParam;
  50. var y = speed * Math.sin(rad) * tParam - 1/2 * g * square(tParam) + hitOffsetY;//v0*sina-1/2gt2
  51. var vy = speed * Math.sin(rad) - g * tParam;
  52. var vx = speed * Math.cos(rad);//x轴上的运动速度
  53. var slope = -g / square(speed) / square(Math.cos(rad)) * x + Math.sin(rad) / Math.cos(rad);//抛物线斜率
  54. flyBird.rotation = slope * angle;
  55. var dif = vx * 1/fps;
  56. if(x + startX > flyStageDistance){
  57. stageMove(dif, x + startX);//舞台一个时间间隔内移动的距离
  58. }else{
  59. flyBird.x = sWidth - offsetX - (x + startX);
  60. }
  61. //circle.x = (x + startX);
  62. //circle.y = y;
  63. flyBird.y = sHeight - offsetY - y;
  64. if(y <= 0 && slope < 0){
  65. //reset
  66. tParam = 0;
  67. startX += x;
  68. startY = 0;
  69. flySpeed = speed * 2.2 / 3;
  70. flyRad = rad * 2.2 / 3;
  71. fadeCnt ++ ;
  72. Main.log(fadeCnt);
  73. stopFly();
  74. hitOffsetY = 0;
  75. Main.log(flyBird.rotation)
  76. if(Math.abs(flyBird.rotation) >= 46 && fadeCnt == 1){
  77. //角度太大,请它倒立
  78. turnDown(flyBird.x, flyBird.y, "down");
  79. stopFly();
  80. gameOver(x + startX);
  81. return;
  82. }
  83. if(fadeCnt == 3){
  84. //end game
  85. stopFly();
  86. //添加长划痕
  87. var slideTime = Math.cos(rad) * 800;
  88. addLongTrace(x, dif, slideTime);
  89. }else{
  90. tween = createjs.Tween.get(flyBird, {loop:false})
  91. .to({rotation:0}, 50, createjs.Ease.bounceOut)
  92. .call(function(){
  93. startFly();
  94. createjs.Tween.removeTweens(tween);
  95. });
  96. //添加痕迹
  97. addTrace(dif);
  98. }
  99. }
  100. }
  101. var longTracer;
  102. function addLongTrace(xPass, dif, timeC){
  103. longTracer = new createjs.Bitmap(Resource.get("img/longtraces.png"));
  104. stage.addChild(longTracer);
  105. longTracer.width = 452;
  106. longTracer.height = 14;
  107. longTracer.regX = 452;
  108. longTracer.regY = -17;
  109. longTracer.x = flyBird.x;
  110. longTracer.y = flyBird.y;
  111. createjs.Ticker.addEventListener("tick", longTracerClock);
  112. function longTracerClock(){
  113. longTracer.x += dif;
  114. stageMove(dif, xPass + startX + 452);
  115. }
  116. setTimeout(function(){
  117. turnDown(flyBird.x, flyBird.y, "slide");
  118. createjs.Ticker.removeEventListener("tick", longTracerClock);
  119. gameOver(xPass + startX + 452);
  120. //插入成绩牌
  121. }, timeC);
  122. //遮罩
  123. var rect = new createjs.Shape();
  124. rect.graphics.setStrokeStyle(5, 'round', 'round');
  125. rect.graphics.beginFill("#FF0000").drawRect(0,0,460, 40);
  126. rect.graphics.endStroke();
  127. rect.x = 200;
  128. rect.y = 790;
  129. //stage.addChild(rect);
  130. longTracer.mask = rect;
  131. }
  132. function addTrace(dif){
  133. var totalD = 0;
  134. var tracer = new createjs.Bitmap(Resource.get("img/traces.png"));
  135. stage.addChild(tracer);
  136. tracer.width = 145;
  137. tracer.height = 45;
  138. tracer.regX = 92;
  139. tracer.regY = -18;
  140. tracer.x = flyBird.x;
  141. tracer.y = flyBird.y;
  142. createjs.Ticker.removeEventListener("tick", tracerClock);
  143. createjs.Ticker.addEventListener("tick", tracerClock);
  144. function tracerClock(){
  145. tracer.x += dif;
  146. totalD += dif;
  147. if(totalD > sWidth * 2 / 3){
  148. Main.log("回收痕迹");
  149. createjs.Ticker.removeEventListener("tick", tracerClock);
  150. stage.removeChild(tracer);
  151. }
  152. }
  153. }
  154. function turnDown(fx, fy, status){
  155. Main.stage.removeChild(flyBird);
  156. var spriteSheet = Main.gameOverPenguinSS;
  157. flyBird = new createjs.Sprite(spriteSheet);
  158. Main.stage.addChild(flyBird);
  159. flyBird.gotoAndPlay(status);
  160. flyBird.x = fx - 120;
  161. flyBird.y = fy - 112;
  162. }
  163. function gameOver(distance){
  164. //todo
  165. Main.fire("gameOver", distance, flyBird.x);
  166. }
  167. Main.on("replay", function(){
  168. // 垃圾回收
  169. if(longTracer){
  170. Main.log("longTracerDisp")
  171. stage.removeChild(longTracer);
  172. }
  173. stage.removeChild(flyBird);
  174. flyBird = null;
  175. stopFly();
  176. });
  177. function stopFly(){
  178. createjs.Ticker.removeEventListener("tick", clock);
  179. }
  180. function startFly(){
  181. stopFly();
  182. clock(); // 顺便修正第一次的位置
  183. createjs.Ticker.addEventListener("tick", clock);
  184. }
  185. //角度转弧度
  186. function angleToRad(angle){
  187. return Math.PI / 180 * angle;
  188. }
  189. //^2
  190. function square(num){
  191. return num * num
  192. }
  193. // 外部运行
  194. initFlyLine(angle);
  195. }