当前位置:   article > 正文

[HTML5]用JS实现当年疯魔IOS游戏市场的切水果_切水果游戏实现

切水果游戏实现

切水果游戏曾经是一款风靡苹果手机的休闲游戏,今天要介绍的就是一款网页版的切水果游戏,由JavaScript和HTML5实现,虽然功能和原版的相差很大,但是基本的功能还是具备了,还是模仿挺逼真的。有一定JavaScript水平的朋友可以看看源代码,相信你的JavaScript水平会有很大提升。

 

 

 

代码下载---->点击下载

 

所有JavaScript代码

  1. /**
  2. * this file was compiled by jsbuild 0.9.6
  3. * @date Fri, 20 Jul 2012 16:21:18 UTC
  4. */
  5. void function(global){
  6. var mapping = {}, cache = {};
  7. global.startModule = function(m){
  8. require(m).start();
  9. };
  10. global.define = function(id, func){
  11. mapping[id] = func;
  12. };
  13. global.require = function(id){
  14. if(!/\.js$/.test(id))
  15. id += '.js';
  16. if(cache[id])
  17. return cache[id];
  18. else
  19. return cache[id] = mapping[id]({});
  20. };
  21. }(this);
  22. /**
  23. * @source D:\hosting\demos\fruit-ninja\output\scripts\collide.js
  24. */
  25. define("scripts/collide.js", function(exports){
  26. var fruit = require("scripts/factory/fruit");
  27. var Ucren = require("scripts/lib/ucren");
  28. var fruits = fruit.getFruitInView();
  29. /**
  30. * 碰撞检测
  31. */
  32. exports.check = function( knife ){
  33. var ret = [], index = 0;
  34. fruits.forEach(function( fruit ){
  35. var ck = lineInEllipse(
  36. knife.slice( 0, 2 ),
  37. knife.slice( 2, 4 ),
  38. [ fruit.originX, fruit.originY ],
  39. fruit.radius
  40. );
  41. if( ck )
  42. ret[ index ++ ] = fruit;
  43. });
  44. return ret;
  45. };
  46. function sqr(x){
  47. return x * x;
  48. }
  49. function sign(n){
  50. return n < 0 ? -1 : ( n > 0 ? 1 : 0 );
  51. }
  52. function equation12( a, b, c ){
  53. if(a == 0)return;
  54. var delta = b * b - 4 * a * c;
  55. if(delta == 0)
  56. return [ -1 * b / (2 * a), -1 * b / (2 * a) ];
  57. else if(delta > 0)
  58. return [ (-1 * b + Math.sqrt(delta)) / (2 * a), (-1 * b - Math.sqrt(delta)) / (2 * a) ];
  59. }
  60. // 返回线段和椭圆的两个交点,如果不相交,返回 null
  61. function lineXEllipse( p1, p2, c, r, e ){
  62. // 线段:p1, p2 圆心:c 半径:r 离心率:e
  63. if (r <= 0) return;
  64. e = e === undefined ? 1 : e;
  65. var t1 = r, t2 = r * e, k;
  66. a = sqr( t2) * sqr(p1[0] - p2[0]) + sqr(t1) * sqr(p1[1] - p2[1]);
  67. if (a <= 0) return;
  68. b = 2 * sqr(t2) * (p2[0] - p1[0]) * (p1[0] - c[0]) + 2 * sqr(t1) * (p2[1] - p1[1]) * (p1[1] - c[1]);
  69. c = sqr(t2) * sqr(p1[0] - c[0]) + sqr(t1) * sqr(p1[1] - c[1]) - sqr(t1) * sqr(t2);
  70. if (!( k = equation12(a, b, c, t1, t2) )) return;
  71. var result = [
  72. [ p1[0] + k[0] * (p2[0] - p1[0]), p1[1] + k[0] * (p2[1] - p1[1]) ],
  73. [ p1[0] + k[1] * (p2[0] - p1[0]), p1[1] + k[1] * (p2[1] - p1[1]) ]
  74. ];
  75. if ( !( ( sign( result[0][0] - p1[0] ) * sign( result[0][0] - p2[0] ) <= 0 ) &&
  76. ( sign( result[0][1] - p1[1] ) * sign( result[0][1] - p2[1] ) <= 0 ) ) )
  77. result[0] = null;
  78. if ( !( ( sign( result[1][0] - p1[0] ) * sign( result[1][0] - p2[0] ) <= 0 ) &&
  79. ( sign( result[1][1] - p1[1] ) * sign( result[1][1] - p2[1] ) <= 0 ) ) )
  80. result[1] = null;
  81. return result;
  82. }
  83. // 判断计算线段和椭圆是否相交
  84. function lineInEllipse( p1, p2, c, r, e ){
  85. var t = lineXEllipse( p1, p2, c, r, e );
  86. return t && ( t[0] || t[1] );
  87. };
  88. return exports;
  89. });
  90. /**
  91. * @source D:\hosting\demos\fruit-ninja\output\scripts\control.js
  92. */
  93. define("scripts/control.js", function(exports){
  94. var Ucren = require("scripts/lib/ucren");
  95. var knife = require("scripts/object/knife");
  96. var message = require("scripts/message");
  97. var state = require("scripts/state");
  98. var canvasLeft, canvasTop;
  99. canvasLeft = canvasTop = 0;
  100. exports.init = function(){
  101. this.fixCanvasPos();
  102. this.installDragger();
  103. this.installClicker();
  104. };
  105. exports.installDragger = function(){
  106. var dragger = new Ucren.BasicDrag({ type: "calc" });
  107. dragger.on( "returnValue", function( dx, dy, x, y, kf ){
  108. if( kf = knife.through( x - canvasLeft, y - canvasTop ) )
  109. message.postMessage( kf, "slice" );
  110. });
  111. dragger.on( "startDrag", function(){
  112. knife.newKnife();
  113. });
  114. dragger.bind( document.documentElement );
  115. };
  116. exports.installClicker = function(){
  117. Ucren.addEvent( document, "click", function(){
  118. if( state( "click-enable" ).ison() )
  119. message.postMessage( "click" );
  120. });
  121. };
  122. exports.fixCanvasPos = function(){
  123. var de = document.documentElement;
  124. var fix = function( e ){
  125. canvasLeft = ( de.clientWidth - 640 ) / 2;
  126. canvasTop = ( de.clientHeight - 480 ) / 2 - 40;
  127. };
  128. fix();
  129. Ucren.addEvent( window, "resize", fix );
  130. };;
  131. return exports;
  132. });
  133. /**
  134. * @source D:\hosting\demos\fruit-ninja\output\scripts\game.js
  135. */
  136. define("scripts/game.js", function(exports){
  137. /**
  138. * game logic
  139. */
  140. var timeline = require("scripts/timeline");
  141. var Ucren = require("scripts/lib/ucren");
  142. var sound = require("scripts/lib/sound");
  143. var fruit = require("scripts/factory/fruit");
  144. var score = require("scripts/object/score");
  145. var message = require("scripts/message");
  146. var state = require("scripts/state");
  147. var lose = require("scripts/object/lose");
  148. var gameOver = require("scripts/object/game-over");
  149. var knife = require("scripts/object/knife");
  150. // var sence = require("scripts/sence");
  151. var background = require("scripts/object/background");
  152. var light = require("scripts/object/light");
  153. var scoreNumber = 0;
  154. var random = Ucren.randomNumber;
  155. var volleyNum = 2, volleyMultipleNumber = 5;
  156. var fruits = [];
  157. var gameInterval;
  158. var snd;
  159. var boomSnd;
  160. // fruit barbette
  161. var barbette = function(){
  162. if( fruits.length >= volleyNum )
  163. return ;
  164. var startX = random( 640 ), endX = random( 640 ), startY = 600;
  165. var f = fruit.create( startX, startY ).shotOut( 0, endX );
  166. fruits.push( f );
  167. snd.play();
  168. barbette();
  169. };
  170. // start game
  171. exports.start = function(){
  172. snd = sound.create( "sound/throw" );
  173. boomSnd = sound.create( "sound/boom" );
  174. timeline.setTimeout(function(){
  175. state( "game-state" ).set( "playing" );
  176. gameInterval = timeline.setInterval( barbette, 1e3 );
  177. }, 500);
  178. };
  179. exports.gameOver = function(){
  180. state( "game-state" ).set( "over" );
  181. gameInterval.stop();
  182. gameOver.show();
  183. // timeline.setTimeout(function(){
  184. // // sence.switchSence( "home-menu" );
  185. // // TODO: require 出现互相引用时,造成死循环,这个问题需要跟进,这里暂时用 postMessage 代替
  186. // message.postMessage( "home-menu", "sence.switchSence" );
  187. // }, 2000);
  188. scoreNumber = 0;
  189. volleyNum = 2;
  190. fruits.length = 0;
  191. };
  192. exports.applyScore = function( score ){
  193. if( score > volleyNum * volleyMultipleNumber )
  194. volleyNum ++,
  195. volleyMultipleNumber += 50;
  196. };
  197. exports.sliceAt = function( fruit, angle ){
  198. var index;
  199. if( state( "game-state" ).isnot( "playing" ) )
  200. return;
  201. if( fruit.type != "boom" ){
  202. fruit.broken( angle );
  203. if( index = fruits.indexOf( fruit ) )
  204. fruits.splice( index, 1 );
  205. score.number( ++ scoreNumber );
  206. this.applyScore( scoreNumber );
  207. }else{
  208. boomSnd.play();
  209. this.pauseAllFruit();
  210. background.wobble();
  211. light.start( fruit );
  212. }
  213. };
  214. exports.pauseAllFruit = function(){
  215. gameInterval.stop();
  216. knife.pause();
  217. fruits.invoke( "pause" );
  218. };
  219. // message.addEventListener("fruit.fallOff", function( fruit ){
  220. // var index;
  221. // if( ( index = fruits.indexOf( fruit ) ) > -1 )
  222. // fruits.splice( index, 1 );
  223. // });
  224. message.addEventListener("fruit.remove", function( fruit ){
  225. var index;
  226. if( ( index = fruits.indexOf( fruit ) ) > -1 )
  227. fruits.splice( index, 1 );
  228. });
  229. var eventFruitFallOutOfViewer = function( fruit ){
  230. if( fruit.type != "boom" )
  231. lose.showLoseAt( fruit.originX );
  232. };
  233. state( "game-state" ).hook( function( value ){
  234. if( value == "playing" )
  235. message.addEventListener( "fruit.fallOutOfViewer", eventFruitFallOutOfViewer );
  236. else
  237. message.removeEventListener( "fruit.fallOutOfViewer", eventFruitFallOutOfViewer );
  238. } );
  239. message.addEventListener("game.over", function(){
  240. exports.gameOver();
  241. knife.switchOn();
  242. });
  243. message.addEventListener("overWhiteLight.show", function(){
  244. knife.endAll();
  245. for(var i = fruits.length - 1; i >= 0; i --)
  246. fruits[i].remove();
  247. background.stop();
  248. });
  249. message.addEventListener("click", function(){
  250. state( "click-enable" ).off();
  251. gameOver.hide();
  252. message.postMessage( "home-menu", "sence.switchSence" );
  253. });;
  254. return exports;
  255. });
  256. /**
  257. * @source D:\hosting\demos\fruit-ninja\output\scripts\layer.js
  258. */
  259. define("scripts/layer.js", function(exports){
  260. /**
  261. * layer manager
  262. */
  263. var Raphael = require("scripts/lib/raphael");
  264. var Ucren = require("scripts/lib/ucren");
  265. var layers = {};
  266. var zindexs = {
  267. "default": zi(),
  268. "light": zi(),
  269. "knife": zi(),
  270. "fruit": zi(),
  271. "juice": zi(),
  272. "flash": zi(),
  273. "mask": zi()
  274. };
  275. exports.createImage = function( layer, src, x, y, w, h ){
  276. layer = this.getLayer( layer );
  277. return layer.image( src, x, y, w, h );
  278. };
  279. exports.createText = function( layer, text, x, y, fill, size ){
  280. layer = this.getLayer( layer );
  281. if( Ucren.isIe )
  282. y += 2;
  283. return layer.text(x, y, text).attr({
  284. fill: fill || "#fff",
  285. "font-size": size || "14px",
  286. "font-family": "黑体",
  287. "text-anchor": "start"
  288. });
  289. };
  290. exports.getLayer = function( name ){
  291. var p, layer;
  292. name = name || "default";
  293. if( p = layers[name] ){
  294. return p;
  295. }else{
  296. layer = Ucren.makeElement( "div", { "class": "layer", "style": "z-index: " + ( zindexs[name] || 0 ) + ";" } );
  297. Ucren.Element( "extra" ).add( layer );
  298. p = layers[name] = Raphael( layer, 640, 480 );
  299. // if( Ucren.isSafari )
  300. // p.safari();
  301. return p;
  302. }
  303. };
  304. function zi(){
  305. return zi.num = ++ zi.num || 2;
  306. };
  307. return exports;
  308. });
  309. /**
  310. * @source D:\hosting\demos\fruit-ninja\output\scripts\main.js
  311. */
  312. define("scripts/main.js", function(exports){
  313. var timeline = require("scripts/timeline");
  314. var tools = require("scripts/tools");
  315. var sence = require("scripts/sence");
  316. var Ucren = require("scripts/lib/ucren");
  317. var buzz = require("scripts/lib/buzz");
  318. var control = require("scripts/control");
  319. var csl = require("scripts/object/console");
  320. var message = require("scripts/message");
  321. var state = require("scripts/state");
  322. var game = require("scripts/game");
  323. var collide = require("scripts/collide");
  324. var setTimeout = timeline.setTimeout.bind( timeline );
  325. var log = function(){
  326. var time = 1e3, add = 300, fn;
  327. fn = function( text ){
  328. setTimeout( function(){ csl.log( text ); }, time );
  329. time += add;
  330. };
  331. fn.clear = function(){
  332. setTimeout( csl.clear.bind( csl ), time );
  333. time += add;
  334. };
  335. return fn;
  336. }();
  337. exports.start = function(){
  338. [ timeline, sence, control ].invoke( "init" );
  339. log( "正在加载鼠标控制脚本" );
  340. log( "正在加载图像资源" );
  341. log( "正在加载游戏脚本" );
  342. log( "正在加载剧情" );
  343. log( "正在初始化" );
  344. log( "正在启动游戏..." );
  345. log.clear();
  346. setTimeout( sence.switchSence.saturate( sence, "home-menu" ), 3000 );
  347. };
  348. message.addEventListener("slice", function( knife ){
  349. var fruits = collide.check( knife ), angle;
  350. if( fruits.length )
  351. angle = tools.getAngleByRadian( tools.pointToRadian( knife.slice(0, 2), knife.slice(2, 4) ) ),
  352. fruits.forEach(function( fruit ){
  353. message.postMessage( fruit, angle, "slice.at" );
  354. });
  355. });
  356. message.addEventListener("slice.at", function( fruit, angle ){
  357. if( state( "sence-state" ).isnot( "ready" ) )
  358. return ;
  359. if( state( "sence-name" ).is( "game-body" ) ){
  360. game.sliceAt( fruit, angle );
  361. return ;
  362. }
  363. if( state( "sence-name" ).is( "home-menu" ) ){
  364. fruit.broken( angle );
  365. if( fruit.isHomeMenu )
  366. switch( 1 ){
  367. case fruit.isDojoIcon:
  368. sence.switchSence( "dojo-body" ); break;
  369. case fruit.isNewGameIcon:
  370. sence.switchSence( "game-body" ); break;
  371. case fruit.isQuitIcon:
  372. sence.switchSence( "quit-body" ); break;
  373. }
  374. return ;
  375. }
  376. });
  377. var tip = "";
  378. if( !Ucren.isChrome )
  379. tip = "$为了获得最佳流畅度,推荐您使用 <span class='b'>Google Chrome</span> 体验本游戏";
  380. if( !buzz.isSupported() )
  381. tip = tip.replace( "$", "您的浏览器不支持 &lt;audio&gt 播放声效,且" );
  382. tip = tip.replace( "$", "" );
  383. Ucren.Element( "browser" ).html( tip );;
  384. return exports;
  385. });
  386. /**
  387. * @source D:\hosting\demos\fruit-ninja\output\scripts\message.js
  388. */
  389. define("scripts/message.js", function(exports){
  390. /**
  391. * a simple message manager
  392. * @author dron
  393. * @date 2012-06-27
  394. */
  395. var Ucren = require("scripts/lib/ucren");
  396. /**
  397. * send a message
  398. * @param {Any} message,message... message contents
  399. * @param {String} to message address
  400. */
  401. exports.postMessage = function( message/*, message, message... */, to ){
  402. var messages = [].slice.call( arguments, 0 ),
  403. splitIndex = messages.length - 1;
  404. to = messages[ splitIndex ];
  405. messages.slice( 0, splitIndex );
  406. Ucren.dispatch( to, messages );
  407. };
  408. /**
  409. * bind an message handler
  410. * @param {String} from message address
  411. * @param {Function} fn message handler
  412. */
  413. exports.addEventListener = function( from, fn ){
  414. Ucren.dispatch( from, fn );
  415. };
  416. /**
  417. * remove an message handler
  418. * @param {String} from message address
  419. * @param {Function} fn message handler
  420. */
  421. exports.removeEventListener = function( from, fn ){
  422. Ucren.dispatch.remove( from, fn );
  423. };;
  424. return exports;
  425. });
  426. /**
  427. * @source D:\hosting\demos\fruit-ninja\output\scripts\sence.js
  428. */
  429. define("scripts/sence.js", function(exports){
  430. var Ucren = require("scripts/lib/ucren");
  431. var sound = require("scripts/lib/sound");
  432. var fruit = require("scripts/factory/fruit");
  433. var flash = require("scripts/object/flash");
  434. var state = require("scripts/state");
  435. var message = require("scripts/message");
  436. // the fixed elements
  437. var background = require("scripts/object/background");
  438. var fps = require("scripts/object/fps");
  439. // the home page elements
  440. var homeMask = require("scripts/object/home-mask");
  441. var logo = require("scripts/object/logo");
  442. var ninja = require("scripts/object/ninja")
  443. var homeDesc = require("scripts/object/home-desc");
  444. var dojo = require("scripts/object/dojo");
  445. var newGame = require("scripts/object/new-game");
  446. var quit = require("scripts/object/quit");
  447. var newSign = require("scripts/object/new");
  448. var peach, sandia, boom;
  449. // the elements in game body
  450. var score = require("scripts/object/score");
  451. var lose = require("scripts/object/lose");
  452. // the game logic
  453. var game = require("scripts/game");
  454. // the elements in 'developing' module
  455. var developing = require("scripts/object/developing");
  456. var gameOver = require("scripts/object/game-over");
  457. // commons
  458. var message = require("scripts/message");
  459. var timeline = require("scripts/timeline");
  460. var setTimeout = timeline.setTimeout.bind( timeline );
  461. var setInterval = timeline.setInterval.bind( timeline );
  462. var menuSnd;
  463. var gameStartSnd;
  464. // initialize sence
  465. exports.init = function(){
  466. menuSnd = sound.create( "sound/menu" );
  467. gameStartSnd = sound.create( "sound/start" );
  468. [ background, homeMask, logo, ninja, homeDesc, dojo, newSign, newGame, quit, score, lose, developing, gameOver, flash /*, fps */ ].invoke( "set" );
  469. // setInterval( fps.update.bind( fps ), 500 );
  470. };
  471. // switch sence
  472. exports.switchSence = function( name ){
  473. var curSence = state( "sence-name" );
  474. var senceState = state( "sence-state" );
  475. if( curSence.is( name ) )
  476. return ;
  477. var onHide = function(){
  478. curSence.set( name );
  479. senceState.set( "entering" );
  480. switch( name ){
  481. case "home-menu": this.showMenu( onShow ); break;
  482. case "dojo-body": this.showDojo( onShow ); break;
  483. case "game-body": this.showNewGame( onShow ); break;
  484. case "quit-body": this.showQuit( onShow ); break;
  485. }
  486. }.bind( this );
  487. var onShow = function(){
  488. senceState.set( "ready" );
  489. if( name == "dojo-body" || name == "quit-body" ){
  490. exports.switchSence( "home-menu" );
  491. }
  492. };
  493. senceState.set( "exiting" );
  494. if( curSence.isunset() ) onHide();
  495. else if( curSence.is( "home-menu" ) ) this.hideMenu( onHide );
  496. else if( curSence.is( "dojo-body" ) ) this.hideDojo( onHide );
  497. else if( curSence.is( "game-body" ) ) this.hideNewGame( onHide );
  498. else if( curSence.is( "quit-body" ) ) this.hideQuit( onHide );
  499. };
  500. // to enter home page menu
  501. exports.showMenu = function( callback ){
  502. var callee = arguments.callee;
  503. var times = callee.times = ++ callee.times || 1;
  504. peach = fruit.create( "peach", 137, 333, true );
  505. sandia = fruit.create( "sandia", 330, 322, true );
  506. boom = fruit.create( "boom", 552, 367, true, 2500 );
  507. [ peach, sandia, boom ].forEach(function( f ){ f.isHomeMenu = 1; });
  508. peach.isDojoIcon = sandia.isNewGameIcon = boom.isQuitIcon = 1;
  509. var group = [
  510. [ homeMask, 0 ],
  511. [ logo, 0 ],
  512. [ ninja, 500 ],
  513. [ homeDesc, 1500 ],
  514. [ dojo, 2000 ],
  515. [ newGame, 2000 ],
  516. [ quit, 2000 ],
  517. [ newSign, 2000 ],
  518. [ peach, 2000 ],
  519. [ sandia, 2000 ],
  520. [ boom, 2000 ]
  521. ];
  522. group.invoke( "show" );
  523. [ peach, sandia ].invoke( "rotate", 2500 );
  524. menuSnd.play();
  525. setTimeout( callback, 2500 );
  526. };
  527. // to exit home page menu
  528. exports.hideMenu = function( callback ){
  529. [ newSign, dojo, newGame, quit ].invoke( "hide" );
  530. [ homeMask, logo, ninja, homeDesc ].invoke( "hide" );
  531. [ peach, sandia, boom ].invoke( "fallOff", 150 );
  532. menuSnd.stop();
  533. setTimeout( callback, fruit.getDropTimeSetting() );
  534. };
  535. // to enter game body
  536. exports.showNewGame = function( callback ){
  537. score.show();
  538. lose.show();
  539. game.start();
  540. gameStartSnd.play();
  541. setTimeout( callback, 1000 );
  542. };
  543. // to exit game body
  544. exports.hideNewGame = function( callback ){
  545. score.hide();
  546. lose.hide();
  547. gameStartSnd.stop();
  548. setTimeout( callback, 1000 );
  549. };
  550. // to enter dojo mode
  551. exports.showDojo = function( callback ){
  552. developing.show( 250 );
  553. setTimeout( callback, 1500 );
  554. };
  555. // to exit dojo mode
  556. exports.hideDojo = function( callback ){
  557. // TODO:
  558. setTimeout( callback, 1000 );
  559. };
  560. // to enter quit page
  561. exports.showQuit = function( callback ){
  562. developing.show( 250 );
  563. setTimeout( callback, 1500 );
  564. };
  565. // to exit quit page
  566. exports.hideQuit = function( callback ){
  567. // TODO:
  568. setTimeout( callback, 1000 );
  569. };
  570. message.addEventListener("sence.switchSence", function( name ){
  571. exports.switchSence( name );
  572. });;
  573. return exports;
  574. });
  575. /**
  576. * @source D:\hosting\demos\fruit-ninja\output\scripts\state.js
  577. */
  578. define("scripts/state.js", function(exports){
  579. /**
  580. * a simple state manager
  581. * @author dron
  582. * @date 2012-06-28
  583. */
  584. var Ucren = require("scripts/lib/ucren");
  585. var timeline = require("scripts/timeline");
  586. /**
  587. * usage:
  588. * state( key ).is( value ) -> determine if the value of key is the given value
  589. * state( key ).isnot( value ) -> determine if the value of key is not given value
  590. * state( key ).ison() -> determine if the value of key is the boolean value 'true'
  591. * state( key ).isoff() -> determine if the value of key is the boolean value 'false'
  592. * state( key ).isunset() -> determine if the value of key is undefined
  593. * state( key ).set( value ) -> set the value of key to a given value
  594. * state( key ).get() -> get the value of key
  595. * state( key ).on() -> set the value of key to boolean value 'true'
  596. * state( key ).off() -> set the value of key to boolean value 'false'
  597. */
  598. var stack = {};
  599. var cache = {};
  600. var callbacks = {};
  601. exports = function( key ){
  602. if( cache[ key ] )
  603. return cache[ key ];
  604. return cache[ key ] = {
  605. is: function( value ){
  606. return stack[key] === value;
  607. },
  608. isnot: function( value ){
  609. return stack[key] !== value;
  610. },
  611. ison: function(){
  612. return this.is( true );
  613. },
  614. isoff: function(){
  615. return this.isnot( true );
  616. },
  617. isunset: function(){
  618. return this.is( undefined );
  619. },
  620. set: function(){
  621. var lastValue = NaN;
  622. return function( value ){
  623. var c;
  624. stack[key] = value;
  625. if( lastValue !== value && ( c = callbacks[ key ] ) )
  626. for(var i = 0, l = c.length; i < l; i ++)
  627. c[i].call( this, value );
  628. lastValue = value;
  629. }
  630. }(),
  631. get: function(){
  632. return stack[key];
  633. },
  634. on: function(){
  635. var me = this;
  636. me.set( true );
  637. return {
  638. keep: function( time ){
  639. timeline.setTimeout( me.set.saturate( me, false ), time );
  640. }
  641. }
  642. },
  643. off: function(){
  644. var me = this;
  645. me.set( false );
  646. return {
  647. keep: function( time ){
  648. timeline.setTimeout( me.set.saturate( me, true ), time );
  649. }
  650. }
  651. },
  652. hook: function( fn ){
  653. var c;
  654. if( !( c = callbacks[ key ] ) )
  655. callbacks[ key ] = [ fn ];
  656. else
  657. c.push( fn );
  658. },
  659. unhook: function(){
  660. // TODO:
  661. }
  662. }
  663. };;
  664. return exports;
  665. });
  666. /**
  667. * @source D:\hosting\demos\fruit-ninja\output\scripts\timeline.js
  668. */
  669. define("scripts/timeline.js", function(exports){
  670. /**
  671. * a easy timeline manager
  672. * @version 1.0
  673. * @author dron
  674. */
  675. var Ucren = require("scripts/lib/ucren");
  676. var timerCache = {};
  677. var timeline = {};
  678. // var timer = timeline;
  679. // <or>
  680. // var timer = timeline.use( name ).init( 10 ); // to use a new timeline instance
  681. //
  682. // var t = timer.createTask(...);
  683. // t.stop();
  684. //
  685. // timer.setTimeout(...);
  686. // timer.setInterval(...);
  687. // timer.getFPS();
  688. function ClassTimer(){
  689. this.tasks = [];
  690. this.addingTasks = [];
  691. this.adding = 0;
  692. }
  693. /**
  694. * initialize timeline
  695. */
  696. ClassTimer.prototype.init = function( ms ){
  697. var me = this;
  698. if( me.inited )
  699. return ;
  700. else
  701. me.inited = 1;
  702. me.startTime = now();
  703. me.intervalTime = ms || 5;
  704. me.count = 0;
  705. me.intervalFn = function(){
  706. me.count ++;
  707. me.update( now() );
  708. };
  709. me.start();
  710. return me;
  711. };
  712. /**
  713. * create a task
  714. * @param {Object} conf the config
  715. * @return {Task} a task instance
  716. */
  717. ClassTimer.prototype.createTask = function( conf ){
  718. /* e.g. timer.createTask({
  719. start: 500, duration: 2000, data: [a, b, c,..], object: module,
  720. onTimeUpdate: fn(time, a, b, c,..), onTimeStart: fn(a, b, c,..), onTimeEnd: fn(a, b, c,..),
  721. recycle: []
  722. }); */
  723. var task = createTask( conf );
  724. this.addingTasks.unshift( task );
  725. this.adding = 1;
  726. if( conf.recycle )
  727. this.taskList( conf.recycle, task );
  728. this.start();
  729. return task;
  730. };
  731. /**
  732. * use a array to recycle the task
  733. * @param {Array} queue be use for recycling task
  734. * @param {Task} task a task instance
  735. * @return {Array} this queue
  736. */
  737. ClassTimer.prototype.taskList = function( queue, task ){
  738. if( !queue.clear )
  739. queue.clear = function(){
  740. var i = this.length;
  741. while( i -- )
  742. task = this[i],
  743. task.stop(),
  744. this.splice( i, 1 );
  745. return this;
  746. };
  747. if( task )
  748. queue.unshift( task );
  749. return queue;
  750. };
  751. /**
  752. * create a timer for once callback
  753. * @param {Function} fn callback function
  754. * @param {Number} time time, unit: ms
  755. */
  756. ClassTimer.prototype.setTimeout = function( fn, time ){
  757. // e.g. setTimeout(fn, time);
  758. return this.createTask({ start: time, duration: 0, onTimeStart: fn });
  759. };
  760. /**
  761. * create a timer for ongoing callback
  762. * @param {Function} fn callback function
  763. * @param {Number} time time, unit: ms
  764. */
  765. ClassTimer.prototype.setInterval = function( fn, time ){
  766. // e.g. setInterval(fn, time);
  767. var timer = setInterval( fn, time );
  768. return {
  769. stop: function(){
  770. clearInterval( timer );
  771. }
  772. };
  773. };
  774. /**
  775. * get the current fps
  776. * @return {Number} fps number
  777. */
  778. ClassTimer.prototype.getFPS = function(){
  779. var t = now(), c = this.count, fps = c / ( t - this.startTime ) * 1e3;
  780. if( c > 1e3 )
  781. this.count = 0,
  782. this.startTime = t;
  783. return fps;
  784. };
  785. // privates
  786. ClassTimer.prototype.start = function(){
  787. clearInterval( this.interval );
  788. this.interval = setInterval( this.intervalFn, this.intervalTime );
  789. };
  790. ClassTimer.prototype.stop = function(){
  791. clearInterval( this.interval );
  792. };
  793. ClassTimer.prototype.update = function( time ){
  794. var tasks = this.tasks, addingTasks = this.addingTasks, adding = this.adding;
  795. var i = tasks.length, t, task, start, duration, data;
  796. while( i -- ){
  797. task = tasks[i];
  798. start = task.start;
  799. duration = task.duration;
  800. if( time >= start ){
  801. if( task.stopped ){
  802. tasks.splice( i, 1 );
  803. continue;
  804. }
  805. checkStartTask( task );
  806. if( ( t = time - start ) < duration )
  807. updateTask( task, t );
  808. else
  809. updateTask( task, duration ),
  810. task.onTimeEnd.apply( task.object, task.data.slice(1) ),
  811. tasks.splice( i, 1 );
  812. }
  813. }
  814. if( adding )
  815. tasks.unshift.apply( tasks, addingTasks ),
  816. addingTasks.length = adding = 0;
  817. if( !tasks.length )
  818. this.stop();
  819. };
  820. timeline.use = function( name ){
  821. var module;
  822. if( module = timerCache[ name ] )
  823. return module;
  824. else
  825. module = timerCache[ name ] = new ClassTimer;
  826. return module;
  827. };
  828. /**
  829. * @functions
  830. */
  831. var now = function(){
  832. return new Date().getTime();
  833. };
  834. var createTask = function( conf ){
  835. var object = conf.object || {};
  836. conf.start = conf.start || 0;
  837. return {
  838. start: conf.start + now(),
  839. duration: conf.duration == -1 ? 86400000 : conf.duration,
  840. data: conf.data ? [ 0 ].concat( conf.data ) : [ 0 ],
  841. started: 0,
  842. object: object,
  843. onTimeStart: conf.onTimeStart || object.onTimeStart || Ucren.nul,
  844. onTimeUpdate: conf.onTimeUpdate || object.onTimeUpdate || Ucren.nul,
  845. onTimeEnd: conf.onTimeEnd || object.onTimeEnd || Ucren.nul,
  846. stop: function(){
  847. this.stopped = 1;
  848. }
  849. }
  850. };
  851. var updateTask = function( task, time ){
  852. var data = task.data;
  853. data[0] = time;
  854. task.onTimeUpdate.apply( task.object, data );
  855. };
  856. var checkStartTask = function( task ){
  857. if( !task.started )
  858. task.started = 1,
  859. task.onTimeStart.apply( task.object, task.data.slice(1) ),
  860. updateTask( task, 0 );
  861. };
  862. /**
  863. * for compatible the old version
  864. */
  865. exports = timeline.use( "default" ).init( 10 );
  866. exports.use = function( name ){
  867. if( Ucren.isIe )
  868. exports;
  869. return timeline.use( name );
  870. };;
  871. return exports;
  872. });
  873. /**
  874. * @source D:\hosting\demos\fruit-ninja\output\scripts\tools.js
  875. */
  876. define("scripts/tools.js", function(exports){
  877. exports.unsetObject = function( object ){
  878. for(var i in object)
  879. if(object.hasOwnProperty(i) && typeof object[i] == "function")
  880. object[i] = function(){};
  881. };
  882. exports.getAngleByRadian = function( radian ){
  883. return radian * 180 / Math.PI;
  884. }
  885. exports.pointToRadian = function( origin, point ){
  886. var PI = Math.PI;
  887. if( point[0] === origin[0] ){
  888. if ( point[1] > origin[1] )
  889. return PI * 0.5;
  890. return PI * 1.5
  891. }else if( point[1] === origin[1] ){
  892. if ( point[0] > origin[0] )
  893. return 0;
  894. return PI;
  895. }
  896. var t = Math.atan( ( origin[1] - point[1] ) / ( origin[0] - point[0] ) );
  897. if( point[0] > origin[0] && point[1] < origin[1] )
  898. return t + 2 * PI;
  899. if( point[0] > origin[0] && point[1] > origin[1] )
  900. return t;
  901. return t + PI;
  902. };
  903. return exports;
  904. });
  905. /**
  906. * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\displacement.js
  907. */
  908. define("scripts/factory/displacement.js", function(exports){
  909. var layer = require("scripts/layer");
  910. var timeline = require("scripts/timeline");
  911. var tween = require("scripts/lib/tween");
  912. /**
  913. * 位移类模块模型
  914. */
  915. exports.create = function( imageSrc, width, height, origX, origY, targetX, targetY, animMap, animDur ){
  916. var module = {};
  917. var image;
  918. var anim = {};
  919. if( typeof animMap === "function" )
  920. anim.show = anim.hide = animMap;
  921. else
  922. anim = animMap;
  923. var createTask = function( start, duration, sx, sy, ex, ey, anim, mode ){
  924. timeline.createTask({
  925. start: start,
  926. duration: duration,
  927. object: module, data: [ sx, sy, ex, ey, anim, mode ],
  928. onTimeUpdate: module.onTimeUpdate, onTimeStart: module.onTimeStart, onTimeEnd: module.onTimeEnd,
  929. recycle: module.anims
  930. });
  931. };
  932. module.anims = [];
  933. module.set = function(){
  934. image = layer.createImage( "default", imageSrc, origX, origY, width, height );
  935. };
  936. module.show = function( start ){
  937. createTask( start, animDur, origX, origY, targetX, targetY, anim.show, "show" );
  938. };
  939. module.hide = function(){
  940. this.anims.clear();
  941. createTask( 0, animDur, targetX, targetY, origX, origY, anim.hide, "hide" );
  942. };
  943. module.onTimeUpdate = function( time, sx, sy, ex, ey, anim ){
  944. image.attr( {
  945. x: anim( time, sx, ex - sx, animDur ),
  946. y: anim( time, sy, ey - sy, animDur )
  947. } );
  948. };
  949. module.onTimeStart = function(){
  950. };
  951. module.onTimeEnd = function( sx, sy, ex, ey, anim ){
  952. if( anim === "hide" )
  953. image.hide();
  954. };
  955. return module;
  956. };;
  957. return exports;
  958. });
  959. /**
  960. * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\fruit.js
  961. */
  962. define("scripts/factory/fruit.js", function(exports){
  963. var layer = require("scripts/layer");
  964. var Ucren = require("scripts/lib/ucren");
  965. var timeline = require("scripts/timeline").use( "fruit" ).init( 1 );
  966. var timeline2 = require("scripts/timeline").use( "fruit-apart" ).init( 1 );
  967. var tween = require("scripts/lib/tween");
  968. var message = require("scripts/message");
  969. var flame = require("scripts/object/flame");
  970. var flash = require("scripts/object/flash");
  971. var juice = require("scripts/factory/juice");
  972. var ie = Ucren.isIe;
  973. var safari = Ucren.isSafari;
  974. /**
  975. * 水果模块模型
  976. */
  977. var zoomAnim = tween.exponential.co;
  978. var rotateAnim = tween.circular;
  979. var linearAnim = tween.linear;
  980. var dropAnim = tween.quadratic.ci;
  981. var fallOffAnim = tween.quadratic.co;
  982. var random = Ucren.randomNumber;
  983. var min = Math.min;
  984. var average = function( a, b ){ return ( ( a + b ) / 2 ) >> 0; };
  985. var dropTime = 1200, dropXScope = 200, shadowPos = 50;
  986. var infos = {
  987. // type: [ imageSrc, width, height, radius, fixAngle, isReverse, juiceColor ]
  988. boom: [ "images/fruit/boom.png", 66, 68, 26, 0, 0, null ],
  989. peach: [ "images/fruit/peach.png", 62, 59, 37, -50, 0, "#e6c731" ],
  990. sandia: [ "images/fruit/sandia.png", 98, 85, 38, -100, 0, "#c00" ],
  991. apple: [ "images/fruit/apple.png", 66, 66, 31, -54, 0, "#c8e925" ],
  992. banana: [ "images/fruit/banana.png", 126, 50, 43, 90, 0, null ],
  993. basaha: [ "images/fruit/basaha.png", 68, 72, 32, -135, 0, "#c00" ]
  994. };
  995. // TODO: 是否水果全开?
  996. var types = [ "peach", "sandia", "apple", "banana", "basaha" ];
  997. // var types = [ "sandia", "boom" ];
  998. var rotateSpeed = [ 60, 50, 40, -40, -50, -60 ];
  999. var fruitCache = [];
  1000. function ClassFruit(conf){
  1001. var info = infos[ conf.type ], radius = info[3];
  1002. this.type = conf.type;
  1003. this.originX = conf.originX;
  1004. this.originY = conf.originY;
  1005. this.radius = radius;
  1006. this.startX = conf.originX;
  1007. this.startY = conf.originY;
  1008. this.radius = radius;
  1009. this.anims = [];
  1010. if( this.type === "boom" )
  1011. this.flame = flame.create( this.startX - radius + 4, this.startY - radius + 5, conf.flameStart || 0 );
  1012. }
  1013. ClassFruit.prototype.set = function( hide ){
  1014. var inf = infos[ this.type ], radius = this.radius;
  1015. this.shadow = layer.createImage( "fruit", "images/shadow.png", this.startX - radius, this.startY - radius + shadowPos, 106, 77 );
  1016. this.image = layer.createImage( "fruit", inf[0], this.startX - radius, this.startY - radius, inf[1], inf[2] );
  1017. if( hide )
  1018. this.image.hide(),
  1019. this.shadow.hide();
  1020. return this;
  1021. };
  1022. ClassFruit.prototype.pos = function( x, y ){
  1023. if( x == this.originX && y == this.originY )
  1024. return ;
  1025. var r = this.radius;
  1026. this.originX = x;
  1027. this.originY = y;
  1028. this.image.attr({ x: x -= r, y: y -= r });
  1029. this.shadow.attr({ x: x, y: y + shadowPos });
  1030. if( this.type === "boom" )
  1031. this.flame.pos( x + 4, y + 5 );
  1032. };
  1033. ClassFruit.prototype.show = function( start ){
  1034. timeline.createTask({
  1035. start: start, duration: 500, data: [ 1e-5, 1, "show" ],
  1036. object: this, onTimeUpdate: this.onScaling, onTimeStart: this.onShowStart,
  1037. recycle: this.anims
  1038. });
  1039. };
  1040. ClassFruit.prototype.hide = function( start ){
  1041. if( this.type !== "boom" ) // if it is not a boom, it can't to be hide.
  1042. return ;
  1043. this.anims.clear();
  1044. this.flame.remove();
  1045. timeline.createTask({
  1046. start: start, duration: 500, data: [ 1, 1e-5, "hide" ],
  1047. object: this, onTimeUpdate: this.onScaling, onTimeEnd: this.onHideEnd,
  1048. recycle: this.anims
  1049. });
  1050. };
  1051. ClassFruit.prototype.rotate = function( start, speed ){
  1052. this.rotateSpeed = speed || rotateSpeed[ random( 6 ) ];
  1053. this.rotateAnim = timeline.createTask({
  1054. start: start, duration: -1,
  1055. object: this, onTimeUpdate: this.onRotating,
  1056. recycle: this.anims
  1057. });
  1058. };
  1059. ClassFruit.prototype.broken = function( angle ){
  1060. if( this.brokend )return;
  1061. this.brokend = true;
  1062. var index;
  1063. if( ( index = fruitCache.indexOf( this ) ) > -1 )
  1064. fruitCache.splice( index, 1 );
  1065. if( this.type !== "boom" )
  1066. flash.showAt( this.originX, this.originY, angle ),
  1067. juice.create( this.originX, this.originY, infos[ this.type ][6] ),
  1068. this.apart( angle );
  1069. else
  1070. this.hide();
  1071. };
  1072. ClassFruit.prototype.pause = function(){
  1073. if( this.brokend )
  1074. return;
  1075. this.anims.clear();
  1076. if( this.type == "boom" )
  1077. this.flame.remove();
  1078. };
  1079. // 分开
  1080. ClassFruit.prototype.apart = function( angle ){
  1081. this.anims.clear();
  1082. this.image.hide();
  1083. this.shadow.hide();
  1084. this.aparted = true;
  1085. var inf = infos[ this.type ], preSrc = inf[0].replace( ".png", "" ), radius = this.radius;
  1086. var create = layer.createImage.saturate( layer, this.startX - radius, this.startY - radius, inf[1], inf[2] );
  1087. angle = ( ( angle % 180 ) + 360 + inf[4] ) % 360;
  1088. this.bImage1 = create( "fruit", preSrc + "-1.png" );
  1089. this.bImage2 = create( "fruit", preSrc + "-2.png" );
  1090. [ this.bImage1, this.bImage2 ].invoke( "rotate", angle );
  1091. this.apartAngle = angle;
  1092. timeline2.createTask({
  1093. start: 0, duration: dropTime, object: this,
  1094. onTimeUpdate: this.onBrokenDropUpdate, onTimeStart: this.onBrokenDropStart, onTimeEnd: this.onBrokenDropEnd,
  1095. recycle: this.anims
  1096. });
  1097. };
  1098. // 抛出
  1099. ClassFruit.prototype.shotOut = function(){
  1100. var sign = [ -1, 1 ];
  1101. return function( start, endX ){
  1102. this.shotOutStartX = this.originX;
  1103. this.shotOutStartY = this.originY;
  1104. this.shotOutEndX = average( this.originX, endX );
  1105. this.shotOutEndY = min( this.startY - random( this.startY - 100 ), 200 );
  1106. this.fallOffToX = endX;
  1107. timeline.createTask({
  1108. start: start, duration: dropTime, object: this,
  1109. onTimeUpdate: this.onShotOuting, onTimeStart: this.onShotOutStart, onTimeEnd: this.onShotOutEnd,
  1110. recycle: this.anims
  1111. });
  1112. if( this.type != "boom" )
  1113. this.rotate( 0, ( random( 180 ) + 90 ) * sign[ random( 2 ) ] );
  1114. return this;
  1115. };
  1116. }();
  1117. // 掉落
  1118. ClassFruit.prototype.fallOff = function(){
  1119. var sign = [ -1, 1 ];
  1120. var signIndex = 0;
  1121. return function( start, x ){
  1122. if( this.aparted || this.brokend )
  1123. return ;
  1124. var y = 600;
  1125. if( typeof x !== "number" )
  1126. x = this.originX + random( dropXScope ) * sign[ ( signIndex ++ ) % 2 ];
  1127. this.fallTargetX = x;
  1128. this.fallTargetY = y;
  1129. timeline.createTask({
  1130. start: start, duration: dropTime, object: this,
  1131. onTimeUpdate: this.onFalling, onTimeStart: this.onFallStart, onTimeEnd: this.onFallEnd,
  1132. recycle: this.anims
  1133. });
  1134. }
  1135. }();
  1136. ClassFruit.prototype.remove = function(){
  1137. var index;
  1138. this.anims.clear();
  1139. if( this.image )
  1140. this.image.remove(),
  1141. this.shadow.remove();
  1142. if( this.bImage1 )
  1143. this.bImage1.remove(),
  1144. this.bImage2.remove();
  1145. if( this.type === "boom" )
  1146. this.flame.remove();
  1147. if( ( index = fruitCache.indexOf( this ) ) > -1 )
  1148. fruitCache.splice( index, 1 );
  1149. for(var name in this)
  1150. if( typeof this[name] === "function" )
  1151. this[name] = function( name ){
  1152. return function(){
  1153. throw new Error( "method " + name + " has been removed" );
  1154. };
  1155. }( name );
  1156. else delete this[name];
  1157. message.postMessage( this, "fruit.remove" );
  1158. };
  1159. // 显示/隐藏 相关
  1160. ClassFruit.prototype.onShowStart = function(){
  1161. this.image.show();
  1162. // this.shadow.show();
  1163. };
  1164. ClassFruit.prototype.onScaling = function( time, a, b, z ){
  1165. this.image.scale( z = zoomAnim( time, a, b - a, 500 ), z );
  1166. this.shadow.scale( z, z );
  1167. };
  1168. ClassFruit.prototype.onHideEnd = function(){
  1169. this.remove();
  1170. };
  1171. // 旋转相关
  1172. ClassFruit.prototype.onRotateStart = function(){
  1173. };
  1174. ClassFruit.prototype.onRotating = function( time ){
  1175. this.image.rotate( ( this.rotateSpeed * time / 1e3 ) % 360, true );
  1176. };
  1177. // 裂开相关
  1178. ClassFruit.prototype.onBrokenDropUpdate = function( time ){
  1179. var radius = this.radius;
  1180. this.bImage1.attr({
  1181. x: linearAnim( time, this.brokenPosX - radius, this.brokenTargetX1, dropTime ),
  1182. y: dropAnim( time, this.brokenPosY - radius, this.brokenTargetY1 - this.brokenPosY + radius, dropTime )
  1183. }).rotate( linearAnim( time, this.apartAngle, this.bImage1RotateAngle, dropTime ), true );
  1184. this.bImage2.attr({
  1185. x: linearAnim( time, this.brokenPosX - radius, this.brokenTargetX2, dropTime ),
  1186. y: dropAnim( time, this.brokenPosY - radius, this.brokenTargetY2 - this.brokenPosY + radius, dropTime )
  1187. }).rotate( linearAnim( time, this.apartAngle, this.bImage2RotateAngle, dropTime ), true );
  1188. };
  1189. ClassFruit.prototype.onBrokenDropStart = function(){
  1190. this.brokenTargetX1 = -( random( dropXScope ) + 75 );
  1191. this.brokenTargetX2 = random( dropXScope + 75 );
  1192. this.brokenTargetY1 = 600;
  1193. this.brokenTargetY2 = 600;
  1194. this.brokenPosX = this.originX;
  1195. this.brokenPosY = this.originY;
  1196. this.bImage1RotateAngle = - random( 150 ) - 50;
  1197. this.bImage2RotateAngle = random( 150 ) + 50;
  1198. for(var f, i = fruitCache.length - 1; i >= 0; i --)
  1199. if( fruitCache[i] === this )
  1200. fruitCache.splice( i, 1 );
  1201. };
  1202. ClassFruit.prototype.onBrokenDropEnd = function(){
  1203. this.remove();
  1204. };
  1205. // 抛出相关
  1206. ClassFruit.prototype.onShotOuting = function( time ){
  1207. this.pos(
  1208. linearAnim( time, this.shotOutStartX, this.shotOutEndX - this.shotOutStartX, dropTime ),
  1209. fallOffAnim( time, this.shotOutStartY, this.shotOutEndY - this.shotOutStartY, dropTime )
  1210. );
  1211. };
  1212. ClassFruit.prototype.onShotOutStart = function(){
  1213. // body...
  1214. };
  1215. ClassFruit.prototype.onShotOutEnd = function(){
  1216. this.fallOff( 0, this.fallOffToX );
  1217. };
  1218. // 掉落相关
  1219. ClassFruit.prototype.onFalling = function( time ){
  1220. var y;
  1221. this.pos(
  1222. linearAnim( time, this.brokenPosX, this.fallTargetX - this.brokenPosX, dropTime ),
  1223. y = dropAnim( time, this.brokenPosY, this.fallTargetY - this.brokenPosY, dropTime )
  1224. );
  1225. this.checkForFallOutOfViewer( y );
  1226. };
  1227. ClassFruit.prototype.onFallStart = function(){
  1228. this.brokenPosX = this.originX;
  1229. this.brokenPosY = this.originY;
  1230. };
  1231. ClassFruit.prototype.onFallEnd = function(){
  1232. message.postMessage( this, "fruit.fallOff" );
  1233. this.remove();
  1234. };
  1235. // privates
  1236. ClassFruit.prototype.checkForFallOutOfViewer = function( y ){
  1237. if( y > 480 + this.radius )
  1238. this.checkForFallOutOfViewer = Ucren.nul,
  1239. this.rotateAnim && this.rotateAnim.stop(),
  1240. message.postMessage( this, "fruit.fallOutOfViewer" );
  1241. };
  1242. exports.create = function( type, originX, originY, isHide, flameStart ){
  1243. if( typeof type == "number" ) // 缺省 type
  1244. isHide = originY,
  1245. originY = originX,
  1246. originX = type,
  1247. type = getType();
  1248. var fruit = new ClassFruit({ type: type, originX: originX, originY: originY, flameStart: flameStart }).set( isHide );
  1249. fruitCache.unshift( fruit );
  1250. return fruit;
  1251. };
  1252. exports.getFruitInView = function(){
  1253. return fruitCache;
  1254. };
  1255. exports.getDropTimeSetting = function(){
  1256. return dropTime;
  1257. };
  1258. function getType(){
  1259. if( random( 8 ) == 4 )
  1260. return "boom";
  1261. else
  1262. return types[ random( 5 ) ];
  1263. };
  1264. return exports;
  1265. });
  1266. /**
  1267. * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\juice.js
  1268. */
  1269. define("scripts/factory/juice.js", function(exports){
  1270. /**
  1271. * 果汁
  1272. */
  1273. var Ucren = require("scripts/lib/ucren");
  1274. var layer = require("scripts/layer").getLayer("juice");
  1275. var timeline = require("scripts/timeline").use( "juice" ).init( 10 );
  1276. var tween = require("scripts/lib/tween");
  1277. var tools = require("scripts/tools");
  1278. var random = Ucren.randomNumber;
  1279. var dur = 1500;
  1280. var anim = tween.exponential.co;
  1281. var dropAnim = tween.quadratic.co;
  1282. var sin = Math.sin;
  1283. var cos = Math.cos;
  1284. var num = 10;
  1285. var radius = 10;
  1286. // if( Ucren.isIe6 || Ucren.isSafari )
  1287. // switchOn = false;
  1288. // if( Ucren.isIe || Ucren.isSafari )
  1289. // num = 6;
  1290. function ClassJuice( x, y, color ){
  1291. this.originX = x;
  1292. this.originY = y;
  1293. this.color = color;
  1294. this.distance = random( 200 ) + 100;
  1295. this.radius = radius;
  1296. this.dir = random( 360 ) * Math.PI / 180;
  1297. }
  1298. ClassJuice.prototype.render = function(){
  1299. this.circle = layer.circle( this.originX, this.originY, this.radius ).attr({
  1300. fill: this.color,
  1301. stroke: "none"
  1302. });
  1303. };
  1304. ClassJuice.prototype.sputter = function(){
  1305. timeline.createTask({
  1306. start: 0, duration: dur,
  1307. object: this, onTimeUpdate: this.onTimeUpdate, onTimeEnd: this.onTimeEnd
  1308. });
  1309. };
  1310. ClassJuice.prototype.onTimeUpdate = function( time ){
  1311. var distance, x, y, z;
  1312. distance = anim( time, 0, this.distance, dur );
  1313. x = this.originX + distance * cos( this.dir );
  1314. y = this.originY + distance * sin( this.dir ) + dropAnim( time, 0, 200, dur );
  1315. z = anim( time, 1, -1, dur );
  1316. this.circle.attr({ cx: x, cy: y }).scale( z, z );
  1317. };
  1318. ClassJuice.prototype.onTimeEnd = function(){
  1319. this.circle.remove();
  1320. tools.unsetObject( this );
  1321. };
  1322. exports.create = function( x, y, color ){
  1323. for(var i = 0; i < num; i ++)
  1324. this.createOne( x, y, color );
  1325. };
  1326. exports.createOne = function( x, y, color ){
  1327. if( !color )
  1328. return;
  1329. var juice = new ClassJuice( x, y, color );
  1330. juice.render();
  1331. juice.sputter();
  1332. };;
  1333. return exports;
  1334. });
  1335. /**
  1336. * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\rotate.js
  1337. */
  1338. define("scripts/factory/rotate.js", function(exports){
  1339. var layer = require("scripts/layer");
  1340. var timeline = require("scripts/timeline");
  1341. var Ucren = require("scripts/lib/ucren");
  1342. /**
  1343. * 旋转类模块模型
  1344. */
  1345. exports.create = function( imageSrc, x, y, w, h, z, anim, animDur ){
  1346. var module = {}, image;
  1347. var rotateDire = [12, -12][Ucren.randomNumber(2)];
  1348. var defaultAngle = Ucren.randomNumber(360);
  1349. module.anims = [];
  1350. module.set = function(){
  1351. image = layer.createImage( "default", imageSrc, x, y, w, h ).scale( z, z ).rotate( defaultAngle, true );
  1352. };
  1353. module.show = function(start){
  1354. timeline.createTask({
  1355. start: start,
  1356. duration: animDur,
  1357. object: this,
  1358. data: [z, 1],
  1359. onTimeUpdate: this.onZooming,
  1360. onTimeEnd: this.onShowEnd,
  1361. recycle: this.anims
  1362. });
  1363. };
  1364. module.hide = function(start){
  1365. this.anims.clear();
  1366. timeline.createTask({
  1367. start: start,
  1368. duration: animDur,
  1369. object: this,
  1370. data: [ 1, z ],
  1371. onTimeUpdate: this.onZooming,
  1372. recycle: this.anims
  1373. });
  1374. };
  1375. module.onShowEnd = function(name){
  1376. this.anims.clear();
  1377. timeline.createTask({
  1378. start: 0,
  1379. duration: -1,
  1380. object: this,
  1381. onTimeUpdate: module.onRotating,
  1382. recycle: this.anims
  1383. });
  1384. };
  1385. module.onZooming = function(){
  1386. var z;
  1387. return function( time, a, b ){
  1388. image.scale( z = anim( time, a, b - a, animDur ), z );
  1389. }
  1390. }();
  1391. module.onRotating = function(){
  1392. var lastTime = 0, an = defaultAngle;
  1393. return function( time, name, a, b ){
  1394. an = ( an + ( time - lastTime ) / 1e3 * rotateDire ) % 360;
  1395. image.rotate( an, true );
  1396. lastTime = time;
  1397. }
  1398. }();
  1399. return module;
  1400. };
  1401. return exports;
  1402. });
  1403. /**
  1404. * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\buzz.js
  1405. */
  1406. define("scripts/lib/buzz.js", function(exports){
  1407. // ----------------------------------------------------------------------------
  1408. // Buzz, a Javascript HTML5 Audio library
  1409. // v 1.0.x beta
  1410. // Licensed under the MIT license.
  1411. // http://buzz.jaysalvat.com/
  1412. // ----------------------------------------------------------------------------
  1413. // Copyright (C) 2011 Jay Salvat
  1414. // http://jaysalvat.com/
  1415. // ----------------------------------------------------------------------------
  1416. // Permission is hereby granted, free of charge, to any person obtaining a copy
  1417. // of this software and associated documentation files ( the "Software" ), to deal
  1418. // in the Software without restriction, including without limitation the rights
  1419. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  1420. // copies of the Software, and to permit persons to whom the Software is
  1421. // furnished to do so, subject to the following conditions:
  1422. //
  1423. // The above copyright notice and this permission notice shall be included in
  1424. // all copies or substantial portions of the Software.
  1425. //
  1426. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  1427. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  1428. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  1429. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  1430. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  1431. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  1432. // THE SOFTWARE.
  1433. // ----------------------------------------------------------------------------
  1434. var buzz = {
  1435. defaults: {
  1436. autoplay: false,
  1437. duration: 5000,
  1438. formats: [],
  1439. loop: false,
  1440. placeholder: '--',
  1441. preload: 'metadata',
  1442. volume: 80
  1443. },
  1444. types: {
  1445. 'mp3': 'audio/mpeg',
  1446. 'ogg': 'audio/ogg',
  1447. 'wav': 'audio/wav',
  1448. 'aac': 'audio/aac',
  1449. 'm4a': 'audio/x-m4a'
  1450. },
  1451. sounds: [],
  1452. el: document.createElement( 'audio' ),
  1453. sound: function( src, options ) {
  1454. options = options || {};
  1455. var pid = 0,
  1456. events = [],
  1457. eventsOnce = {},
  1458. supported = buzz.isSupported();
  1459. // publics
  1460. this.load = function() {
  1461. if ( !supported ) {
  1462. return this;
  1463. }
  1464. this.sound.load();
  1465. return this;
  1466. };
  1467. this.play = function() {
  1468. if ( !supported ) {
  1469. return this;
  1470. }
  1471. this.sound.play();
  1472. return this;
  1473. };
  1474. this.togglePlay = function() {
  1475. if ( !supported ) {
  1476. return this;
  1477. }
  1478. if ( this.sound.paused ) {
  1479. this.sound.play();
  1480. } else {
  1481. this.sound.pause();
  1482. }
  1483. return this;
  1484. };
  1485. this.pause = function() {
  1486. if ( !supported ) {
  1487. return this;
  1488. }
  1489. this.sound.pause();
  1490. return this;
  1491. };
  1492. this.isPaused = function() {
  1493. if ( !supported ) {
  1494. return null;
  1495. }
  1496. return this.sound.paused;
  1497. };
  1498. this.stop = function() {
  1499. if ( !supported ) {
  1500. return this;
  1501. }
  1502. this.setTime( this.getDuration() );
  1503. this.sound.pause();
  1504. return this;
  1505. };
  1506. this.isEnded = function() {
  1507. if ( !supported ) {
  1508. return null;
  1509. }
  1510. return this.sound.ended;
  1511. };
  1512. this.loop = function() {
  1513. if ( !supported ) {
  1514. return this;
  1515. }
  1516. this.sound.loop = 'loop';
  1517. this.bind( 'ended.buzzloop', function() {
  1518. this.currentTime = 0;
  1519. this.play();
  1520. });
  1521. return this;
  1522. };
  1523. this.unloop = function() {
  1524. if ( !supported ) {
  1525. return this;
  1526. }
  1527. this.sound.removeAttribute( 'loop' );
  1528. this.unbind( 'ended.buzzloop' );
  1529. return this;
  1530. };
  1531. this.mute = function() {
  1532. if ( !supported ) {
  1533. return this;
  1534. }
  1535. this.sound.muted = true;
  1536. return this;
  1537. };
  1538. this.unmute = function() {
  1539. if ( !supported ) {
  1540. return this;
  1541. }
  1542. this.sound.muted = false;
  1543. return this;
  1544. };
  1545. this.toggleMute = function() {
  1546. if ( !supported ) {
  1547. return this;
  1548. }
  1549. this.sound.muted = !this.sound.muted;
  1550. return this;
  1551. };
  1552. this.isMuted = function() {
  1553. if ( !supported ) {
  1554. return null;
  1555. }
  1556. return this.sound.muted;
  1557. };
  1558. this.setVolume = function( volume ) {
  1559. if ( !supported ) {
  1560. return this;
  1561. }
  1562. if ( volume < 0 ) {
  1563. volume = 0;
  1564. }
  1565. if ( volume > 100 ) {
  1566. volume = 100;
  1567. }
  1568. this.volume = volume;
  1569. this.sound.volume = volume / 100;
  1570. return this;
  1571. };
  1572. this.getVolume = function() {
  1573. if ( !supported ) {
  1574. return this;
  1575. }
  1576. return this.volume;
  1577. };
  1578. this.increaseVolume = function( value ) {
  1579. return this.setVolume( this.volume + ( value || 1 ) );
  1580. };
  1581. this.decreaseVolume = function( value ) {
  1582. return this.setVolume( this.volume - ( value || 1 ) );
  1583. };
  1584. this.setTime = function( time ) {
  1585. if ( !supported ) {
  1586. return this;
  1587. }
  1588. this.whenReady( function() {
  1589. this.sound.currentTime = time;
  1590. });
  1591. return this;
  1592. };
  1593. this.getTime = function() {
  1594. if ( !supported ) {
  1595. return null;
  1596. }
  1597. var time = Math.round( this.sound.currentTime * 100 ) / 100;
  1598. return isNaN( time ) ? buzz.defaults.placeholder : time;
  1599. };
  1600. this.setPercent = function( percent ) {
  1601. if ( !supported ) {
  1602. return this;
  1603. }
  1604. return this.setTime( buzz.fromPercent( percent, this.sound.duration ) );
  1605. };
  1606. this.getPercent = function() {
  1607. if ( !supported ) {
  1608. return null;
  1609. }
  1610. var percent = Math.round( buzz.toPercent( this.sound.currentTime, this.sound.duration ) );
  1611. return isNaN( percent ) ? buzz.defaults.placeholder : percent;
  1612. };
  1613. this.setSpeed = function( duration ) {
  1614. if ( !supported ) {
  1615. return this;
  1616. }
  1617. this.sound.playbackRate = duration;
  1618. };
  1619. this.getSpeed = function() {
  1620. if ( !supported ) {
  1621. return null;
  1622. }
  1623. return this.sound.playbackRate;
  1624. };
  1625. this.getDuration = function() {
  1626. if ( !supported ) {
  1627. return null;
  1628. }
  1629. var duration = Math.round( this.sound.duration * 100 ) / 100;
  1630. return isNaN( duration ) ? buzz.defaults.placeholder : duration;
  1631. };
  1632. this.getPlayed = function() {
  1633. if ( !supported ) {
  1634. return null;
  1635. }
  1636. return timerangeToArray( this.sound.played );
  1637. };
  1638. this.getBuffered = function() {
  1639. if ( !supported ) {
  1640. return null;
  1641. }
  1642. return timerangeToArray( this.sound.buffered );
  1643. };
  1644. this.getSeekable = function() {
  1645. if ( !supported ) {
  1646. return null;
  1647. }
  1648. return timerangeToArray( this.sound.seekable );
  1649. };
  1650. this.getErrorCode = function() {
  1651. if ( supported && this.sound.error ) {
  1652. return this.sound.error.code;
  1653. }
  1654. return 0;
  1655. };
  1656. this.getErrorMessage = function() {
  1657. if ( !supported ) {
  1658. return null;
  1659. }
  1660. switch( this.getErrorCode() ) {
  1661. case 1:
  1662. return 'MEDIA_ERR_ABORTED';
  1663. case 2:
  1664. return 'MEDIA_ERR_NETWORK';
  1665. case 3:
  1666. return 'MEDIA_ERR_DECODE';
  1667. case 4:
  1668. return 'MEDIA_ERR_SRC_NOT_SUPPORTED';
  1669. default:
  1670. return null;
  1671. }
  1672. };
  1673. this.getStateCode = function() {
  1674. if ( !supported ) {
  1675. return null;
  1676. }
  1677. return this.sound.readyState;
  1678. };
  1679. this.getStateMessage = function() {
  1680. if ( !supported ) {
  1681. return null;
  1682. }
  1683. switch( this.getStateCode() ) {
  1684. case 0:
  1685. return 'HAVE_NOTHING';
  1686. case 1:
  1687. return 'HAVE_METADATA';
  1688. case 2:
  1689. return 'HAVE_CURRENT_DATA';
  1690. case 3:
  1691. return 'HAVE_FUTURE_DATA';
  1692. case 4:
  1693. return 'HAVE_ENOUGH_DATA';
  1694. default:
  1695. return null;
  1696. }
  1697. };
  1698. this.getNetworkStateCode = function() {
  1699. if ( !supported ) {
  1700. return null;
  1701. }
  1702. return this.sound.networkState;
  1703. };
  1704. this.getNetworkStateMessage = function() {
  1705. if ( !supported ) {
  1706. return null;
  1707. }
  1708. switch( this.getNetworkStateCode() ) {
  1709. case 0:
  1710. return 'NETWORK_EMPTY';
  1711. case 1:
  1712. return 'NETWORK_IDLE';
  1713. case 2:
  1714. return 'NETWORK_LOADING';
  1715. case 3:
  1716. return 'NETWORK_NO_SOURCE';
  1717. default:
  1718. return null;
  1719. }
  1720. };
  1721. this.set = function( key, value ) {
  1722. if ( !supported ) {
  1723. return this;
  1724. }
  1725. this.sound[ key ] = value;
  1726. return this;
  1727. };
  1728. this.get = function( key ) {
  1729. if ( !supported ) {
  1730. return null;
  1731. }
  1732. return key ? this.sound[ key ] : this.sound;
  1733. };
  1734. this.bind = function( types, func ) {
  1735. if ( !supported ) {
  1736. return this;
  1737. }
  1738. types = types.split( ' ' );
  1739. var that = this,
  1740. efunc = function( e ) { func.call( that, e ); };
  1741. for( var t = 0; t < types.length; t++ ) {
  1742. var type = types[ t ],
  1743. idx = type;
  1744. type = idx.split( '.' )[ 0 ];
  1745. events.push( { idx: idx, func: efunc } );
  1746. this.sound.addEventListener( type, efunc, true );
  1747. }
  1748. return this;
  1749. };
  1750. this.unbind = function( types ) {
  1751. if ( !supported ) {
  1752. return this;
  1753. }
  1754. types = types.split( ' ' );
  1755. for( var t = 0; t < types.length; t++ ) {
  1756. var idx = types[ t ],
  1757. type = idx.split( '.' )[ 0 ];
  1758. for( var i = 0; i < events.length; i++ ) {
  1759. var namespace = events[ i ].idx.split( '.' );
  1760. if ( events[ i ].idx == idx || ( namespace[ 1 ] && namespace[ 1 ] == idx.replace( '.', '' ) ) ) {
  1761. this.sound.removeEventListener( type, events[ i ].func, true );
  1762. // remove event
  1763. events.splice(i, 1);
  1764. }
  1765. }
  1766. }
  1767. return this;
  1768. };
  1769. this.bindOnce = function( type, func ) {
  1770. if ( !supported ) {
  1771. return this;
  1772. }
  1773. var that = this;
  1774. eventsOnce[ pid++ ] = false;
  1775. this.bind( pid + type, function() {
  1776. if ( !eventsOnce[ pid ] ) {
  1777. eventsOnce[ pid ] = true;
  1778. func.call( that );
  1779. }
  1780. that.unbind( pid + type );
  1781. });
  1782. };
  1783. this.trigger = function( types ) {
  1784. if ( !supported ) {
  1785. return this;
  1786. }
  1787. types = types.split( ' ' );
  1788. for( var t = 0; t < types.length; t++ ) {
  1789. var idx = types[ t ];
  1790. for( var i = 0; i < events.length; i++ ) {
  1791. var eventType = events[ i ].idx.split( '.' );
  1792. if ( events[ i ].idx == idx || ( eventType[ 0 ] && eventType[ 0 ] == idx.replace( '.', '' ) ) ) {
  1793. var evt = document.createEvent('HTMLEvents');
  1794. evt.initEvent( eventType[ 0 ], false, true );
  1795. this.sound.dispatchEvent( evt );
  1796. }
  1797. }
  1798. }
  1799. return this;
  1800. };
  1801. this.fadeTo = function( to, duration, callback ) {
  1802. if ( !supported ) {
  1803. return this;
  1804. }
  1805. if ( duration instanceof Function ) {
  1806. callback = duration;
  1807. duration = buzz.defaults.duration;
  1808. } else {
  1809. duration = duration || buzz.defaults.duration;
  1810. }
  1811. var from = this.volume,
  1812. delay = duration / Math.abs( from - to ),
  1813. that = this;
  1814. this.play();
  1815. function doFade() {
  1816. setTimeout( function() {
  1817. if ( from < to && that.volume < to ) {
  1818. that.setVolume( that.volume += 1 );
  1819. doFade();
  1820. } else if ( from > to && that.volume > to ) {
  1821. that.setVolume( that.volume -= 1 );
  1822. doFade();
  1823. } else if ( callback instanceof Function ) {
  1824. callback.apply( that );
  1825. }
  1826. }, delay );
  1827. }
  1828. this.whenReady( function() {
  1829. doFade();
  1830. });
  1831. return this;
  1832. };
  1833. this.fadeIn = function( duration, callback ) {
  1834. if ( !supported ) {
  1835. return this;
  1836. }
  1837. return this.setVolume(0).fadeTo( 100, duration, callback );
  1838. };
  1839. this.fadeOut = function( duration, callback ) {
  1840. if ( !supported ) {
  1841. return this;
  1842. }
  1843. return this.fadeTo( 0, duration, callback );
  1844. };
  1845. this.fadeWith = function( sound, duration ) {
  1846. if ( !supported ) {
  1847. return this;
  1848. }
  1849. this.fadeOut( duration, function() {
  1850. this.stop();
  1851. });
  1852. sound.play().fadeIn( duration );
  1853. return this;
  1854. };
  1855. this.whenReady = function( func ) {
  1856. if ( !supported ) {
  1857. return null;
  1858. }
  1859. var that = this;
  1860. if ( this.sound.readyState === 0 ) {
  1861. this.bind( 'canplay.buzzwhenready', function() {
  1862. func.call( that );
  1863. });
  1864. } else {
  1865. func.call( that );
  1866. }
  1867. };
  1868. // privates
  1869. function timerangeToArray( timeRange ) {
  1870. var array = [],
  1871. length = timeRange.length - 1;
  1872. for( var i = 0; i <= length; i++ ) {
  1873. array.push({
  1874. start: timeRange.start( length ),
  1875. end: timeRange.end( length )
  1876. });
  1877. }
  1878. return array;
  1879. }
  1880. function getExt( filename ) {
  1881. return filename.split('.').pop();
  1882. }
  1883. function addSource( sound, src ) {
  1884. var source = document.createElement( 'source' );
  1885. source.src = src;
  1886. if ( buzz.types[ getExt( src ) ] ) {
  1887. source.type = buzz.types[ getExt( src ) ];
  1888. }
  1889. sound.appendChild( source );
  1890. }
  1891. // init
  1892. if ( supported && src ) {
  1893. for(var i in buzz.defaults ) {
  1894. if(buzz.defaults.hasOwnProperty(i)) {
  1895. options[ i ] = options[ i ] || buzz.defaults[ i ];
  1896. }
  1897. }
  1898. this.sound = document.createElement( 'audio' );
  1899. if ( src instanceof Array ) {
  1900. for( var j in src ) {
  1901. if(src.hasOwnProperty(j)) {
  1902. addSource( this.sound, src[ j ] );
  1903. }
  1904. }
  1905. } else if ( options.formats.length ) {
  1906. for( var k in options.formats ) {
  1907. if(options.formats.hasOwnProperty(k)) {
  1908. addSource( this.sound, src + '.' + options.formats[ k ] );
  1909. }
  1910. }
  1911. } else {
  1912. addSource( this.sound, src );
  1913. }
  1914. if ( options.loop ) {
  1915. this.loop();
  1916. }
  1917. if ( options.autoplay ) {
  1918. this.sound.autoplay = 'autoplay';
  1919. }
  1920. if ( options.preload === true ) {
  1921. this.sound.preload = 'auto';
  1922. } else if ( options.preload === false ) {
  1923. this.sound.preload = 'none';
  1924. } else {
  1925. this.sound.preload = options.preload;
  1926. }
  1927. this.setVolume( options.volume );
  1928. buzz.sounds.push( this );
  1929. }
  1930. },
  1931. group: function( sounds ) {
  1932. sounds = argsToArray( sounds, arguments );
  1933. // publics
  1934. this.getSounds = function() {
  1935. return sounds;
  1936. };
  1937. this.add = function( soundArray ) {
  1938. soundArray = argsToArray( soundArray, arguments );
  1939. for( var a = 0; a < soundArray.length; a++ ) {
  1940. sounds.push( soundArray[ a ] );
  1941. }
  1942. };
  1943. this.remove = function( soundArray ) {
  1944. soundArray = argsToArray( soundArray, arguments );
  1945. for( var a = 0; a < soundArray.length; a++ ) {
  1946. for( var i = 0; i < sounds.length; i++ ) {
  1947. if ( sounds[ i ] == soundArray[ a ] ) {
  1948. delete sounds[ i ];
  1949. break;
  1950. }
  1951. }
  1952. }
  1953. };
  1954. this.load = function() {
  1955. fn( 'load' );
  1956. return this;
  1957. };
  1958. this.play = function() {
  1959. fn( 'play' );
  1960. return this;
  1961. };
  1962. this.togglePlay = function( ) {
  1963. fn( 'togglePlay' );
  1964. return this;
  1965. };
  1966. this.pause = function( time ) {
  1967. fn( 'pause', time );
  1968. return this;
  1969. };
  1970. this.stop = function() {
  1971. fn( 'stop' );
  1972. return this;
  1973. };
  1974. this.mute = function() {
  1975. fn( 'mute' );
  1976. return this;
  1977. };
  1978. this.unmute = function() {
  1979. fn( 'unmute' );
  1980. return this;
  1981. };
  1982. this.toggleMute = function() {
  1983. fn( 'toggleMute' );
  1984. return this;
  1985. };
  1986. this.setVolume = function( volume ) {
  1987. fn( 'setVolume', volume );
  1988. return this;
  1989. };
  1990. this.increaseVolume = function( value ) {
  1991. fn( 'increaseVolume', value );
  1992. return this;
  1993. };
  1994. this.decreaseVolume = function( value ) {
  1995. fn( 'decreaseVolume', value );
  1996. return this;
  1997. };
  1998. this.loop = function() {
  1999. fn( 'loop' );
  2000. return this;
  2001. };
  2002. this.unloop = function() {
  2003. fn( 'unloop' );
  2004. return this;
  2005. };
  2006. this.setTime = function( time ) {
  2007. fn( 'setTime', time );
  2008. return this;
  2009. };
  2010. this.setduration = function( duration ) {
  2011. fn( 'setduration', duration );
  2012. return this;
  2013. };
  2014. this.set = function( key, value ) {
  2015. fn( 'set', key, value );
  2016. return this;
  2017. };
  2018. this.bind = function( type, func ) {
  2019. fn( 'bind', type, func );
  2020. return this;
  2021. };
  2022. this.unbind = function( type ) {
  2023. fn( 'unbind', type );
  2024. return this;
  2025. };
  2026. this.bindOnce = function( type, func ) {
  2027. fn( 'bindOnce', type, func );
  2028. return this;
  2029. };
  2030. this.trigger = function( type ) {
  2031. fn( 'trigger', type );
  2032. return this;
  2033. };
  2034. this.fade = function( from, to, duration, callback ) {
  2035. fn( 'fade', from, to, duration, callback );
  2036. return this;
  2037. };
  2038. this.fadeIn = function( duration, callback ) {
  2039. fn( 'fadeIn', duration, callback );
  2040. return this;
  2041. };
  2042. this.fadeOut = function( duration, callback ) {
  2043. fn( 'fadeOut', duration, callback );
  2044. return this;
  2045. };
  2046. // privates
  2047. function fn() {
  2048. var args = argsToArray( null, arguments ),
  2049. func = args.shift();
  2050. for( var i = 0; i < sounds.length; i++ ) {
  2051. sounds[ i ][ func ].apply( sounds[ i ], args );
  2052. }
  2053. }
  2054. function argsToArray( array, args ) {
  2055. return ( array instanceof Array ) ? array : Array.prototype.slice.call( args );
  2056. }
  2057. },
  2058. all: function() {
  2059. return new buzz.group( buzz.sounds );
  2060. },
  2061. isSupported: function() {
  2062. return !!buzz.el.canPlayType;
  2063. },
  2064. isOGGSupported: function() {
  2065. return !!buzz.el.canPlayType && buzz.el.canPlayType( 'audio/ogg; codecs="vorbis"' );
  2066. },
  2067. isWAVSupported: function() {
  2068. return !!buzz.el.canPlayType && buzz.el.canPlayType( 'audio/wav; codecs="1"' );
  2069. },
  2070. isMP3Supported: function() {
  2071. return !!buzz.el.canPlayType && buzz.el.canPlayType( 'audio/mpeg;' );
  2072. },
  2073. isAACSupported: function() {
  2074. return !!buzz.el.canPlayType && ( buzz.el.canPlayType( 'audio/x-m4a;' ) || buzz.el.canPlayType( 'audio/aac;' ) );
  2075. },
  2076. toTimer: function( time, withHours ) {
  2077. var h, m, s;
  2078. h = Math.floor( time / 3600 );
  2079. h = isNaN( h ) ? '--' : ( h >= 10 ) ? h : '0' + h;
  2080. m = withHours ? Math.floor( time / 60 % 60 ) : Math.floor( time / 60 );
  2081. m = isNaN( m ) ? '--' : ( m >= 10 ) ? m : '0' + m;
  2082. s = Math.floor( time % 60 );
  2083. s = isNaN( s ) ? '--' : ( s >= 10 ) ? s : '0' + s;
  2084. return withHours ? h + ':' + m + ':' + s : m + ':' + s;
  2085. },
  2086. fromTimer: function( time ) {
  2087. var splits = time.toString().split( ':' );
  2088. if ( splits && splits.length == 3 ) {
  2089. time = ( parseInt( splits[ 0 ], 10 ) * 3600 ) + ( parseInt(splits[ 1 ], 10 ) * 60 ) + parseInt( splits[ 2 ], 10 );
  2090. }
  2091. if ( splits && splits.length == 2 ) {
  2092. time = ( parseInt( splits[ 0 ], 10 ) * 60 ) + parseInt( splits[ 1 ], 10 );
  2093. }
  2094. return time;
  2095. },
  2096. toPercent: function( value, total, decimal ) {
  2097. var r = Math.pow( 10, decimal || 0 );
  2098. return Math.round( ( ( value * 100 ) / total ) * r ) / r;
  2099. },
  2100. fromPercent: function( percent, total, decimal ) {
  2101. var r = Math.pow( 10, decimal || 0 );
  2102. return Math.round( ( ( total / 100 ) * percent ) * r ) / r;
  2103. }
  2104. };
  2105. exports = buzz;;
  2106. return exports;
  2107. });
  2108. /**
  2109. * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\raphael.js
  2110. */
  2111. define("scripts/lib/raphael.js", function(exports){
  2112. /*
  2113. * Raphael 1.5.2 - JavaScript Vector Library
  2114. *
  2115. * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
  2116. * Licensed under the MIT (http://raphaeljs.com/license.html) license.
  2117. */
  2118. var Raphael;
  2119. var window = {};
  2120. (function(){function a(){if(a.is(arguments[0],G)){var b=arguments[0],d=bV[m](a,b.splice(0,3+a.is(b[0],E))),e=d.set();for(var g=0,h=b[w];g<h;g++){var i=b[g]||{};c[f](i.type)&&e[L](d[i.type]().attr(i))}return e}return bV[m](a,arguments)}a.version="1.5.2";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g=document,h=window,i={was:Object[e][f].call(h,"Raphael"),is:h.Raphael},j=function(){this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in g,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v="join",w="length",x=r[e].toLowerCase,y=Math,z=y.max,A=y.min,B=y.abs,C=y.pow,D=y.PI,E="number",F="string",G="array",H="toString",I="fill",J=Object[e][H],K={},L="push",M=/^url\(['"]?([^\)]+?)['"]?\)$/i,N=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,O={"NaN":1,Infinity:1,"-Infinity":1},P=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,Q=y.round,R="setAttribute",S=parseFloat,T=parseInt,U=" progid:DXImageTransform.Microsoft",V=r[e].toUpperCase,W={blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:"10px \"Arial\"","font-family":"\"Arial\"","font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},X={along:"along",blur:E,"clip-rect":"csv",cx:E,cy:E,fill:"colour","fill-opacity":E,"font-size":E,height:E,opacity:E,path:"path",r:E,rotation:"csv",rx:E,ry:E,scale:"csv",stroke:"colour","stroke-opacity":E,"stroke-width":E,translation:"csv",width:E,x:E,y:E},Y="replace",Z=/^(from|to|\d+%?)$/,$=/\s*,\s*/,_={hs:1,rg:1},ba=/,?([achlmqrstvxz]),?/gi,bb=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,bc=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,bd=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,be=function(a,b){return a.key-b.key};a.type=h.SVGAngle||g.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bf=g.createElement("div"),bg;bf.innerHTML="<v:shape adj=\"1\"/>";bg=bf.firstChild;bg.style.behavior="url(#default#VML)";if(!(bg&&typeof bg.adj=="object"))return a.type=null;bf=null}a.svg=!(a.vml=a.type=="VML");j[e]=a[e];k=j[e];a._id=0;a._oid=0;a.fn={};a.is=function(a,b){b=x.call(b);if(b=="finite")return!O[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||J.call(a).slice(8,-1).toLowerCase()==b};a.angle=function(b,c,d,e,f,g){{if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return((h<0)*180+y.atan(-i/-h)*180/D+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)}};a.rad=function(a){return a%360*D/180};a.deg=function(a){return a*180/D%360};a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,G)){var e=b.length;while(e--)if(B(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};function bh(){var a=[],b=0;for(;b<32;b++)a[b]=(~(~(y.random()*16)))[H](16);a[12]=4;a[16]=(a[16]&3|8)[H](16);return"r-"+a[v]("")}a.setWindow=function(a){h=a;g=h.document};var bi=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>");e.close();d=e.body}catch(a){d=createPopup().document.body}var f=d.createTextRange();bi=bm(function(a){try{d.style.color=r(a)[Y](c,p);var b=f.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b[H](16)).slice(-6)}catch(a){return"none"}})}else{var h=g.createElement("i");h.title="Raphaël Colour Picker";h.style.display="none";g.body[l](h);bi=bm(function(a){h.style.color=a;return g.defaultView.getComputedStyle(h,p).getPropertyValue("color")})}return bi(b)},bj=function(){return"hsb("+[this.h,this.s,this.b]+")"},bk=function(){return"hsl("+[this.h,this.s,this.l]+")"},bl=function(){return this.hex};a.hsb2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b){d=b.b;c=b.s;b=b.h;e=b.o}return a.hsl2rgb(b,c,d/2,e)};a.hsl2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b){d=b.l;c=b.s;b=b.h}if(b>1||c>1||d>1){b/=360;c/=100;d/=100}var f={},g=["r","g","b"],h,i,j,k,l,m;if(c){d<0.5?h=d*(1+c):h=d+c-d*c;i=2*d-h;for(var n=0;n<3;n++){j=b+1/3*-(n-1);j<0&&j++;j>1&&j--;j*6<1?f[g[n]]=i+(h-i)*6*j:j*2<1?f[g[n]]=h:j*3<2?f[g[n]]=i+(h-i)*(2/3-j)*6:f[g[n]]=i}}else f={r:d,g:d,b:d};f.r*=255;f.g*=255;f.b*=255;f.hex="#"+(16777216|f.b|f.g<<8|f.r<<16).toString(16).slice(1);a.is(e,"finite")&&(f.opacity=e);f.toString=bl;return f};a.rgb2hsb=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=f;{if(g==f)return{h:0,s:0,b:f,toString:bj};var k=f-g;i=k/f;b==f?h=(c-d)/k:c==f?h=2+(d-b)/k:h=4+(b-c)/k;h/=6;h<0&&h++;h>1&&h--}return{h:h,s:i,b:j,toString:bj}};a.rgb2hsl=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=(f+g)/2,k;if(g==f)k={h:0,s:0,l:j};else{var l=f-g;i=j<0.5?l/(f+g):l/(2-f-g);b==f?h=(c-d)/l:c==f?h=2+(d-b)/l:h=4+(b-c)/l;h/=6;h<0&&h++;h>1&&h--;k={h:h,s:i,l:j}}k.toString=bk;return k};a._path2string=function(){return this.join(",")[Y](ba,"$1")};function bm(a,b,c){function d(){var g=Array[e].slice.call(arguments,0),h=g[v]("►"),i=d.cache=d.cache||{},j=d.count=d.count||[];if(i[f](h))return c?c(i[h]):i[h];j[w]>=1000&&delete i[j.shift()];j[L](h);i[h]=a[m](b,g);return c?c(i[h]):i[h]}return d}a.getRGB=bm(function(b){if(!b||!(!((b=r(b)).indexOf("-")+1)))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!(_[f](b.toLowerCase().substring(0,2))||b.charAt()=="#")&&(b=bi(b));var c,d,e,g,h,i,j,k=b.match(N);if(k){if(k[2]){g=T(k[2].substring(5),16);e=T(k[2].substring(3,5),16);d=T(k[2].substring(1,3),16)}if(k[3]){g=T((i=k[3].charAt(3))+i,16);e=T((i=k[3].charAt(2))+i,16);d=T((i=k[3].charAt(1))+i,16)}if(k[4]){j=k[4][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);k[1].toLowerCase().slice(0,4)=="rgba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100)}if(k[5]){j=k[5][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsla"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g};k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1);a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a);a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||0.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=0.075;if(b.h>1){b.h=0;b.s-=0.2;b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})}return c.hex};a.getColor.reset=function(){delete this.start};a.parsePathString=bm(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,G)&&a.is(b[0],G)&&(d=bo(b));d[w]||r(b)[Y](bb,function(a,b,e){var f=[],g=x.call(b);e[Y](bc,function(a,b){b&&f[L](+b)});if(g=="m"&&f[w]>2){d[L]([b][n](f.splice(0,2)));g="l";b=b=="m"?"l":"L"}while(f[w]>=c[g]){d[L]([b][n](f.splice(0,c[g])));if(!c[g])break}});d[H]=a._path2string;return d});a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,l=C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-y.atan((m-o)/(n-p))*180/D;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bn=bm(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bw(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a[w];g<h;g++){f=a[g];if(f[0]=="M"){b=f[1];c=f[2];d[L](b);e[L](c)}else{var i=bv(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[n](i.min.x,i.max.x);e=e[n](i.min.y,i.max.y);b=f[5];c=f[6]}}var j=A[m](0,d),k=A[m](0,e);return{x:j,y:k,width:z[m](0,d)-j,height:z[m](0,e)-k}}),bo=function(b){var c=[];if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);for(var d=0,e=b[w];d<e;d++){c[d]=[];for(var f=0,g=b[d][w];f<g;f++)c[d][f]=b[d][f]}c[H]=a._path2string;return c},bp=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;if(b[0][0]=="M"){d=b[0][1];e=b[0][2];f=d;g=e;h++;c[L](["M",d,e])}for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=x.call(l[0])){k[0]=x.call(l[0]);switch(k[0]){case"a":k[1]=l[1];k[2]=l[2];k[3]=l[3];k[4]=l[4];k[5]=l[5];k[6]=+(l[6]-d).toFixed(3);k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1];g=l[2];default:for(var m=1,n=l[w];m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[];if(l[0]=="m"){f=l[1]+d;g=l[2]+e}for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o]}var q=c[i][w];switch(c[i][0]){case"z":d=f;e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2];e+=+c[i][q-1]}}c[H]=a._path2string;return c},0,bo),bq=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;if(b[0][0]=="M"){d=+b[0][1];e=+b[0][2];f=d;g=e;h++;c[0]=["M",d,e]}for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=V.call(l[0])){k[0]=V.call(l[0]);switch(k[0]){case"A":k[1]=l[1];k[2]=l[2];k[3]=l[3];k[4]=l[4];k[5]=l[5];k[6]=+(l[6]+d);k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d;g=+l[2]+e;default:for(var m=1,n=l[w];m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f;e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i][w]-2];g=c[i][c[i][w]-1];default:d=c[i][c[i][w]-2];e=c[i][c[i][w]-1]}}c[H]=a._path2string;return c},null,bo),br=function(a,b,c,d){return[a,b,c,d,c,d]},bs=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bt=function(a,b,c,d,e,f,g,h,i,j){var k=D*120/180,l=D/180*(+e||0),m=[],o,p=bm(function(a,b,c){var d=a*y.cos(c)-b*y.sin(c),e=a*y.sin(c)+b*y.cos(c);return{x:d,y:e}});if(j){G=j[0];H=j[1];E=j[2];F=j[3]}else{o=p(a,b,-l);a=o.x;b=o.y;o=p(h,i,-l);h=o.x;i=o.y;var q=y.cos(D/180*e),r=y.sin(D/180*e),t=(a-h)/2,u=(b-i)/2,x=t*t/(c*c)+u*u/(d*d);if(x>1){x=y.sqrt(x);c=x*c;d=x*d}var z=c*c,A=d*d,C=(f==g?-1:1)*y.sqrt(B((z*A-z*u*u-A*t*t)/(z*u*u+A*t*t))),E=C*c*u/d+(a+h)/2,F=C*-d*t/c+(b+i)/2,G=y.asin(((b-F)/d).toFixed(9)),H=y.asin(((i-F)/d).toFixed(9));G=a<E?D-G:G;H=h<E?D-H:H;G<0&&(G=D*2+G);H<0&&(H=D*2+H);g&&G>H&&(G=G-D*2);!g&&H>G&&(H=H-D*2)}var I=H-G;if(B(I)>k){var J=H,K=h,L=i;H=G+k*(g&&H>G?1:-1);h=E+c*y.cos(H);i=F+d*y.sin(H);m=bt(h,i,c,d,e,0,g,K,L,[H,J,E,F])}I=H-G;var M=y.cos(G),N=y.sin(G),O=y.cos(H),P=y.sin(H),Q=y.tan(I/4),R=4/3*c*Q,S=4/3*d*Q,T=[a,b],U=[a+R*N,b-S*M],V=[h+R*P,i-S*O],W=[h,i];U[0]=2*T[0]-U[0];U[1]=2*T[1]-U[1];{if(j)return[U,V,W][n](m);m=[U,V,W][n](m)[v]()[s](",");var X=[];for(var Y=0,Z=m[w];Y<Z;Y++)X[Y]=Y%2?p(m[Y-1],m[Y],l).y:p(m[Y],m[Y+1],l).x;return X}},bu=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,y:C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h}},bv=bm(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+y.sqrt(j*j-4*i*k))/2/i,n=(-j-y.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;B(l)>"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}i=f-2*d+b-(h-2*f+d);j=2*(d-b)-2*(f-d);k=b-d;l=(-j+y.sqrt(j*j-4*i*k))/2/i;n=(-j-y.sqrt(j*j-4*i*k))/2/i;B(l)>"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}return{min:{x:A[m](0,p),y:A[m](0,o)},max:{x:z[m](0,p),y:z[m](0,o)}}}),bw=bm(function(a,b){var c=bq(a),d=b&&bq(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1];b.Y=a[2];break;case"A":a=["C"][n](bt[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x));d=b.y+(b.y-(b.by||b.y));a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x));b.qy=b.y+(b.y-(b.qy||b.y));a=["C"][n](bs(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1];b.qy=a[2];a=["C"][n](bs(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](br(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](br(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](br(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](br(b.x,b.y,b.X,b.Y));break}return a},h=function(a,b){if(a[b][w]>7){a[b].shift();var e=a[b];while(e[w])a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1);k=z(c[w],d&&d[w]||0)}},i=function(a,b,e,f,g){if(a&&b&&a[g][0]=="M"&&b[g][0]!="M"){b.splice(g,0,["M",f.x,f.y]);e.bx=0;e.by=0;e.x=a[g][1];e.y=a[g][2];k=z(c[w],d&&d[w]||0)}};for(var j=0,k=z(c[w],d&&d[w]||0);j<k;j++){c[j]=g(c[j],e);h(c,j);d&&(d[j]=g(d[j],f));d&&h(d,j);i(c,d,e,f,j);i(d,c,f,e,j);var l=c[j],o=d&&d[j],p=l[w],q=d&&o[w];e.x=l[p-2];e.y=l[p-1];e.bx=S(l[p-4])||e.x;e.by=S(l[p-3])||e.y;f.bx=d&&(S(o[q-4])||f.x);f.by=d&&(S(o[q-3])||f.y);f.x=d&&o[q-2];f.y=d&&o[q-1]}return d?[c,d]:c},null,bo),bx=bm(function(b){var c=[];for(var d=0,e=b[w];d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex;g[2]&&(f.offset=g[2]+"%");c[L](f)}for(d=1,e=c[w]-1;d<e;d++){if(!c[d].offset){var h=S(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++){if(c[j].offset){i=c[j].offset;break}}if(!i){i=100;j=e}i=S(i);var k=(i-h)/(j-d+1);for(;d<j;d++){h+=k;c[d].offset=h+"%"}}}return c}),by=function(b,c,d,e){var f;if(a.is(b,F)||a.is(b,"object")){f=a.is(b,F)?g.getElementById(b):b;if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}}else return{container:1,x:b,y:c,width:d,height:e}},bz=function(a,b){var c=this;for(var d in b){if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[m](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{};bz.call(this,a[d],b[d]);break;default:a[d]=b[d];break}}},bA=function(a,b){a==b.top&&(b.top=a.prev);a==b.bottom&&(b.bottom=a.next);a.next&&(a.next.prev=a.prev);a.prev&&(a.prev.next=a.next)},bB=function(a,b){if(b.top===a)return;bA(a,b);a.next=null;a.prev=b.top;b.top.next=a;b.top=a},bC=function(a,b){if(b.bottom===a)return;bA(a,b);a.next=b.bottom;a.prev=null;b.bottom.prev=a;b.bottom=a},bD=function(a,b,c){bA(a,c);b==c.top&&(c.top=a);b.next&&(b.next.prev=a);a.next=b.next;a.prev=b;b.next=a},bE=function(a,b,c){bA(a,c);b==c.bottom&&(c.bottom=a);b.prev&&(b.prev.next=a);a.prev=b.prev;b.prev=a;a.next=b},bF=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}};a.pathToRelative=bp;if(a.svg){k.svgns="http://www.w3.org/2000/svg";k.xlink="http://www.w3.org/1999/xlink";Q=function(a){return+a+(~(~a)===a)*0.5};var bG=function(a,b){if(b)for(var c in b)b[f](c)&&a[R](c,r(b[c]));else{a=g.createElementNS(k.svgns,a);a.style.webkitTapHighlightColor="rgba(0,0,0,0)";return a}};a[H]=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bH=function(a,b){var c=bG("path");b.canvas&&b.canvas[l](c);var d=new bN(c,b);d.type="path";bK(d,{fill:"none",stroke:"#000",path:a});return d},bI=function(a,b,c){var d="linear",e=0.5,f=0.5,h=a.style;b=r(b)[Y](bd,function(a,b,c){d="radial";if(b&&c){e=S(b);f=S(c);var g=(f>0.5)*2-1;C(e-0.5,2)+C(f-0.5,2)>0.25&&(f=y.sqrt(0.25-C(e-0.5,2))*g+0.5)&&f!=0.5&&(f=f.toFixed(5)-0.00001*g)}return p});b=b[s](/\s*\-\s*/);if(d=="linear"){var i=b.shift();i=-S(i);if(isNaN(i))return null;var j=[0,0,y.cos(i*D/180),y.sin(i*D/180)],k=1/(z(B(j[2]),B(j[3]))||1);j[2]*=k;j[3]*=k;if(j[2]<0){j[0]=-j[2];j[2]=0}if(j[3]<0){j[1]=-j[3];j[3]=0}}var m=bx(b);if(!m)return null;var n=a.getAttribute(I);n=n.match(/^url\(#(.*)\)$/);n&&c.defs.removeChild(g.getElementById(n[1]));var o=bG(d+"Gradient");o.id=bh();bG(o,d=="radial"?{fx:e,fy:f}:{x1:j[0],y1:j[1],x2:j[2],y2:j[3]});c.defs[l](o);for(var q=0,t=m[w];q<t;q++){var u=bG("stop");bG(u,{offset:m[q].offset?m[q].offset:q?"100%":"0%","stop-color":m[q].color||"#fff"});o[l](u)}bG(a,{fill:"url(#"+o.id+")",opacity:1,"fill-opacity":1});h.fill=p;h.opacity=1;h.fillOpacity=1;return 1},bJ=function(b){var c=b.getBBox();bG(b.pattern,{patternTransform:a.format("translate({0},{1})",c.x,c.y)})},bK=function(c,d){var e={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},h=c.node,i=c.attrs,j=c.rotate(),k=function(a,b){b=e[x.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b[w];while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bG(h,{"stroke-dasharray":g[v](",")})}};d[f]("rotation")&&(j=d.rotation);var m=r(j)[s](b);if(m.length-1){m[1]=+m[1];m[2]=+m[2]}else m=null;S(j)&&c.rotate(0,true);for(var n in d){if(d[f](n)){if(!W[f](n))continue;var o=d[n];i[n]=o;switch(n){case"blur":c.blur(o);break;case"rotation":c.rotate(o,true);break;case"href":case"title":case"target":var t=h.parentNode;if(x.call(t.tagName)!="a"){var u=bG("a");t.insertBefore(u,h);u[l](h);t=u}n=="target"&&o=="blank"?t.setAttributeNS(c.paper.xlink,"show","new"):t.setAttributeNS(c.paper.xlink,n,o);break;case"cursor":h.style.cursor=o;break;case"clip-rect":var y=r(o)[s](b);if(y[w]==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var z=bG("clipPath"),A=bG("rect");z.id=bh();bG(A,{x:y[0],y:y[1],width:y[2],height:y[3]});z[l](A);c.paper.defs[l](z);bG(h,{"clip-path":"url(#"+z.id+")"});c.clip=A}if(!o){var B=g.getElementById(h.getAttribute("clip-path")[Y](/(^url\(#|\)$)/g,p));B&&B.parentNode.removeChild(B);bG(h,{"clip-path":p});delete c.clip}break;case"path":c.type=="path"&&bG(h,{d:o?i.path=bq(o):"M0,0"});break;case"width":h[R](n,o);if(i.fx){n="x";o=i.x}else break;case"x":i.fx&&(o=-i.x-(i.width||0));case"rx":if(n=="rx"&&c.type=="rect")break;case"cx":m&&(n=="x"||n=="cx")&&(m[1]+=o-i[n]);h[R](n,o);c.pattern&&bJ(c);break;case"height":h[R](n,o);if(i.fy){n="y";o=i.y}else break;case"y":i.fy&&(o=-i.y-(i.height||0));case"ry":if(n=="ry"&&c.type=="rect")break;case"cy":m&&(n=="y"||n=="cy")&&(m[2]+=o-i[n]);h[R](n,o);c.pattern&&bJ(c);break;case"r":c.type=="rect"?bG(h,{rx:o,ry:o}):h[R](n,o);break;case"src":c.type=="image"&&h.setAttributeNS(c.paper.xlink,"href",o);break;case"stroke-width":h.style.strokeWidth=o;h[R](n,o);i["stroke-dasharray"]&&k(c,i["stroke-dasharray"]);break;case"stroke-dasharray":k(c,o);break;case"translation":var C=r(o)[s](b);C[0]=+C[0]||0;C[1]=+C[1]||0;if(m){m[1]+=C[0];m[2]+=C[1]}cz.call(c,C[0],C[1]);break;case"scale":C=r(o)[s](b);c.scale(+C[0]||1,+C[1]||+C[0]||1,isNaN(S(C[2]))?null:+C[2],isNaN(S(C[3]))?null:+C[3]);break;case I:var D=r(o).match(M);if(D){z=bG("pattern");var E=bG("image");z.id=bh();bG(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1});bG(E,{x:0,y:0});E.setAttributeNS(c.paper.xlink,"href",D[1]);z[l](E);var F=g.createElement("img");F.style.cssText="position:absolute;left:-9999em;top-9999em";F.onload=function(){bG(z,{width:this.offsetWidth,height:this.offsetHeight});bG(E,{width:this.offsetWidth,height:this.offsetHeight});g.body.removeChild(this);c.paper.safari()};g.body[l](F);F.src=D[1];c.paper.defs[l](z);h.style.fill="url(#"+z.id+")";bG(h,{fill:"url(#"+z.id+")"});c.pattern=z;c.pattern&&bJ(c);break}var G=a.getRGB(o);if(G.error)if((({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper)){i.gradient=o;i.fill="none";break}else{delete d.gradient;delete i.gradient;!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bG(h,{opacity:i.opacity});!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bG(h,{"fill-opacity":i["fill-opacity"]})}G[f]("opacity")&&bG(h,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(o);h[R](n,G.hex);n=="stroke"&&G[f]("opacity")&&bG(h,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity});break;case"gradient":(({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bG(h,{"stroke-opacity":o>1?o/100:o});case"fill-opacity":if(i.gradient){var H=g.getElementById(h.getAttribute(I)[Y](/^url\(#|\)$/g,p));if(H){var J=H.getElementsByTagName("stop");J[J[w]-1][R]("stop-opacity",o)}break}default:n=="font-size"&&(o=T(o,10)+"px");var K=n[Y](/(\-.)/g,function(a){return V.call(a.substring(1))});h.style[K]=o;h[R](n,o);break}}}bM(c,d);m?c.rotate(m.join(q)):S(j)&&c.rotate(j,true)},bL=1.2,bM=function(b,c){if(b.type!="text"||!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y")))return;var d=b.attrs,e=b.node,h=e.firstChild?T(g.defaultView.getComputedStyle(e.firstChild,p).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=r(c.text)[s]("\n");for(var j=0,k=i[w];j<k;j++)if(i[j]){var m=bG("tspan");j&&bG(m,{dy:h*bL,x:d.x});m[l](g.createTextNode(i[j]));e[l](m)}}else{i=e.getElementsByTagName("tspan");for(j=0,k=i[w];j<k;j++)j&&bG(i[j],{dy:h*bL,x:d.x})}bG(e,{y:d.y});var n=b.getBBox(),o=d.y-(n.y+n.height/2);o&&a.is(o,"finite")&&bG(e,{y:d.y+o})},bN=function(b,c){var d=0,e=0;this[0]=b;this.id=a._oid++;this.node=b;b.raphael=this;this.paper=c;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};!c.bottom&&(c.bottom=this);this.prev=c.top;c.top&&(c.top.next=this);c.top=this;this.next=null},bO=bN[e];bN[e].rotate=function(c,d,e){if(this.removed)return this;if(c==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}var f=this.getBBox();c=r(c)[s](b);if(c[w]-1){d=S(c[1]);e=S(c[2])}c=S(c[0]);d!=null&&d!==false?this._.rt.deg=c:this._.rt.deg+=c;e==null&&(d=null);this._.rt.cx=d;this._.rt.cy=e;d=d==null?f.x+f.width/2:d;e=e==null?f.y+f.height/2:e;if(this._.rt.deg){this.transformations[0]=a.format("rotate({0} {1} {2})",this._.rt.deg,d,e);this.clip&&bG(this.clip,{transform:a.format("rotate({0} {1} {2})",-this._.rt.deg,d,e)})}else{this.transformations[0]=p;this.clip&&bG(this.clip,{transform:p})}bG(this.node,{transform:this.transformations[v](q)});return this};bN[e].hide=function(){!this.removed&&(this.node.style.display="none");return this};bN[e].show=function(){!this.removed&&(this.node.style.display="");return this};bN[e].remove=function(){if(this.removed)return;bA(this,this.paper);this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=true};bN[e].getBBox=function(){if(this.removed)return this;if(this.type=="path")return bn(this.attrs.path);if(this.node.style.display=="none"){this.show();var a=true}var b={};try{b=this.node.getBBox()}catch(a){}finally{b=b||{}}if(this.type=="text"){b={x:b.x,y:Infinity,width:0,height:0};for(var c=0,d=this.node.getNumberOfChars();c<d;c++){var e=this.node.getExtentOfChar(c);e.y<b.y&&(b.y=e.y);e.y+e.height-b.y>b.height&&(b.height=e.y+e.height-b.y);e.x+e.width-b.x>b.width&&(b.width=e.x+e.width-b.x)}}a&&this.hide();return b};bN[e].attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale());d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,F)){if(b=="translation")return cz.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(c==null&&a.is(b,G)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][n](j[k]));this.attrs[k]=j[k];for(var m in l)l[f](m)&&(j[m]=l[m])}bK(this,j);return this};bN[e].toFront=function(){if(this.removed)return this;this.node.parentNode[l](this.node);var a=this.paper;a.top!=this&&bB(this,a);return this};bN[e].toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);bC(this,this.paper);var a=this.paper}return this};bN[e].insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode[l](this.node);bD(this,a,this.paper);return this};bN[e].insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b);bE(this,a,this.paper);return this};bN[e].blur=function(a){var b=this;if(+a!==0){var c=bG("filter"),d=bG("feGaussianBlur");b.attrs.blur=a;c.id=bh();bG(d,{stdDeviation:+a||1.5});c.appendChild(d);b.paper.defs.appendChild(c);b._blur=c;bG(b.node,{filter:"url(#"+c.id+")"})}else{if(b._blur){b._blur.parentNode.removeChild(b._blur);delete b._blur;delete b.attrs.blur}b.node.removeAttribute("filter")}};var bP=function(a,b,c,d){var e=bG("circle");a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"};f.type="circle";bG(e,f.attrs);return f},bQ=function(a,b,c,d,e,f){var g=bG("rect");a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"};h.type="rect";bG(g,h.attrs);return h},bR=function(a,b,c,d,e){var f=bG("ellipse");a.canvas&&a.canvas[l](f);var g=new bN(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"};g.type="ellipse";bG(f,g.attrs);return g},bS=function(a,b,c,d,e,f){var g=bG("image");bG(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"});g.setAttributeNS(a.xlink,"href",b);a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b};h.type="image";return h},bT=function(a,b,c,d){var e=bG("text");bG(e,{x:b,y:c,"text-anchor":"middle"});a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:W.font,stroke:"none",fill:"#000"};f.type="text";bK(f,f.attrs);return f},bU=function(a,b){this.width=a||this.width;this.height=b||this.height;this.canvas[R]("width",this.width);this.canvas[R]("height",this.height);return this},bV=function(){var b=by[m](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var i=bG("svg");d=d||0;e=e||0;f=f||512;h=h||342;bG(i,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:f,height:h});if(c==1){i.style.cssText="position:absolute;left:"+d+"px;top:"+e+"px";g.body[l](i)}else c.firstChild?c.insertBefore(i,c.firstChild):c[l](i);c=new j;c.width=f;c.height=h;c.canvas=i;bz.call(c,c,a.fn);c.clear();return c};k.clear=function(){var a=this.canvas;while(a.firstChild)a.removeChild(a.firstChild);this.bottom=this.top=null;(this.desc=bG("desc"))[l](g.createTextNode("Created with Raphaël"));a[l](this.desc);a[l](this.defs=bG("defs"))};k.remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a)}}if(a.vml){var bW={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},bX=/([clmz]),?([^clmz]*)/gi,bY=/ progid:\S+Blur\([^\)]+\)/g,bZ=/-?[^,\s-]+/g,b$=1000+q+1000,b_=10,ca={path:1,rect:1},cb=function(a){var b=/[ahqstv]/ig,c=bq;r(a).match(b)&&(c=bw);b=/[clmz]/g;if(c==bq&&!r(a).match(b)){var d=r(a)[Y](bX,function(a,b,c){var d=[],e=x.call(b)=="m",f=bW[b];c[Y](bZ,function(a){if(e&&d[w]==2){f+=d+bW[b=="m"?"l":"L"];d=[]}d[L](Q(a*b_))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e[w];h<i;h++){f=e[h];g=x.call(e[h][0]);g=="z"&&(g="x");for(var j=1,k=f[w];j<k;j++)g+=Q(f[j]*b_)+(j!=k-1?",":p);d[L](g)}return d[v](q)};a[H]=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};bH=function(a,b){var c=cd("group");c.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px";c.coordsize=b.coordsize;c.coordorigin=b.coordorigin;var d=cd("shape"),e=d.style;e.width=b.width+"px";e.height=b.height+"px";d.coordsize=b$;d.coordorigin=b.coordorigin;c[l](d);var f=new bN(d,c,b),g={fill:"none",stroke:"#000"};a&&(g.path=a);f.type="path";f.path=[];f.Path=p;bK(f,g);b.canvas[l](c);return f};bK=function(c,d){c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.r!=h.r)&&c.type=="rect",m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);if(k){h.path=cc(h.x,h.y,h.width,h.height,h.r);c.X=h.x;c.Y=h.y;c.W=h.width;c.H=h.height}d.href&&(e.href=d.href);d.title&&(e.title=d.title);d.target&&(e.target=d.target);d.cursor&&(i.cursor=d.cursor);"blur"in d&&c.blur(d.blur);if(d.path&&c.type=="path"||k)e.path=cb(h.path);d.rotation!=null&&c.rotate(d.rotation,true);if(d.translation){j=r(d.translation)[s](b);cz.call(c,j[0],j[1]);if(c._.rt.cx!=null){c._.rt.cx+=+j[0];c._.rt.cy+=+j[1];c.setBox(c.attrs,j[0],j[1])}}if(d.scale){j=r(d.scale)[s](b);c.scale(+j[0]||1,+j[1]||+j[0]||1,+j[2]||null,+j[3]||null)}if("clip-rect"in d){var o=r(d["clip-rect"])[s](b);if(o[w]==4){o[2]=+o[2]+ +o[0];o[3]=+o[3]+ +o[1];var q=e.clipRect||g.createElement("div"),t=q.style,u=e.parentNode;t.clip=a.format("rect({1}px {2}px {3}px {0}px)",o);if(!e.clipRect){t.position="absolute";t.top=0;t.left=0;t.width=c.paper.width+"px";t.height=c.paper.height+"px";u.parentNode.insertBefore(q,u);q[l](u);e.clipRect=q}}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=p)}c.type=="image"&&d.src&&(e.src=d.src);if(c.type=="image"&&d.opacity){e.filterOpacity=U+".Alpha(opacity="+d.opacity*100+")";i.filter=(e.filterMatrix||p)+(e.filterOpacity||p)}d.font&&(i.font=d.font);d["font-family"]&&(i.fontFamily="\""+d["font-family"][s](",")[0][Y](/^['"]+|['"]+$/g,p)+"\"");d["font-size"]&&(i.fontSize=d["font-size"]);d["font-weight"]&&(i.fontWeight=d["font-weight"]);d["font-style"]&&(i.fontStyle=d["font-style"]);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){e=c.shape||e;var v=e.getElementsByTagName(I)&&e.getElementsByTagName(I)[0],x=false;!v&&(x=v=cd(I));if("fill-opacity"in d||"opacity"in d){var y=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);y=A(z(y,0),1);v.opacity=y}d.fill&&(v.on=true);if(v.on==null||d.fill=="none")v.on=false;if(v.on&&d.fill){var B=d.fill.match(M);if(B){v.src=B[1];v.type="tile"}else{v.color=a.getRGB(d.fill).hex;v.src=p;v.type="solid";if(a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||r(d.fill).charAt()!="r")&&bI(m,d.fill)){h.fill="none";h.gradient=d.fill}}}x&&e[l](v);var C=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],D=false;!C&&(D=C=cd("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])C.on=true;(d.stroke=="none"||C.on==null||d.stroke==0||d["stroke-width"]==0)&&(C.on=false);var E=a.getRGB(d.stroke);C.on&&d.stroke&&(C.color=E.hex);y=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+E.o+1||2)-1);var F=(S(d["stroke-width"])||1)*0.75;y=A(z(y,0),1);d["stroke-width"]==null&&(F=h["stroke-width"]);d["stroke-width"]&&(C.weight=F);F&&F<1&&(y*=F)&&(C.weight=1);C.opacity=y;d["stroke-linejoin"]&&(C.joinstyle=d["stroke-linejoin"]||"miter");C.miterlimit=d["stroke-miterlimit"]||8;d["stroke-linecap"]&&(C.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var G={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};C.dashstyle=G[f](d["stroke-dasharray"])?G[d["stroke-dasharray"]]:p}D&&e[l](C)}if(m.type=="text"){i=m.paper.span.style;h.font&&(i.font=h.font);h["font-family"]&&(i.fontFamily=h["font-family"]);h["font-size"]&&(i.fontSize=h["font-size"]);h["font-weight"]&&(i.fontWeight=h["font-weight"]);h["font-style"]&&(i.fontStyle=h["font-style"]);m.node.string&&(m.paper.span.innerHTML=r(m.node.string)[Y](/</g,"<")[Y](/&/g,"&")[Y](/\n/g,"<br>"));m.W=h.w=m.paper.span.offsetWidth;m.H=h.h=m.paper.span.offsetHeight;m.X=h.x;m.Y=h.y+Q(m.H/2);switch(h["text-anchor"]){case"start":m.node.style["v-text-align"]="left";m.bbx=Q(m.W/2);break;case"end":m.node.style["v-text-align"]="right";m.bbx=-Q(m.W/2);break;default:m.node.style["v-text-align"]="center";break}}};bI=function(a,b){a.attrs=a.attrs||{};var c=a.attrs,d,e="linear",f=".5 .5";a.attrs.gradient=b;b=r(b)[Y](bd,function(a,b,c){e="radial";if(b&&c){b=S(b);c=S(c);C(b-0.5,2)+C(c-0.5,2)>0.25&&(c=y.sqrt(0.25-C(b-0.5,2))*((c>0.5)*2-1)+0.5);f=b+q+c}return p});b=b[s](/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-S(g);if(isNaN(g))return null}var h=bx(b);if(!h)return null;a=a.shape||a.node;d=a.getElementsByTagName(I)[0]||cd(I);!d.parentNode&&a.appendChild(d);if(h[w]){d.on=true;d.method="none";d.color=h[0].color;d.color2=h[h[w]-1].color;var i=[];for(var j=0,k=h[w];j<k;j++)h[j].offset&&i[L](h[j].offset+q+h[j].color);d.colors&&(d.colors.value=i[w]?i[v]():"0% "+d.color);if(e=="radial"){d.type="gradientradial";d.focus="100%";d.focussize=f;d.focusposition=f}else{d.type="gradient";d.angle=(270-g)%360}}return 1};bN=function(b,c,d){var e=0,f=0,g=0,h=1;this[0]=b;this.id=a._oid++;this.node=b;b.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=c;this.paper=d;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};!d.bottom&&(d.bottom=this);this.prev=d.top;d.top&&(d.top.next=this);d.top=this;this.next=null};bO=bN[e];bO.rotate=function(a,c,d){if(this.removed)return this;if(a==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}a=r(a)[s](b);if(a[w]-1){c=S(a[1]);d=S(a[2])}a=S(a[0]);c!=null?this._.rt.deg=a:this._.rt.deg+=a;d==null&&(c=null);this._.rt.cx=c;this._.rt.cy=d;this.setBox(this.attrs,c,d);this.Group.style.rotation=this._.rt.deg;return this};bO.setBox=function(a,b,c){if(this.removed)return this;var d=this.Group.style,e=this.shape&&this.shape.style||this.node.style;a=a||{};for(var g in a)a[f](g)&&(this.attrs[g]=a[g]);b=b||this._.rt.cx;c=c||this._.rt.cy;var h=this.attrs,i,j,k,l;switch(this.type){case"circle":i=h.cx-h.r;j=h.cy-h.r;k=l=h.r*2;break;case"ellipse":i=h.cx-h.rx;j=h.cy-h.ry;k=h.rx*2;l=h.ry*2;break;case"image":i=+h.x;j=+h.y;k=h.width||0;l=h.height||0;break;case"text":this.textpath.v=["m",Q(h.x),", ",Q(h.y-2),"l",Q(h.x)+1,", ",Q(h.y-2)][v](p);i=h.x-Q(this.W/2);j=h.y-this.H/2;k=this.W;l=this.H;break;case"rect":case"path":if(this.attrs.path){var m=bn(this.attrs.path);i=m.x;j=m.y;k=m.width;l=m.height}else{i=0;j=0;k=this.paper.width;l=this.paper.height}break;default:i=0;j=0;k=this.paper.width;l=this.paper.height;break}b=b==null?i+k/2:b;c=c==null?j+l/2:c;var n=b-this.paper.width/2,o=c-this.paper.height/2,q;d.left!=(q=n+"px")&&(d.left=q);d.top!=(q=o+"px")&&(d.top=q);this.X=ca[f](this.type)?-n:i;this.Y=ca[f](this.type)?-o:j;this.W=k;this.H=l;if(ca[f](this.type)){e.left!=(q=-n*b_+"px")&&(e.left=q);e.top!=(q=-o*b_+"px")&&(e.top=q)}else if(this.type=="text"){e.left!=(q=-n+"px")&&(e.left=q);e.top!=(q=-o+"px")&&(e.top=q)}else{d.width!=(q=this.paper.width+"px")&&(d.width=q);d.height!=(q=this.paper.height+"px")&&(d.height=q);e.left!=(q=i-n+"px")&&(e.left=q);e.top!=(q=j-o+"px")&&(e.top=q);e.width!=(q=k+"px")&&(e.width=q);e.height!=(q=l+"px")&&(e.height=q)}};bO.hide=function(){!this.removed&&(this.Group.style.display="none");return this};bO.show=function(){!this.removed&&(this.Group.style.display="block");return this};bO.getBBox=function(){if(this.removed)return this;if(ca[f](this.type))return bn(this.attrs.path);return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H}};bO.remove=function(){if(this.removed)return;bA(this,this.paper);this.node.parentNode.removeChild(this.node);this.Group.parentNode.removeChild(this.Group);this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=true};bO.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale());d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b=="translation")return cz.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(this.attrs&&c==null&&a.is(b,G)){var g,h={};for(e=0,g=b[w];e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;if(c!=null){i={};i[b]=c}c==null&&a.is(b,"object")&&(i=b);if(i){for(var j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][n](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.node.string=i.text);bK(this,i);i.gradient&&(({circle:1,ellipse:1})[f](this.type)||r(i.gradient).charAt()!="r")&&bI(this,i.gradient);(!ca[f](this.type)||this._.rt.deg)&&this.setBox(this.attrs)}return this};bO.toFront=function(){!this.removed&&this.Group.parentNode[l](this.Group);this.paper.top!=this&&bB(this,this.paper);return this};bO.toBack=function(){if(this.removed)return this;if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);bC(this,this.paper)}return this};bO.insertAfter=function(a){if(this.removed)return this;a.constructor==cC&&(a=a[a.length-1]);a.Group.nextSibling?a.Group.parentNode.insertBefore(this.Group,a.Group.nextSibling):a.Group.parentNode[l](this.Group);bD(this,a,this.paper);return this};bO.insertBefore=function(a){if(this.removed)return this;a.constructor==cC&&(a=a[0]);a.Group.parentNode.insertBefore(this.Group,a.Group);bE(this,a,this.paper);return this};bO.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(bY,p);if(+b!==0){this.attrs.blur=b;c.filter=d+q+U+".Blur(pixelradius="+(+b||1.5)+")";c.margin=a.format("-{0}px 0 0 -{0}px",Q(+b||1.5))}else{c.filter=d;c.margin=0;delete this.attrs.blur}};bP=function(a,b,c,d){var e=cd("group"),f=cd("oval"),g=f.style;e.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";e.coordsize=b$;e.coordorigin=a.coordorigin;e[l](f);var h=new bN(f,e,a);h.type="circle";bK(h,{stroke:"#000",fill:"none"});h.attrs.cx=b;h.attrs.cy=c;h.attrs.r=d;h.setBox({x:b-d,y:c-d,width:d*2,height:d*2});a.canvas[l](e);return h};function cc(b,c,d,e,f){return f?a.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z",b+f,c,d-f*2,f,-f,e-f*2,f*2-d,f*2-e):a.format("M{0},{1}l{2},0,0,{3},{4},0z",b,c,d,e,-d)}bQ=function(a,b,c,d,e,f){var g=cc(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b;h.Y=i.y=c;h.W=i.width=d;h.H=i.height=e;i.r=f;i.path=g;h.type="rect";return h};bR=function(a,b,c,d,e){var f=cd("group"),g=cd("oval"),h=g.style;f.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";f.coordsize=b$;f.coordorigin=a.coordorigin;f[l](g);var i=new bN(g,f,a);i.type="ellipse";bK(i,{stroke:"#000"});i.attrs.cx=b;i.attrs.cy=c;i.attrs.rx=d;i.attrs.ry=e;i.setBox({x:b-d,y:c-e,width:d*2,height:e*2});a.canvas[l](f);return i};bS=function(a,b,c,d,e,f){var g=cd("group"),h=cd("image");g.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";g.coordsize=b$;g.coordorigin=a.coordorigin;h.src=b;g[l](h);var i=new bN(h,g,a);i.type="image";i.attrs.src=b;i.attrs.x=c;i.attrs.y=d;i.attrs.w=e;i.attrs.h=f;i.setBox({x:c,y:d,width:e,height:f});a.canvas[l](g);return i};bT=function(b,c,d,e){var f=cd("group"),g=cd("shape"),h=g.style,i=cd("path"),j=i.style,k=cd("textpath");f.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px";f.coordsize=b$;f.coordorigin=b.coordorigin;i.v=a.format("m{0},{1}l{2},{1}",Q(c*10),Q(d*10),Q(c*10)+1);i.textpathok=true;h.width=b.width;h.height=b.height;k.string=r(e);k.on=true;g[l](k);g[l](i);f[l](g);var m=new bN(k,f,b);m.shape=g;m.textpath=i;m.type="text";m.attrs.text=e;m.attrs.x=c;m.attrs.y=d;m.attrs.w=1;m.attrs.h=1;bK(m,{font:W.font,stroke:"none",fill:"#000"});m.setBox();b.canvas[l](f);return m};bU=function(a,b){var c=this.canvas.style;a==+a&&(a+="px");b==+b&&(b+="px");c.width=a;c.height=b;c.clip="rect(0 "+a+" "+b+" 0)";return this};var cd;g.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!g.namespaces.rvml&&g.namespaces.add("rvml","urn:schemas-microsoft-com:vml");cd=function(a){return g.createElement("<rvml:"+a+" class=\"rvml\">")}}catch(a){cd=function(a){return g.createElement("<"+a+" xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">")}}bV=function(){var b=by[m](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,i=b.y;if(!c)throw new Error("VML container not found.");var k=new j,n=k.canvas=g.createElement("div"),o=n.style;h=h||0;i=i||0;f=f||512;d=d||342;f==+f&&(f+="px");d==+d&&(d+="px");k.width=1000;k.height=1000;k.coordsize=b_*1000+q+b_*1000;k.coordorigin="0 0";k.span=g.createElement("span");k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";n[l](k.span);o.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d);if(c==1){g.body[l](n);o.left=h+"px";o.top=i+"px";o.position="absolute"}else c.firstChild?c.insertBefore(n,c.firstChild):c[l](n);bz.call(k,k,a.fn);return k};k.clear=function(){this.canvas.innerHTML=p;this.span=g.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[l](this.span);this.bottom=this.top=null};k.remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a);return true}}var ce=navigator.userAgent.match(/Version\\x2f(.*?)\s/);navigator.vendor=="Apple Computer, Inc."&&(ce&&ce[1]<4||navigator.platform.slice(0,2)=="iP")?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});h.setTimeout(function(){a.remove()})}:k.safari=function(){};var cf=function(){this.returnValue=false},cg=function(){return this.originalEvent.preventDefault()},ch=function(){this.cancelBubble=true},ci=function(){return this.originalEvent.stopPropagation()},cj=(function(){{if(g.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,g=function(e){if(o&&u[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++){if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g];e.originalEvent=i;e.preventDefault=cg;e.stopPropagation=ci;break}}return c.call(d,e)};a.addEventListener(e,g,false);return function(){a.removeEventListener(e,g,false);return true}};if(g.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.event;a.preventDefault=a.preventDefault||cf;a.stopPropagation=a.stopPropagation||ch;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return true};return f}}})(),ck=[],cl=function(a){var b=a.clientX,c=a.clientY,d=g.documentElement.scrollTop||g.body.scrollTop,e=g.documentElement.scrollLeft||g.body.scrollLeft,f,h=ck.length;while(h--){f=ck[h];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX;c=j.clientY;(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();b+=e;c+=d;f.move&&f.move.call(f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cm=function(b){a.unmousemove(cl).unmouseup(cm);var c=ck.length,d;while(c--){d=ck[c];d.el._drag={};d.end&&d.end.call(d.end_scope||d.start_scope||d.move_scope||d.el,b)}ck=[]};for(var cn=t[w];cn--;)(function(b){a[b]=bN[e][b]=function(c,d){if(a.is(c,"function")){this.events=this.events||[];this.events.push({name:b,f:c,unbind:cj(this.shape||this.node||g,b,c,d||this)})}return this};a["un"+b]=bN[e]["un"+b]=function(a){var c=this.events,d=c[w];while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind();c.splice(d,1);!c.length&&delete this.events;return this}return this}})(t[cn]);bO.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)};bO.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};bO.drag=function(b,c,d,e,f,h){this._drag={};this.mousedown(function(i){(i.originalEvent||i).preventDefault();var j=g.documentElement.scrollTop||g.body.scrollTop,k=g.documentElement.scrollLeft||g.body.scrollLeft;this._drag.x=i.clientX+k;this._drag.y=i.clientY+j;this._drag.id=i.identifier;c&&c.call(f||e||this,i.clientX+k,i.clientY+j,i);!ck.length&&a.mousemove(cl).mouseup(cm);ck.push({el:this,move:b,end:d,move_scope:e,start_scope:f,end_scope:h})});return this};bO.undrag=function(b,c,d){var e=ck.length;while(e--)ck[e].el==this&&(ck[e].move==b&&ck[e].end==d)&&ck.splice(e++,1);!ck.length&&a.unmousemove(cl).unmouseup(cm)};k.circle=function(a,b,c){return bP(this,a||0,b||0,c||0)};k.rect=function(a,b,c,d,e){return bQ(this,a||0,b||0,c||0,d||0,e||0)};k.ellipse=function(a,b,c,d){return bR(this,a||0,b||0,c||0,d||0)};k.path=function(b){b&&!a.is(b,F)&&!a.is(b[0],G)&&(b+=p);return bH(a.format[m](a,arguments),this)};k.image=function(a,b,c,d,e){return bS(this,a||"about:blank",b||0,c||0,d||0,e||0)};k.text=function(a,b,c){return bT(this,a||0,b||0,r(c))};k.set=function(a){arguments[w]>1&&(a=Array[e].splice.call(arguments,0,arguments[w]));return new cC(a)};k.setSize=bU;k.top=k.bottom=null;k.raphael=a;function co(){return this.x+q+this.y}bO.resetScale=function(){if(this.removed)return this;this._.sx=1;this._.sy=1;this.attrs.scale="1 1"};bO.scale=function(a,b,c,d){if(this.removed)return this;if(a==null&&b==null)return{x:this._.sx,y:this._.sy,toString:co};b=b||a;!(+b)&&(b=a);var e,f,g,h,i=this.attrs;if(a!=0){var j=this.getBBox(),k=j.x+j.width/2,l=j.y+j.height/2,m=B(a/this._.sx),o=B(b/this._.sy);c=+c||c==0?c:k;d=+d||d==0?d:l;var r=this._.sx>0,s=this._.sy>0,t=~(~(a/B(a))),u=~(~(b/B(b))),x=m*t,y=o*u,z=this.node.style,A=c+B(k-c)*x*(k>c==r?1:-1),C=d+B(l-d)*y*(l>d==s?1:-1),D=a*t>b*u?o:m;switch(this.type){case"rect":case"image":var E=i.width*m,F=i.height*o;this.attr({height:F,r:i.r*D,width:E,x:A-E/2,y:C-F/2});break;case"circle":case"ellipse":this.attr({rx:i.rx*m,ry:i.ry*o,r:i.r*D,cx:A,cy:C});break;case"text":this.attr({x:A,y:C});break;case"path":var G=bp(i.path),H=true,I=r?x:m,J=s?y:o;for(var K=0,L=G[w];K<L;K++){var M=G[K],N=V.call(M[0]);{if(N=="M"&&H)continue;H=false}if(N=="A"){M[G[K][w]-2]*=I;M[G[K][w]-1]*=J;M[1]*=m;M[2]*=o;M[5]=+(t+u?!(!(+M[5])):!(+M[5]))}else if(N=="H")for(var O=1,P=M[w];O<P;O++)M[O]*=I;else if(N=="V")for(O=1,P=M[w];O<P;O++)M[O]*=J;else for(O=1,P=M[w];O<P;O++)M[O]*=O%2?I:J}var Q=bn(G);e=A-Q.x-Q.width/2;f=C-Q.y-Q.height/2;G[0][1]+=e;G[0][2]+=f;this.attr({path:G});break}if(this.type in{text:1,image:1}&&(t!=1||u!=1))if(this.transformations){this.transformations[2]="scale("[n](t,",",u,")");this.node[R]("transform",this.transformations[v](q));e=t==-1?-i.x-(E||0):i.x;f=u==-1?-i.y-(F||0):i.y;this.attr({x:e,y:f});i.fx=t-1;i.fy=u-1}else{this.node.filterMatrix=U+".Matrix(M11="[n](t,", M12=0, M21=0, M22=",u,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)}else if(this.transformations){this.transformations[2]=p;this.node[R]("transform",this.transformations[v](q));i.fx=0;i.fy=0}else{this.node.filterMatrix=p;z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)}i.scale=[a,b,c,d][v](q);this._.sx=a;this._.sy=b}return this};bO.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale;delete a.translation;return this.paper[this.type]().attr(a)};var cp={},cq=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cp[m],o,p;!n&&(cp[m]=n={data:[]});n.timer&&clearTimeout(n.timer);n.timer=setTimeout(function(){delete cp[m]},2000);if(j!=null){var q=cq(b,c,d,e,f,g,h,i);l=~(~q)*10}for(var r=0;r<l+1;r++){if(n.data[j]>r)p=n.data[r*l];else{p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l);n.data[r]=p}r&&(k+=C(C(o.x-p.x,2)+C(o.y-p.y,2),0.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cr=function(b,c){return function(d,e,f){d=bw(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M"){g=+i[1];h=+i[2]}else{j=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);k+=["C",m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k;k=["M",m.x,m.y+"C",m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]][v]();n+=j;g=+i[5];h=+i[6];continue}if(!b&&!c){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j;g=+i[5];h=+i[6]}k+=i}l.end=k;m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1);m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cs=cr(1),ct=cr(),cu=cr(0,1);bO.getTotalLength=function(){if(this.type!="path")return;if(this.node.getTotalLength)return this.node.getTotalLength();return cs(this.attrs.path)};bO.getPointAtLength=function(a){if(this.type!="path")return;return ct(this.attrs.path,a)};bO.getSubpath=function(a,b){if(this.type!="path")return;if(B(this.getTotalLength()-b)<"1e-6")return cu(this.attrs.path,a).end;var c=cu(this.attrs.path,b,1);return a?cu(c,a).end:c};a.easing_formulas={linear:function(a){return a},"<":function(a){return C(a,3)},">":function(a){return C(a-1,3)+1},"<>":function(a){a=a*2;if(a<1)return C(a,3)/2;a-=2;return(C(a,3)+2)/2},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==0||a==1)return a;var b=0.3,c=b/4;return C(2,-10*a)*y.sin((a-c)*(2*D)/b)+1},bounce:function(a){var b=7.5625,c=2.75,d;if(a<1/c)d=b*a*a;else if(a<2/c){a-=1.5/c;d=b*a*a+0.75}else if(a<2.5/c){a-=2.25/c;d=b*a*a+0.9375}else{a-=2.625/c;d=b*a*a+0.984375}return d}};var cv=[],cw=function(){var b=+(new Date);for(var c=0;c<cv[w];c++){var d=cv[c];if(d.stop||d.el.removed)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;if(e<g){var r=h(e/g);for(var s in i)if(i[f](s)){switch(X[s]){case"along":o=r*g*j[s];k.back&&(o=k.len-o);var t=ct(k[s],o);m.translate(j.sx-j.x||0,j.sy-j.y||0);j.x=t.x;j.y=t.y;m.translate(t.x-j.sx,t.y-j.sy);k.rot&&m.rotate(j.r+t.alpha,t.x,t.y);break;case E:o=+i[s]+r*g*j[s];break;case"colour":o="rgb("+[cy(Q(i[s].r+r*g*j[s].r)),cy(Q(i[s].g+r*g*j[s].g)),cy(Q(i[s].b+r*g*j[s].b))][v](",")+")";break;case"path":o=[];for(var u=0,x=i[s][w];u<x;u++){o[u]=[i[s][u][0]];for(var y=1,z=i[s][u][w];y<z;y++)o[u][y]=+i[s][u][y]+r*g*j[s][u][y];o[u]=o[u][v](q)}o=o[v](q);break;case"csv":switch(s){case"translation":var A=r*g*j[s][0]-l.x,B=r*g*j[s][1]-l.y;l.x+=A;l.y+=B;o=A+q+B;break;case"rotation":o=+i[s][0]+r*g*j[s][0];i[s][1]&&(o+=","+i[s][1]+","+i[s][2]);break;case"scale":o=[+i[s][0]+r*g*j[s][0],+i[s][1]+r*g*j[s][1],2 in k[s]?k[s][2]:p,3 in k[s]?k[s][3]:p][v](q);break;case"clip-rect":o=[];u=4;while(u--)o[u]=+i[s][u]+r*g*j[s][u];break}break;default:var C=[].concat(i[s]);o=[];u=m.paper.customAttributes[s].length;while(u--)o[u]=+C[u]+r*g*j[s][u];break}n[s]=o}m.attr(n);m._run&&m._run.call(m)}else{if(k.along){t=ct(k.along,k.len*!k.back);m.translate(j.sx-(j.x||0)+t.x-j.sx,j.sy-(j.y||0)+t.y-j.sy);k.rot&&m.rotate(j.r+t.alpha,t.x,t.y)}(l.x||l.y)&&m.translate(-l.x,-l.y);k.scale&&(k.scale+=p);m.attr(k);cv.splice(c--,1)}}a.svg&&m&&m.paper&&m.paper.safari();cv[w]&&setTimeout(cw)},cx=function(b,c,d,e,f){var g=d-e;c.timeouts.push(setTimeout(function(){a.is(f,"function")&&f.call(c);c.animate(b,g,b.easing)},e))},cy=function(a){return z(A(a,255),0)},cz=function(a,b){if(a==null)return{x:this._.tx,y:this._.ty,toString:co};this._.tx+=+a;this._.ty+=+b;switch(this.type){case"circle":case"ellipse":this.attr({cx:+a+this.attrs.cx,cy:+b+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+a+this.attrs.x,y:+b+this.attrs.y});break;case"path":var c=bp(this.attrs.path);c[0][1]+=+a;c[0][2]+=+b;this.attr({path:c});break}return this};bO.animateWith=function(a,b,c,d,e){for(var f=0,g=cv.length;f<g;f++)cv[f].el.id==a.id&&(b.start=cv[f].start);return this.animate(b,c,d,e)};bO.animateAlong=cA();bO.animateAlongBack=cA(1);function cA(b){return function(c,d,e,f){var g={back:b};a.is(e,"function")?f=e:g.rot=e;c&&c.constructor==bN&&(c=c.attrs.path);c&&(g.along=c);return this.animate(g,d,f)}}function cB(a,b,c,d,e,f){var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;function m(a){return((i*a+h)*a+g)*a}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(B(f)<b)return e;j=(3*i*e+2*h)*e+g;if(B(j)<0.000001)break;e=e-f/j}c=0;d=1;e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(B(f-a)<b)return e;a>f?c=e:d=e;e=(d-c)/2+c}return e}return n(a,1/(200*f))}bO.onAnimation=function(a){this._run=a||0;return this};bO.animate=function(c,d,e,g){var h=this;h.timeouts=h.timeouts||[];if(a.is(e,"function")||!e)g=e||null;if(h.removed){g&&g.call(h);return h}var i={},j={},k=false,l={};for(var m in c)if(c[f](m)){if(X[f](m)||h.paper.customAttributes[f](m)){k=true;i[m]=h.attr(m);i[m]==null&&(i[m]=W[m]);j[m]=c[m];switch(X[m]){case"along":var n=cs(c[m]),o=ct(c[m],n*!(!c.back)),p=h.getBBox();l[m]=n/d;l.tx=p.x;l.ty=p.y;l.sx=o.x;l.sy=o.y;j.rot=c.rot;j.back=c.back;j.len=n;c.rot&&(l.r=S(h.rotate())||0);break;case E:l[m]=(j[m]-i[m])/d;break;case"colour":i[m]=a.getRGB(i[m]);var q=a.getRGB(j[m]);l[m]={r:(q.r-i[m].r)/d,g:(q.g-i[m].g)/d,b:(q.b-i[m].b)/d};break;case"path":var t=bw(i[m],j[m]);i[m]=t[0];var u=t[1];l[m]=[];for(var v=0,x=i[m][w];v<x;v++){l[m][v]=[0];for(var y=1,z=i[m][v][w];y<z;y++)l[m][v][y]=(u[v][y]-i[m][v][y])/d}break;case"csv":var A=r(c[m])[s](b),B=r(i[m])[s](b);switch(m){case"translation":i[m]=[0,0];l[m]=[A[0]/d,A[1]/d];break;case"rotation":i[m]=B[1]==A[1]&&B[2]==A[2]?B:[0,A[1],A[2]];l[m]=[(A[0]-i[m][0])/d,0,0];break;case"scale":c[m]=A;i[m]=r(i[m])[s](b);l[m]=[(A[0]-i[m][0])/d,(A[1]-i[m][1])/d,0,0];break;case"clip-rect":i[m]=r(i[m])[s](b);l[m]=[];v=4;while(v--)l[m][v]=(A[v]-i[m][v])/d;break}j[m]=A;break;default:A=[].concat(c[m]);B=[].concat(i[m]);l[m]=[];v=h.paper.customAttributes[m][w];while(v--)l[m][v]=((A[v]||0)-(B[v]||0))/d;break}}}if(k){var G=a.easing_formulas[e];if(!G){G=r(e).match(P);if(G&&G[w]==5){var H=G;G=function(a){return cB(a,+H[1],+H[2],+H[3],+H[4],d)}}else G=function(a){return a}}cv.push({start:c.start||+(new Date),ms:d,easing:G,from:i,diff:l,to:j,el:h,t:{x:0,y:0}});a.is(g,"function")&&(h._ac=setTimeout(function(){g.call(h)},d));cv[w]==1&&setTimeout(cw)}else{var C=[],D;for(var F in c)if(c[f](F)&&Z.test(F)){m={value:c[F]};F=="from"&&(F=0);F=="to"&&(F=100);m.key=T(F,10);C.push(m)}C.sort(be);C[0].key&&C.unshift({key:0,value:h.attrs});for(v=0,x=C[w];v<x;v++)cx(C[v].value,h,d/100*C[v].key,d/100*(C[v-1]&&C[v-1].key||0),C[v-1]&&C[v-1].value.callback);D=C[C[w]-1].value.callback;D&&h.timeouts.push(setTimeout(function(){D.call(h)},d))}return this};bO.stop=function(){for(var a=0;a<cv.length;a++)cv[a].el.id==this.id&&cv.splice(a--,1);for(a=0,ii=this.timeouts&&this.timeouts.length;a<ii;a++)clearTimeout(this.timeouts[a]);this.timeouts=[];clearTimeout(this._ac);delete this._ac;return this};bO.translate=function(a,b){return this.attr({translation:a+" "+b})};bO[H]=function(){return"Raphaël’s object"};a.ae=cv;var cC=function(a){this.items=[];this[w]=0;this.type="set";if(a)for(var b=0,c=a[w];b<c;b++){if(a[b]&&(a[b].constructor==bN||a[b].constructor==cC)){this[this.items[w]]=this.items[this.items[w]]=a[b];this[w]++}}};cC[e][L]=function(){var a,b;for(var c=0,d=arguments[w];c<d;c++){a=arguments[c];if(a&&(a.constructor==bN||a.constructor==cC)){b=this.items[w];this[b]=this.items[b]=a;this[w]++}}return this};cC[e].pop=function(){delete this[this[w]--];return this.items.pop()};for(var cD in bO)bO[f](cD)&&(cC[e][cD]=(function(a){return function(){for(var b=0,c=this.items[w];b<c;b++)this.items[b][a][m](this.items[b],arguments);return this}})(cD));cC[e].attr=function(b,c){if(b&&a.is(b,G)&&a.is(b[0],"object"))for(var d=0,e=b[w];d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items[w];f<g;f++)this.items[f].attr(b,c);return this};cC[e].animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items[w],g=f,h,i=this,j;e&&(j=function(){!(--f)&&e.call(i)});d=a.is(d,F)?d:j;h=this.items[--g].animate(b,c,d,j);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,b,c,d,j);return this};cC[e].insertAfter=function(a){var b=this.items[w];while(b--)this.items[b].insertAfter(a);return this};cC[e].getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items[w];e--;){var f=this.items[e].getBBox();a[L](f.x);b[L](f.y);c[L](f.x+f.width);d[L](f.y+f.height)}a=A[m](0,a);b=A[m](0,b);return{x:a,y:b,width:z[m](0,c)-a,height:z[m](0,d)-b}};cC[e].clone=function(a){a=new cC;for(var b=0,c=this.items[w];b<c;b++)a[L](this.items[b].clone());return a};a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c][L](b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=T(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d[Y](/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a};k.getFont=function(b,c,d,e){e=e||"normal";d=d||"normal";c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!a.fonts)return;var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b[Y](/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)){if(h.test(i)){g=a.fonts[i];break}}}var j;if(g)for(var k=0,l=g[w];k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j};k.print=function(c,d,e,f,g,h,i){h=h||"middle";i=z(A(i||0,1),-1);var j=this.set(),k=r(e)[s](p),l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox.split(b),q=+o[0],t=+o[1]+(h=="baseline"?o[3]-o[1]+ +f.face.descent:(o[3]-o[1])/2);for(var u=0,v=k[w];u<v;u++){var x=u&&f.glyphs[k[u-1]]||{},y=f.glyphs[k[u]];l+=u?(x.w||f.w)+(x.k&&x.k[k[u]]||0)+f.w*i:0;y&&y.d&&j[L](this.path(y.d).attr({fill:"#000",stroke:"none",translation:[l,0]}))}j.scale(n,n,q,t).translate(c-q,d-t)}return j};a.format=function(b,c){var e=a.is(c,G)?[0][n](c):arguments;b&&a.is(b,F)&&e[w]-1&&(b=b[Y](d,function(a,b){return e[++b]==null?p:e[b]}));return b||p};a.ninja=function(){i.was?h.Raphael=i.is:delete Raphael;return a};a.el=bO;a.st=cC[e];i.was?h.Raphael=a:Raphael=a})();
  2121. exports = Raphael;;
  2122. return exports;
  2123. });
  2124. /**
  2125. * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\sound.js
  2126. */
  2127. define("scripts/lib/sound.js", function(exports){
  2128. /**
  2129. * 简易声效控制
  2130. */
  2131. /**
  2132. * 使用方法:
  2133. *
  2134. * var sound = require("scripts/lib/sound/main");
  2135. *
  2136. * var snd = sound.create("sounds/myfile");
  2137. * snd.play();
  2138. */
  2139. var buzz = require("scripts/lib/buzz");
  2140. var supported = buzz.isSupported();
  2141. var config = {
  2142. formats: [ "ogg", "mp3" ],
  2143. preload: true,
  2144. autoload: true,
  2145. loop: false
  2146. };
  2147. function ClassBuzz( src ){
  2148. this.sound = new buzz.sound( src, config );
  2149. }
  2150. ClassBuzz.prototype.play = function( s ){
  2151. s = this.sound;
  2152. s.setPercent( 0 );
  2153. s.setVolume( 100 );
  2154. s.play();
  2155. };
  2156. ClassBuzz.prototype.stop = function(){
  2157. this.sound.fadeOut( 1e3, function(){
  2158. this.pause();
  2159. } );
  2160. };
  2161. exports.create = function( src ){
  2162. if( !supported )
  2163. return unSupported;
  2164. else
  2165. return new ClassBuzz( src );
  2166. }
  2167. function unSupported(){
  2168. // TODO:
  2169. }
  2170. unSupported.play =
  2171. unSupported.stop = function(){
  2172. // TODO:
  2173. };;
  2174. return exports;
  2175. });
  2176. /**
  2177. * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\tween.js
  2178. */
  2179. define("scripts/lib/tween.js", function(exports){
  2180. exports.exponential = function(){};
  2181. exports.exponential.co = function(index, offset, target, framesNum){ return (index == framesNum) ? offset + target : target * (-Math.pow(2, -10 * index / framesNum) + 1) + offset; };
  2182. // exports.exponential.ci = function(index, offset, target, framesNum){ return (index == 0) ? offset : target * Math.pow(2, 10 * (index / framesNum - 1)) + offset; }
  2183. exports.bounce = function(){};
  2184. exports.bounce.co = function(index, offset, target, framesNum){ if((index /= framesNum) < (1 / 2.75)) return target * (7.5625 * index * index) + offset; else if(index < (2 / 2.75)) return target * (7.5625 * (index -= (1.5 / 2.75)) * index + .75) + offset; else if(index < (2.5 / 2.75)) return target * (7.5625 * (index -= (2.25 / 2.75)) * index + .9375) + offset; else return target * (7.5625 * (index -= (2.625 / 2.75)) * index + .984375) + offset; };
  2185. exports.quadratic = function(){};
  2186. exports.quadratic.ci = function(index, offset, target, framesNum){ return target * (index /= framesNum) * index + offset; };
  2187. exports.quadratic.co = function(index, offset, target, framesNum){ return - target * (index /= framesNum) * (index - 2) + offset; }
  2188. exports.quadratic.cio = function(index, offset, target, framesNum){ if((index /= framesNum / 2) < 1) return target / 2 * index * index + offset; else return - target / 2 * ((-- index) * (index - 2) - 1) + offset; };
  2189. exports.circular = function(index, offset, target, framesNum){ if((index /= framesNum / 2) < 1) return - target / 2 * (Math.sqrt(1 - index * index) - 1) + offset; else return target / 2 * (Math.sqrt(1 - (index -= 2) * index) + 1) + offset; }
  2190. exports.linear = function(index, offset, target, framesNum){ return target * index / framesNum + offset; };
  2191. exports.back = function(){};
  2192. exports.back.ci = function(index, offset, target, framesNum, s){ s = 1.70158; return target * (index /= framesNum) * index * ((s + 1) * index - s) + offset; };
  2193. exports.back.co = function(index, offset, target, framesNum, s){ s = 1.70158; return target * ((index = index / framesNum - 1) * index * ((s + 1) * index + s) + 1) + offset; };;
  2194. return exports;
  2195. });
  2196. /**
  2197. * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\ucren.js
  2198. */
  2199. define("scripts/lib/ucren.js", function(exports){
  2200. /**
  2201. * ucren-lite
  2202. * filename: boot.js
  2203. * author: dron
  2204. * version: 5.0.2.20120628
  2205. * date: 2009-03-15
  2206. * contact: ucren.com
  2207. */
  2208. var Ucren;
  2209. var blankArray = [];
  2210. var slice = blankArray.slice;
  2211. var join = blankArray.join;
  2212. //
  2213. // [基本数据类型扩展]
  2214. //
  2215. // String.prototype.trim
  2216. if( !String.prototype.trim )
  2217. String.prototype.trim = function(){
  2218. return this.replace( /^\s+|\s+$/, "" );
  2219. };
  2220. // String.prototype.format
  2221. String.prototype.format = function( conf ){
  2222. var rtn = this, blank = {};
  2223. Ucren.each( conf, function( item, key ){
  2224. item = item.toString().replace( /\$/g, "$$$$" );
  2225. rtn = rtn.replace( RegExp( "@{" + key + "}", "g" ), item );
  2226. });
  2227. return rtn.toString();
  2228. };
  2229. // String.prototype.htmlEncode
  2230. String.prototype.htmlEncode = function(){
  2231. var div = document.createElement( "div" );
  2232. return function(){
  2233. var text;
  2234. div.appendChild( document.createTextNode( this ));
  2235. text = div.innerHTML;
  2236. div.innerHTML = "";
  2237. return text;
  2238. };
  2239. }();
  2240. // String.prototype.byteLength
  2241. String.prototype.byteLength = function(){
  2242. return this.replace( /[^\x00-\xff]/g, " " ).length;
  2243. };
  2244. // String.prototype.subByte
  2245. String.prototype.subByte = function( len, tail ){
  2246. var s = this;
  2247. if( s.byteLength() <= len )
  2248. return s;
  2249. tail = tail || "";
  2250. len -= tail.byteLength();
  2251. return s = s.slice( 0, len ).replace( /( [^\x00-\xff] )/g, "$1 " )
  2252. .slice( 0, len )
  2253. .replace( /[^\x00-\xff]$/, "" )
  2254. .replace( /( [^\x00-\xff] ) /g, "$1" ) + tail;
  2255. }
  2256. // Function.prototype.defer
  2257. Function.prototype.defer = function( scope, timeout ){
  2258. var me = this;
  2259. var fn = function(){
  2260. me.apply( scope, arguments );
  2261. };
  2262. return setTimeout( fn, timeout );
  2263. };
  2264. // Function.prototype.bind
  2265. if( !Function.prototype.bind )
  2266. Function.prototype.bind = function( scope ){
  2267. var me = this;
  2268. return function(){
  2269. return me.apply( scope, arguments );
  2270. }
  2271. };
  2272. // Function.prototype.saturate
  2273. Function.prototype.saturate = function( scope/*, args */ ){
  2274. var fn = this, afters = slice.call( arguments, 1 );
  2275. return function(){
  2276. return fn.apply( scope, slice.call( arguments, 0 ).concat( afters ) );
  2277. }
  2278. };
  2279. // Array.prototype.indexOf
  2280. // if( !Array.prototype.indexOf )
  2281. Array.prototype.indexOf = function( item, i ){
  2282. var length = this.length;
  2283. if( !i )
  2284. i = 0;
  2285. if( i < 0 )
  2286. i = length + i;
  2287. for( ; i < length; i ++ )
  2288. if( this[i] === item )
  2289. return i;
  2290. return -1;
  2291. };
  2292. // Array.prototype.every
  2293. // if( !Array.prototype.every )
  2294. Array.prototype.every = function( fn, context ) {
  2295. for ( var i = 0, len = this.length; i < len; i ++ )
  2296. if ( !fn.call( context, this[i], i, this ) )
  2297. return false;
  2298. return true;
  2299. };
  2300. // Array.prototype.filter
  2301. // if( !Array.prototype.filter )
  2302. Array.prototype.filter = function( fn, context ) {
  2303. var result = [], val;
  2304. for ( var i = 0, len = this.length; i < len; i ++ )
  2305. if ( val = this[i], fn.call( context, val, i, this ) )
  2306. result.push( val );
  2307. return result;
  2308. };
  2309. // Array.prototype.forEach
  2310. // if( !Array.prototype.forEach )
  2311. Array.prototype.forEach = function( fn, context ) {
  2312. for ( var i = 0, len = this.length; i < len; i ++ )
  2313. fn.call( context, this[i], i, this );
  2314. };
  2315. // Array.prototype.map
  2316. // if( !Array.prototype.map )
  2317. Array.prototype.map = function( fn, context ) {
  2318. var result = [];
  2319. for ( var i = 0, len = this.length; i < len; i ++ )
  2320. result[i] = fn.call( context, this[i], i, this );
  2321. return result;
  2322. };
  2323. // Array.prototype.some
  2324. // if( !Array.prototype.some )
  2325. Array.prototype.some = function( fn, context ) {
  2326. for ( var i = 0, len = this.length; i < len; i ++ )
  2327. if ( fn.call( context, this[i], i, this ) )
  2328. return true;
  2329. return false;
  2330. };
  2331. Array.prototype.invoke = function( method /*, args */ ){
  2332. var args = slice.call( arguments, 1 );
  2333. this.forEach( function( item ){
  2334. if( item instanceof Array )
  2335. item[0][method].apply( item[0], item.slice( 1 ) );
  2336. else
  2337. item[method].apply( item, args );
  2338. });
  2339. return this;
  2340. };
  2341. Array.prototype.random = function(){
  2342. var arr = this.slice( 0 ), ret = [], i = arr.length;
  2343. while( i -- )
  2344. ret.push( arr.splice( Ucren.randomNumber( i + 1 ), 1 )[0] );
  2345. return ret;
  2346. };
  2347. Ucren = {
  2348. //
  2349. // [全局属性]
  2350. //
  2351. // Ucren.isIe
  2352. isIe: /msie/i.test( navigator.userAgent ),
  2353. // Ucren.isIe6
  2354. isIe6: /msie 6/i.test( navigator.userAgent ),
  2355. // Ucren.isFirefox
  2356. isFirefox: /firefox/i.test( navigator.userAgent ),
  2357. // Ucren.isSafari
  2358. isSafari: /version\/[\d\.]+\s+safari/i.test( navigator.userAgent ),
  2359. // Ucren.isOpera
  2360. isOpera: /opera/i.test( navigator.userAgent ),
  2361. // Ucren.isChrome
  2362. isChrome: /chrome/i.test( navigator.userAgent ), //todo isChrome = true, isSafari = true
  2363. // Ucren.isStrict
  2364. isStrict: document.compatMode == "CSS1Compat",
  2365. // Ucren.tempDom
  2366. tempDom: document.createElement( "div" ),
  2367. //
  2368. // [全局方法]
  2369. //
  2370. // Ucren.apply
  2371. apply: function( form, to, except ){
  2372. if( !to )to = {};
  2373. if( except ){
  2374. Ucren.each( form, function( item, key ){
  2375. if( key in except )
  2376. return ;
  2377. to[key] = item;
  2378. });
  2379. }else{
  2380. Ucren.each( form, function( item, key ){
  2381. to[key] = item;
  2382. });
  2383. }
  2384. return to;
  2385. },
  2386. // Ucren.appendStyle
  2387. appendStyle: function( text ){
  2388. var style;
  2389. if( arguments.length > 1 )
  2390. text = join.call( arguments, "" );
  2391. if( document.createStyleSheet ){
  2392. style = document.createStyleSheet();
  2393. style.cssText = text;
  2394. }else{
  2395. style = document.createElement( "style" );
  2396. style.type = "text/css";
  2397. //style.innerHTML = text; fix Chrome bug
  2398. style.appendChild( document.createTextNode( text ));
  2399. document.getElementsByTagName( "head" )[0].appendChild( style );
  2400. }
  2401. },
  2402. // for copy : )
  2403. //
  2404. // var addEvent = function( target, name, fn ){
  2405. // var call = function(){
  2406. // fn.apply( target, arguments );
  2407. // };
  2408. // if( window.attachEvent )
  2409. // target.attachEvent( "on" + name, call );
  2410. // else if( window.addEventListener )
  2411. // target.addEventListener( name, call, false );
  2412. // else
  2413. // target["on" + name] = call;
  2414. // return call;
  2415. // }
  2416. // Ucren.addEvent
  2417. addEvent: function( target, name, fn ){
  2418. var call = function(){
  2419. fn.apply( target, arguments );
  2420. };
  2421. if( target.dom ){
  2422. target = target.dom;
  2423. }
  2424. if( window.attachEvent ){
  2425. target.attachEvent( "on" + name, call );
  2426. }else if( window.addEventListener ){
  2427. target.addEventListener( name, call, false );
  2428. }else{
  2429. target["on" + name] = call;
  2430. }
  2431. return call;
  2432. },
  2433. // Ucren.delEvent
  2434. delEvent: function( target, name, fn ){
  2435. if( window.detachEvent ){
  2436. target.detachEvent( "on" + name, fn );
  2437. }else if( window.removeEventListener ){
  2438. target.removeEventListener( name, fn, false );
  2439. }else if( target["on" + name] == fn ){
  2440. target["on" + name] = null;
  2441. }
  2442. },
  2443. // Ucren.Class
  2444. Class: function( initialize, methods, befores, afters ){
  2445. var fn, prototype, blank;
  2446. initialize = initialize || function(){};
  2447. methods = methods || {};
  2448. blank = {};
  2449. fn = function(){
  2450. this.instanceId = Ucren.id();
  2451. initialize.apply( this, arguments );
  2452. };
  2453. prototype = fn.prototype;
  2454. Ucren.registerClassEvent.call( prototype );
  2455. Ucren.each( methods, function( item, key ){
  2456. prototype[key] = function( method, name ){
  2457. if( typeof( method ) == "function" ){
  2458. return function(){
  2459. var args, rtn;
  2460. args = slice.call( arguments, 0 );
  2461. if( befores &&
  2462. befores.apply( this, [name].concat( args )) === false ){
  2463. return ;
  2464. }
  2465. this.fireEvent( "before" + name, args );
  2466. rtn = method.apply( this, args );
  2467. if( afters )
  2468. afters.apply( this, [name].concat( args ));
  2469. this.fireEvent( name, args );
  2470. return rtn;
  2471. };
  2472. }else{
  2473. return method;
  2474. }
  2475. }( item, key );
  2476. });
  2477. prototype.getOriginMethod = function( name ){
  2478. return methods[name];
  2479. };
  2480. return fn;
  2481. },
  2482. //private
  2483. registerClassEvent: function(){
  2484. this.on = function( name, fn ){
  2485. var instanceId = this.instanceId;
  2486. Ucren.dispatch( instanceId + name, fn.bind( this ));
  2487. };
  2488. this.onbefore = function( name, fn ){
  2489. var instanceId = this.instanceId;
  2490. Ucren.dispatch( instanceId + "before" + name, fn.bind( this ));
  2491. };
  2492. this.un = function( name, fn ){
  2493. //todo
  2494. };
  2495. this.fireEvent = function( name, args ){
  2496. var instanceId = this.instanceId;
  2497. Ucren.dispatch( instanceId + name, args );
  2498. };
  2499. },
  2500. // Ucren.createFuze
  2501. createFuze: function(){
  2502. var queue, fn, infire;
  2503. queue = [];
  2504. fn = function( process ){
  2505. if( infire ){
  2506. process();
  2507. }else{
  2508. queue.push( process );
  2509. }
  2510. };
  2511. fn.fire = function(){
  2512. while( queue.length ){
  2513. queue.shift()();
  2514. }
  2515. infire = true;
  2516. };
  2517. fn.extinguish = function(){
  2518. infire = false;
  2519. };
  2520. fn.wettish = function(){
  2521. if( queue.length ){
  2522. queue.shift()();
  2523. }
  2524. };
  2525. return fn;
  2526. },
  2527. // Ucren.createIf
  2528. // createIf: function( expressionFunction ){
  2529. // return function( callback ){
  2530. // var expression = expressionFunction();
  2531. // var returnValue = {
  2532. // Else: function( callback ){
  2533. // callback = callback || nul;
  2534. // expression || callback();
  2535. // }
  2536. // };
  2537. // callback = callback || nul;
  2538. // expression && callback();
  2539. // return returnValue;
  2540. // };
  2541. // },
  2542. // Ucren.dispatch
  2543. dispatch: function(){
  2544. var map = {}, send, incept, ret;
  2545. send = function( processId, args, scope ){
  2546. var processItems;
  2547. if( processItems = map[ processId ] )
  2548. Ucren.each( processItems, function( item ){
  2549. item.apply( scope, args );
  2550. });
  2551. };
  2552. incept = function( processId, fn ){
  2553. var m;
  2554. if( !( m = map[ processId ] ) )
  2555. map[processId] = [ fn ];
  2556. else
  2557. m.push( fn );
  2558. };
  2559. ret = function( arg1, arg2, arg3 ){
  2560. if( typeof( arg2 ) === "undefined" )
  2561. arg2 = [];
  2562. if( arg2 instanceof Array )
  2563. send.apply( this, arguments );
  2564. else if( typeof( arg2 ) === "function" )
  2565. incept.apply( this, arguments );
  2566. };
  2567. ret.remove = function( processId, fn ){
  2568. var m, i;
  2569. if( ( m = map[ processId ] ) && ~( i = m.indexOf( fn ) ) )
  2570. m.splice( i, 1 );
  2571. };
  2572. return ret;
  2573. }(),
  2574. // Ucren.each ( not recommended )
  2575. each: function( unknown, fn ){
  2576. /// unknown 是 array 的,会慢慢退化,建议用 Array.prototype.forEach 替代
  2577. /// unknown 为其它类似的,短期内将暂时支持
  2578. if( unknown instanceof Array || ( typeof unknown == "object" &&
  2579. typeof unknown[0] != "undefined" && unknown.length )){
  2580. if( typeof unknown == "object" && Ucren.isSafari )
  2581. unknown = slice.call( unknown );
  2582. // for( var i = 0, l = unknown.length; i < l; i ++ ){
  2583. // if( fn( unknown[i], i ) === false ){
  2584. // break;
  2585. // }
  2586. // }
  2587. unknown.forEach( fn );
  2588. }else if( typeof( unknown ) == "object" ){
  2589. var blank = {};
  2590. for( var i in unknown ){
  2591. if( blank[i] ){
  2592. continue;
  2593. }
  2594. if( fn( unknown[i], i ) === false ){
  2595. break;
  2596. }
  2597. }
  2598. }else if( typeof( unknown ) == "number" ){
  2599. for( var i = 0; i < unknown; i ++ ){
  2600. if( fn( i, i ) === false ){
  2601. break;
  2602. }
  2603. }
  2604. }else if( typeof( unknown ) == "string" ){
  2605. for( var i = 0, l = unknown.length; i < l; i ++ ){
  2606. if( fn( unknown.charAt( i ), i ) === false ){
  2607. break;
  2608. }
  2609. }
  2610. }
  2611. },
  2612. // Ucren.Element
  2613. Element: function( el, returnDom ){
  2614. var rtn, handleId;
  2615. if( el && el.isUcrenElement ){
  2616. return returnDom ? el.dom : el;
  2617. }
  2618. el = typeof( el ) == "string" ? document.getElementById( el ) : el;
  2619. if( !el )
  2620. return null;
  2621. if( returnDom )
  2622. return el;
  2623. handleId = el.getAttribute( "handleId" );
  2624. if( typeof handleId == "string" ){
  2625. return Ucren.handle( handleId - 0 );
  2626. }else{
  2627. rtn = new Ucren.BasicElement( el );
  2628. handleId = Ucren.handle( rtn );
  2629. el.setAttribute( "handleId", handleId + "" );
  2630. return rtn;
  2631. }
  2632. },
  2633. // Ucren.Event
  2634. Event: function( e ){
  2635. e = e || window.event;
  2636. if( !e ){
  2637. var c = arguments.callee.caller;
  2638. while( c ){
  2639. e = c.arguments[0];
  2640. if( e && typeof( e.altKey ) == "boolean" ){ // duck typing
  2641. break;
  2642. }
  2643. c = c.caller;
  2644. e = null;
  2645. }
  2646. }
  2647. return e;
  2648. },
  2649. // Ucren.fixNumber
  2650. fixNumber: function( unknown, defaultValue ){
  2651. return typeof( unknown ) == "number" ? unknown : defaultValue;
  2652. },
  2653. // Ucren.fixString
  2654. fixString: function( unknown, defaultValue ){
  2655. return typeof( unknown ) == "string" ? unknown : defaultValue;
  2656. },
  2657. // Ucren.fixConfig
  2658. fixConfig: function( conf ){
  2659. var defaultConf;
  2660. defaultConf = {};
  2661. if( typeof conf == "undefined" ){
  2662. return defaultConf;
  2663. }else if( typeof conf == "function" ){
  2664. return new conf;
  2665. }else{
  2666. return conf;
  2667. }
  2668. },
  2669. // Ucren.handle
  2670. handle: function( unknown ){
  2671. var fn, type, number;
  2672. fn = arguments.callee;
  2673. if( !fn.cache ){
  2674. fn.cache = {};
  2675. }
  2676. if( typeof( fn.number ) == "undefined" ){
  2677. fn.number = 0;
  2678. }
  2679. type = typeof( unknown );
  2680. if( type == "number" ){
  2681. return fn.cache[unknown.toString()];
  2682. }else if( type == "object" || type == "function" ){
  2683. number = fn.number ++;
  2684. fn.cache[number.toString()] = unknown;
  2685. return number;
  2686. }
  2687. },
  2688. // Ucren.id
  2689. id: function(){
  2690. var id = arguments.callee;
  2691. id.number = ++ id.number || 0;
  2692. return "_" + id.number;
  2693. },
  2694. // Ucren.loadImage
  2695. loadImage: function( urls, onLoadComplete ){
  2696. var length = urls.length;
  2697. var loaded = 0;
  2698. var check = function(){
  2699. if( loaded == length )
  2700. onLoadComplete && onLoadComplete();
  2701. };
  2702. Ucren.each( urls, function( url ){
  2703. var img = document.createElement( "img" );
  2704. img.onload = img.onerror = function(){
  2705. this.onload = this.onerror = null;
  2706. loaded ++;
  2707. check();
  2708. };
  2709. Ucren.tempDom.appendChild( img );
  2710. img.src = url;
  2711. });
  2712. },
  2713. // Ucren.loadScript
  2714. loadScript: function( src, callback ){
  2715. Ucren.request( src, function( text ){
  2716. eval( text );
  2717. callback && callback( text );
  2718. });
  2719. },
  2720. // Ucren.makeElement
  2721. makeElement: function( tagName, attributes ){
  2722. var el = document.createElement( tagName );
  2723. var setStyle = function( unknown ){
  2724. if( typeof unknown == "string" )
  2725. el.style.cssText = unknown;
  2726. else
  2727. Ucren.apply( unknown, el.style );
  2728. };
  2729. for ( var prop in attributes ) {
  2730. if ( prop === "class" )
  2731. el.className = attributes[prop];
  2732. else if ( prop === "for" )
  2733. el.htmlFor = attributes[prop];
  2734. else if( prop === "style" )
  2735. setStyle( attributes[prop] );
  2736. else
  2737. el.setAttribute( prop, attributes[prop] );
  2738. }
  2739. return el;
  2740. },
  2741. // Ucren.nul
  2742. nul: function(){
  2743. return false;
  2744. },
  2745. // Ucren.queryString
  2746. // queryString: function( name, sourceString ){
  2747. // var source, pattern, result;
  2748. // source = sourceString || location.href;
  2749. // pattern = new RegExp( "( \\?|& )" + name + "=( [^&#]* )( #|&|$ )", "i" );
  2750. // result = source.match( pattern );
  2751. // return result ? result[2] : "";
  2752. // },
  2753. // Ucren.randomNumber
  2754. randomNumber: function( num ){
  2755. return Math.floor( Math.random() * num );
  2756. },
  2757. // Ucren.randomWord
  2758. randomWord: function(){
  2759. var cw = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  2760. return function( length, sourceString ){
  2761. var words, re = [];
  2762. words = sourceString || cw;
  2763. Ucren.each( length, function( index ){
  2764. re[index] = words.charAt( this.randomNumber( words.length ));
  2765. }.bind( this ));
  2766. return re.join( "" );
  2767. }
  2768. }(),
  2769. // Ucren.request
  2770. request: function( url, callback ){
  2771. request = Ucren.request;
  2772. var xhr = request.xhr;
  2773. if( !request.xhr ){
  2774. if( window.XMLHttpRequest ){
  2775. xhr = request.xhr = new XMLHttpRequest();
  2776. }else{
  2777. xhr = request.xhr = new ActiveXObject( "Microsoft.XMLHTTP" );
  2778. }
  2779. }
  2780. xhr.open( "GET", url, true );
  2781. xhr.onreadystatechange = function(){
  2782. if( xhr.readyState == 4 && xhr.status == 200 ){
  2783. callback( xhr.responseText );
  2784. }
  2785. };
  2786. xhr.send( null );
  2787. }
  2788. // // Ucren.decodeColor
  2789. // decodeColor: function(){
  2790. // var r = /^\#?( \w{2})( \w{2})( \w{2})$/;
  2791. // var x = function( x ){
  2792. // return parseInt( x, 16 );
  2793. // };
  2794. // return function( color ){
  2795. // r.test( color );
  2796. // return {
  2797. // red: x( RegExp.$1 ),
  2798. // green: x( RegExp.$2 ),
  2799. // blue: x( RegExp.$3 )
  2800. // };
  2801. // }
  2802. // }(),
  2803. // // Ucren.encodeColor
  2804. // encodeColor: function(){
  2805. // var x = function( x ){
  2806. // return x.toString( 16 ).split( "." )[0];
  2807. // };
  2808. // x = x.improve( function( origin, x ){
  2809. // x = origin( x );
  2810. // return x.length == 1 ? "0" + x : x;
  2811. // });
  2812. // return function( data ){
  2813. // return ["#", x( data.red ), x( data.green ), x( data.blue )].join( "" );
  2814. // }
  2815. // }()
  2816. };
  2817. //
  2818. // [底层操作类]
  2819. //
  2820. // Ucren.BasicDrag
  2821. Ucren.BasicDrag = Ucren.Class(
  2822. /* constructor */ function( conf ){
  2823. conf = Ucren.fixConfig( conf );
  2824. this.type = Ucren.fixString( conf.type, "normal" );
  2825. var isTouch = this.isTouch = "ontouchstart" in window;
  2826. this.TOUCH_START = isTouch ? "touchstart" : "mousedown",
  2827. this.TOUCH_MOVE = isTouch ? "touchmove" : "mousemove",
  2828. this.TOUCH_END = isTouch ? "touchend" : "mouseup";
  2829. },
  2830. /* methods */ {
  2831. bind: function( el, handle ){
  2832. el = Ucren.Element( el );
  2833. handle = Ucren.Element( handle ) || el;
  2834. var evt = {};
  2835. evt[this.TOUCH_START] = function( e ){
  2836. e = Ucren.Event( e );
  2837. this.startDrag();
  2838. e.cancelBubble = true;
  2839. e.stopPropagation && e.stopPropagation();
  2840. return e.returnValue = false;
  2841. }.bind( this );
  2842. handle.addEvents( evt );
  2843. this.target = el;
  2844. },
  2845. //private
  2846. getCoors: function( e ){
  2847. var coors = [];
  2848. if ( e.targetTouches && e.targetTouches.length ) { // iPhone
  2849. var thisTouch = e.targetTouches[0];
  2850. coors[0] = thisTouch.clientX;
  2851. coors[1] = thisTouch.clientY;
  2852. }else{ // all others
  2853. coors[0] = e.clientX;
  2854. coors[1] = e.clientY;
  2855. }
  2856. return coors;
  2857. },
  2858. //private
  2859. startDrag: function(){
  2860. var target, draging, e;
  2861. target = this.target;
  2862. draging = target.draging = {};
  2863. this.isDraging = true;
  2864. draging.x = parseInt( target.style( "left" ), 10 ) || 0;
  2865. draging.y = parseInt( target.style( "top" ), 10 ) || 0;
  2866. e = Ucren.Event();
  2867. var coors = this.getCoors( e );
  2868. draging.mouseX = coors[0];
  2869. draging.mouseY = coors[1];
  2870. this.registerDocumentEvent();
  2871. },
  2872. //private
  2873. endDrag: function(){
  2874. this.isDraging = false;
  2875. this.unRegisterDocumentEvent();
  2876. },
  2877. //private
  2878. registerDocumentEvent: function(){
  2879. var target, draging;
  2880. target = this.target;
  2881. draging = target.draging;
  2882. draging.documentSelectStart =
  2883. Ucren.addEvent( document, "selectstart", function( e ){
  2884. e = e || event;
  2885. e.stopPropagation && e.stopPropagation();
  2886. e.cancelBubble = true;
  2887. return e.returnValue = false;
  2888. });
  2889. draging.documentMouseMove =
  2890. Ucren.addEvent( document, this.TOUCH_MOVE, function( e ){
  2891. var ie, nie;
  2892. e = e || event;
  2893. ie = Ucren.isIe && e.button != 1;
  2894. nie = !Ucren.isIe && e.button != 0;
  2895. if( (ie || nie ) && !this.isTouch )
  2896. this.endDrag();
  2897. var coors = this.getCoors( e );
  2898. draging.newMouseX = coors[0];
  2899. draging.newMouseY = coors[1];
  2900. e.stopPropagation && e.stopPropagation();
  2901. return e.returnValue = false;
  2902. }.bind( this ));
  2903. draging.documentMouseUp =
  2904. Ucren.addEvent( document, this.TOUCH_END, function(){
  2905. this.endDrag();
  2906. }.bind( this ));
  2907. var lx, ly;
  2908. clearInterval( draging.timer );
  2909. draging.timer = setInterval( function(){
  2910. var x, y, dx, dy;
  2911. if( draging.newMouseX != lx && draging.newMouseY != ly ){
  2912. lx = draging.newMouseX;
  2913. ly = draging.newMouseY;
  2914. dx = draging.newMouseX - draging.mouseX;
  2915. dy = draging.newMouseY - draging.mouseY;
  2916. x = draging.x + dx;
  2917. y = draging.y + dy;
  2918. if( this.type == "calc" ){
  2919. this.returnValue( dx, dy, draging.newMouseX, draging.newMouseY );
  2920. }else{
  2921. target.left( x ).top( y );
  2922. }
  2923. }
  2924. }.bind( this ), 10 );
  2925. },
  2926. //private
  2927. unRegisterDocumentEvent: function(){
  2928. var draging = this.target.draging;
  2929. Ucren.delEvent( document, this.TOUCH_MOVE, draging.documentMouseMove );
  2930. Ucren.delEvent( document, this.TOUCH_END, draging.documentMouseUp );
  2931. Ucren.delEvent( document, "selectstart", draging.documentSelectStart );
  2932. clearInterval( draging.timer );
  2933. },
  2934. //private
  2935. returnValue: function( dx, dy, x, y ){
  2936. //todo something
  2937. }
  2938. }
  2939. );
  2940. // Ucren.Template
  2941. Ucren.Template = Ucren.Class(
  2942. /* constructor */ function(){
  2943. this.string = join.call( arguments, "" );
  2944. },
  2945. /* methods */ {
  2946. apply: function( conf ){
  2947. return this.string.format( conf );
  2948. }
  2949. }
  2950. );
  2951. // Ucren.BasicElement
  2952. Ucren.BasicElement = Ucren.Class(
  2953. /* constructor */ function( el ){
  2954. this.dom = el;
  2955. this.countMapping = {};
  2956. },
  2957. /* methods */ {
  2958. isUcrenElement: true,
  2959. attr: function( name, value ){
  2960. if( typeof value == "string" ){
  2961. this.dom.setAttribute( name, value );
  2962. }else{
  2963. return this.dom.getAttribute( name );
  2964. }
  2965. return this;
  2966. },
  2967. style: function( /* unknown1, unknown2 */ ){
  2968. var getStyle = Ucren.isIe ?
  2969. function( name ){
  2970. return this.dom.currentStyle[name];
  2971. } :
  2972. function( name ){
  2973. var style;
  2974. style = document.defaultView.getComputedStyle( this.dom, null );
  2975. return style.getPropertyValue( name );
  2976. };
  2977. return function( unknown1, unknown2 ){
  2978. if( typeof unknown1 == "object" ){
  2979. Ucren.each( unknown1, function( value, key ){
  2980. this[key] = value;
  2981. }.bind( this.dom.style ));
  2982. }else if( typeof unknown1 == "string" && typeof unknown2 == "undefined" ){
  2983. return getStyle.call( this, unknown1 );
  2984. }else if( typeof unknown1 == "string" && typeof unknown2 != "undefined" ){
  2985. this.dom.style[unknown1] = unknown2;
  2986. }
  2987. return this;
  2988. };
  2989. }(),
  2990. hasClass: function( name ){
  2991. var className = " " + this.dom.className + " ";
  2992. return className.indexOf( " " + name + " " ) > -1;
  2993. },
  2994. setClass: function( name ){
  2995. if( typeof( name ) == "string" )
  2996. this.dom.className = name.trim();
  2997. return this;
  2998. },
  2999. addClass: function( name ){
  3000. var el, className;
  3001. el = this.dom;
  3002. className = " " + el.className + " ";
  3003. if( className.indexOf( " " + name + " " ) == -1 ){
  3004. className += name;
  3005. className = className.trim();
  3006. className = className.replace( / +/g, " " );
  3007. el.className = className;
  3008. }
  3009. return this;
  3010. },
  3011. delClass: function( name ){
  3012. var el, className;
  3013. el = this.dom;
  3014. className = " " + el.className + " ";
  3015. if( className.indexOf( " " + name + " " ) > -1 ){
  3016. className = className.replace( " " + name + " ", " " );
  3017. className = className.trim();
  3018. className = className.replace( / +/g, " " );
  3019. el.className = className;
  3020. }
  3021. return this;
  3022. },
  3023. html: function( html ){
  3024. var el = this.dom;
  3025. if( typeof html == "string" ){
  3026. el.innerHTML = html;
  3027. }else if( html instanceof Array ){
  3028. el.innerHTML = html.join( "" );
  3029. }else{
  3030. return el.innerHTML;
  3031. }
  3032. return this;
  3033. },
  3034. left: function( number ){
  3035. var el = this.dom;
  3036. if( typeof( number ) == "number" ){
  3037. el.style.left = number + "px";
  3038. this.fireEvent( "infect", [{ left: number }] );
  3039. }else{
  3040. return this.getPos().x;
  3041. }
  3042. return this;
  3043. },
  3044. top: function( number ){
  3045. var el = this.dom;
  3046. if( typeof( number ) == "number" ){
  3047. el.style.top = number + "px";
  3048. this.fireEvent( "infect", [{ top: number }] );
  3049. }else{
  3050. return this.getPos().y;
  3051. }
  3052. return this;
  3053. },
  3054. width: function( unknown ){
  3055. var el = this.dom;
  3056. if( typeof unknown == "number" ){
  3057. el.style.width = unknown + "px";
  3058. this.fireEvent( "infect", [{ width: unknown }] );
  3059. }else if( typeof unknown == "string" ){
  3060. el.style.width = unknown;
  3061. this.fireEvent( "infect", [{ width: unknown }] );
  3062. }else{
  3063. return this.getSize().width;
  3064. }
  3065. return this;
  3066. },
  3067. height: function( unknown ){
  3068. var el = this.dom;
  3069. if( typeof unknown == "number" ){
  3070. el.style.height = unknown + "px";
  3071. this.fireEvent( "infect", [{ height: unknown }] );
  3072. }else if( typeof unknown == "string" ){
  3073. el.style.height = unknown;
  3074. this.fireEvent( "infect", [{ height: unknown }] );
  3075. }else{
  3076. return this.getSize().height;
  3077. }
  3078. return this;
  3079. },
  3080. count: function( name ){
  3081. return this.countMapping[name] = ++ this.countMapping[name] || 1;
  3082. },
  3083. display: function( bool ){
  3084. var dom = this.dom;
  3085. if( typeof( bool ) == "boolean" ){
  3086. dom.style.display = bool ? "block" : "none";
  3087. this.fireEvent( "infect", [{ display: bool }] );
  3088. }else{
  3089. return this.style( "display" ) != "none";
  3090. }
  3091. return this;
  3092. },
  3093. first: function(){
  3094. var c = this.dom.firstChild;
  3095. while( c && !c.tagName && c.nextSibling ){
  3096. c = c.nextSibling;
  3097. }
  3098. return c;
  3099. },
  3100. add: function( dom ){
  3101. var el;
  3102. el = Ucren.Element( dom );
  3103. this.dom.appendChild( el.dom );
  3104. return this;
  3105. },
  3106. remove: function( dom ){
  3107. var el;
  3108. if( dom ){
  3109. el = Ucren.Element( dom );
  3110. el.html( "" );
  3111. this.dom.removeChild( el.dom );
  3112. }else{
  3113. el = Ucren.Element( this.dom.parentNode );
  3114. el.remove( this );
  3115. }
  3116. return this;
  3117. },
  3118. insert: function( dom ){
  3119. var tdom;
  3120. tdom = this.dom;
  3121. if( tdom.firstChild ){
  3122. tdom.insertBefore( dom, tdom.firstChild );
  3123. }else{
  3124. this.add( dom );
  3125. }
  3126. return this;
  3127. },
  3128. addEvents: function( conf ){
  3129. var blank, el, rtn;
  3130. blank = {};
  3131. rtn = {};
  3132. el = this.dom;
  3133. Ucren.each( conf, function( item, key ){
  3134. rtn[key] = Ucren.addEvent( el, key, item );
  3135. });
  3136. return rtn;
  3137. },
  3138. removeEvents: function( conf ){
  3139. var blank, el;
  3140. blank = {};
  3141. el = this.dom;
  3142. Ucren.each( conf, function( item, key ){
  3143. Ucren.delEvent( el, key, item );
  3144. });
  3145. return this;
  3146. },
  3147. getPos: function(){
  3148. var el, parentNode, pos, box, offset;
  3149. el = this.dom;
  3150. pos = {};
  3151. if( el.getBoundingClientRect ){
  3152. box = el.getBoundingClientRect();
  3153. offset = Ucren.isIe ? 2 : 0;
  3154. var doc = document;
  3155. var scrollTop = Math.max( doc.documentElement.scrollTop,
  3156. doc.body.scrollTop );
  3157. var scrollLeft = Math.max( doc.documentElement.scrollLeft,
  3158. doc.body.scrollLeft );
  3159. return {
  3160. x: box.left + scrollLeft - offset,
  3161. y: box.top + scrollTop - offset
  3162. };
  3163. }else{
  3164. pos = {
  3165. x: el.offsetLeft,
  3166. y: el.offsetTop
  3167. };
  3168. parentNode = el.offsetParent;
  3169. if( parentNode != el ){
  3170. while( parentNode ){
  3171. pos.x += parentNode.offsetLeft;
  3172. pos.y += parentNode.offsetTop;
  3173. parentNode = parentNode.offsetParent;
  3174. }
  3175. }
  3176. if( Ucren.isSafari && this.style( "position" ) == "absolute" ){ // safari doubles in some cases
  3177. pos.x -= document.body.offsetLeft;
  3178. pos.y -= document.body.offsetTop;
  3179. }
  3180. }
  3181. if( el.parentNode ){
  3182. parentNode = el.parentNode;
  3183. }else{
  3184. parentNode = null;
  3185. }
  3186. while( parentNode && parentNode.tagName.toUpperCase() != "BODY" &&
  3187. parentNode.tagName.toUpperCase() != "HTML" ){ // account for any scrolled ancestors
  3188. pos.x -= parentNode.scrollLeft;
  3189. pos.y -= parentNode.scrollTop;
  3190. if( parentNode.parentNode ){
  3191. parentNode = parentNode.parentNode;
  3192. }else{
  3193. parentNode = null;
  3194. }
  3195. }
  3196. return pos;
  3197. },
  3198. getSize: function(){
  3199. var dom = this.dom;
  3200. var display = this.style( "display" );
  3201. if ( display && display !== "none" ) {
  3202. return { width: dom.offsetWidth, height: dom.offsetHeight };
  3203. }
  3204. var style = dom.style;
  3205. var originalStyles = {
  3206. visibility: style.visibility,
  3207. position: style.position,
  3208. display: style.display
  3209. };
  3210. var newStyles = {
  3211. visibility: "hidden",
  3212. display: "block"
  3213. };
  3214. if ( originalStyles.position !== "fixed" )
  3215. newStyles.position = "absolute";
  3216. this.style( newStyles );
  3217. var dimensions = {
  3218. width: dom.offsetWidth,
  3219. height: dom.offsetHeight
  3220. };
  3221. this.style( originalStyles );
  3222. return dimensions;
  3223. },
  3224. observe: function( el, fn ){
  3225. el = Ucren.Element( el );
  3226. el.on( "infect", fn.bind( this ));
  3227. return this;
  3228. },
  3229. usePNGbackground: function( image ){
  3230. var dom;
  3231. dom = this.dom;
  3232. if( /\.png$/i.test( image ) && Ucren.isIe6 ){
  3233. dom.style.filter =
  3234. "progid:DXImageTransform.Microsoft.AlphaImageLoader( src='" +
  3235. image + "',sizingMethod='scale' );";
  3236. /// _background: none;
  3237. /// _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader( src='images/pic.png',sizingMethod='scale' );
  3238. }else{
  3239. dom.style.backgroundImage = "url( " + image + " )";
  3240. }
  3241. return this;
  3242. },
  3243. setAlpha: function(){
  3244. var reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/;
  3245. return function( value ){
  3246. var element = this.dom, es = element.style;
  3247. if( !Ucren.isIe ){
  3248. es.opacity = value / 100;
  3249. /* }else if( es.filter === "string" ){ */
  3250. }else{
  3251. if ( element.currentStyle && !element.currentStyle.hasLayout )
  3252. es.zoom = 1;
  3253. if ( reOpacity.test( es.filter )) {
  3254. value = value >= 99.99 ? "" : ( "alpha( opacity=" + value + " )" );
  3255. es.filter = es.filter.replace( reOpacity, value );
  3256. } else {
  3257. es.filter += " alpha( opacity=" + value + " )";
  3258. }
  3259. }
  3260. return this;
  3261. };
  3262. }(),
  3263. fadeIn: function( callback ){
  3264. if( typeof this.fadingNumber == "undefined" )
  3265. this.fadingNumber = 0;
  3266. this.setAlpha( this.fadingNumber );
  3267. var fading = function(){
  3268. this.setAlpha( this.fadingNumber );
  3269. if( this.fadingNumber == 100 ){
  3270. clearInterval( this.fadingInterval );
  3271. callback && callback();
  3272. }else
  3273. this.fadingNumber += 10;
  3274. }.bind( this );
  3275. this.display( true );
  3276. clearInterval( this.fadingInterval );
  3277. this.fadingInterval = setInterval( fading, Ucren.isIe ? 20 : 30 );
  3278. return this;
  3279. },
  3280. fadeOut: function( callback ){
  3281. if( typeof this.fadingNumber == "undefined" )
  3282. this.fadingNumber = 100;
  3283. this.setAlpha( this.fadingNumber );
  3284. var fading = function(){
  3285. this.setAlpha( this.fadingNumber );
  3286. if( this.fadingNumber == 0 ){
  3287. clearInterval( this.fadingInterval );
  3288. this.display( false );
  3289. callback && callback();
  3290. }else
  3291. this.fadingNumber -= 10;
  3292. }.bind( this );
  3293. clearInterval( this.fadingInterval );
  3294. this.fadingInterval = setInterval( fading, Ucren.isIe ? 20 : 30 );
  3295. return this;
  3296. },
  3297. useMouseAction: function( className, actions ){
  3298. /**
  3299. * 调用示例: el.useMouseAction( "xbutton", "over,out,down,up" );
  3300. * 使用效果: el 会在 "xbutton xbutton-over","xbutton xbutton-out","xbutton xbutton-down","xbutton xbutton-up"
  3301. * 等四个 className 中根据相应的鼠标事件来进行切换。
  3302. * 特别提示: useMouseAction 可使用不同参数多次调用。
  3303. */
  3304. if( !this.MouseAction )
  3305. this.MouseAction = new Ucren.MouseAction({ element: this });
  3306. this.MouseAction.use( className, actions );
  3307. return this;
  3308. }
  3309. }
  3310. );
  3311. if( Ucren.isIe )
  3312. document.execCommand( "BackgroundImageCache", false, true );
  3313. for( var i in Ucren ){
  3314. exports[i] = Ucren[i];
  3315. };
  3316. return exports;
  3317. });
  3318. /**
  3319. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\background.js
  3320. */
  3321. define("scripts/object/background.js", function(exports){
  3322. var Ucren = require("scripts/lib/ucren");
  3323. var layer = require("scripts/layer");
  3324. var timeline = require("scripts/timeline");
  3325. var image, time;
  3326. var random = Ucren.randomNumber;
  3327. exports.set = function(){
  3328. image = layer.createImage( "default", "images/background.jpg", 0, 0, 640, 480 );
  3329. };
  3330. exports.wobble = function(){
  3331. time = timeline.setInterval( wobble, 50 );
  3332. };
  3333. exports.stop = function(){
  3334. time.stop();
  3335. image.attr({ x: 0, y: 0 });
  3336. };
  3337. function wobble(){
  3338. var x, y;
  3339. x = random( 12 ) - 6;
  3340. y = random( 12 ) - 6;
  3341. image.attr({ x: x, y: y });
  3342. };;
  3343. return exports;
  3344. });
  3345. /**
  3346. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\console.js
  3347. */
  3348. define("scripts/object/console.js", function(exports){
  3349. var layer = require("scripts/layer");
  3350. var x = 16, y = 0;
  3351. var texts = [];
  3352. exports.set = function(){
  3353. };
  3354. exports.clear = function(){
  3355. for(var i = 0, l = texts.length; i < l; i ++)
  3356. texts[i].remove();
  3357. texts.length = y = 0;
  3358. };
  3359. exports.log = function(text){
  3360. y += 20;
  3361. texts.push( layer.createText( "default", text, x, y ) );
  3362. };;
  3363. return exports;
  3364. });
  3365. /**
  3366. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\developing.js
  3367. */
  3368. define("scripts/object/developing.js", function(exports){
  3369. var layer = require("scripts/layer");
  3370. var tween = require("scripts/lib/tween");
  3371. var timeline = require("scripts/timeline");
  3372. var message = require("scripts/message");
  3373. var exponential = tween.exponential.co;
  3374. /**
  3375. * "coming soon" 模块
  3376. */
  3377. exports.anims = [];
  3378. exports.set = function(){
  3379. this.image = layer.createImage( "default", "images/developing.png", 103, 218, 429, 53 ).hide().scale( 1e-5, 1e-5 );
  3380. };
  3381. exports.show = function( start ){
  3382. timeline.createTask({
  3383. start: start, duration: 500, data: [ 1e-5, 1, "show" ],
  3384. object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,
  3385. recycle: this.anims
  3386. });
  3387. this.hide( 2000 );
  3388. };
  3389. exports.hide = function( start ){
  3390. timeline.createTask({
  3391. start: start, duration: 500, data: [ 1, 1e-5, "hide" ],
  3392. object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,
  3393. recycle: this.anims
  3394. });
  3395. };
  3396. // 显示/隐藏 相关
  3397. exports.onZoomStart = function(){
  3398. this.image.show();
  3399. };
  3400. exports.onZooming = function( time, sz, ez, z ){
  3401. this.image.scale( z = exponential( time, sz, ez - sz, 500 ), z );
  3402. };
  3403. exports.onZoomEnd = function( sz, ez, mode ){
  3404. if( mode === "hide" )
  3405. this.image.hide();
  3406. };;
  3407. return exports;
  3408. });
  3409. /**
  3410. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\dojo.js
  3411. */
  3412. define("scripts/object/dojo.js", function(exports){
  3413. var rotate = require("scripts/factory/rotate");
  3414. var tween = require("scripts/lib/tween");
  3415. exports = rotate.create("images/dojo.png", 41, 240, 175, 175, 1e-5, tween.exponential.co, 500);;
  3416. return exports;
  3417. });
  3418. /**
  3419. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\flame.js
  3420. */
  3421. define("scripts/object/flame.js", function(exports){
  3422. /**
  3423. * 火焰模块
  3424. * @author zswang, dron
  3425. */
  3426. var layer = require("scripts/layer").getLayer( "fruit" );
  3427. var timeline = require("scripts/timeline");
  3428. var Ucren = require("scripts/lib/ucren");
  3429. /*
  3430. raphael.path('M 27,122 Q 9,42 27,21 45,42 27,122')
  3431. .attr({
  3432. stroke: 'none',
  3433. fill: '180-#D8D380-#EDED7A-#D8D380'
  3434. });
  3435. */
  3436. // 缩写
  3437. var math = Math, cos = math.cos, sin = math.sin,
  3438. trunc = parseInt,
  3439. random = math.random,
  3440. PI = math.PI;
  3441. var guid = 0;
  3442. /**
  3443. * 添加一个火苗
  3444. * @param{Array} center 中心位置 单位像素
  3445. * @param{Number} angle 运动方向 单位幅度
  3446. * @param{Number} length 运动长度 单位像素
  3447. * @param{Number} life 存活时间 单位毫秒
  3448. */
  3449. function appendFlame( center, angle, length, life, flames ){
  3450. return flames[guid] = {
  3451. id: guid ++,
  3452. birthday: new Date,
  3453. center: center,
  3454. angle: angle,
  3455. length: length,
  3456. life: life,
  3457. path: layer.path().attr({ stroke: 'none', fill: trunc( angle * 180 / PI ) + '-#fafad9-#f0ef9c' })
  3458. };
  3459. }
  3460. var radius = 15;
  3461. function updateFlame( flames, n ){
  3462. var item = flames[n];
  3463. if ( !item )
  3464. return;
  3465. var age, center, p1, p2, p3, p4;
  3466. age = 1 - (new Date - item.birthday) / item.life;
  3467. if ( age <= 0 ){
  3468. item.path.remove();
  3469. delete flames[item.id];
  3470. return;
  3471. }
  3472. var ia, ic, il;
  3473. ia = item.angle;
  3474. ic = item.center;
  3475. il = item.length;
  3476. center = [ trunc(ic[0] + cos(ia) * il * (1 - age)), trunc(ic[1] + sin(ia) * il * (1 - age)) ];
  3477. p1 = [ trunc(center[0] - cos(ia) * radius * age), trunc(center[1] - sin(ia) * radius * age) ];
  3478. p2 = [ trunc(center[0] + cos(ia) * radius * age), trunc(center[1] + sin(ia) * radius * age) ];
  3479. p3 = [ trunc(center[0] - cos(ia + .5 * PI) * radius * .4 * age), trunc(center[1] - sin(ia + .5 * PI) * radius * .4 * age) ];
  3480. p4 = [ trunc(center[0] - cos(ia - .5 * PI) * radius * .4 * age), trunc(center[1] - sin(ia - .5 * PI) * radius * .4 * age) ];
  3481. item.path.attr({ path: 'M' + p1 + ' Q' + [ p3, p2, p4, p1 ].join(' ') });
  3482. };
  3483. function removeFlame( flames, n ){
  3484. var item = flames[n];
  3485. if( !item )
  3486. return;
  3487. item.path.remove();
  3488. delete flames[ n ];
  3489. };
  3490. exports.create = function( ox, oy, start ){
  3491. var timer1, timer2;
  3492. var object = {
  3493. pos: function( x, y ){
  3494. nx = x;
  3495. ny = y;
  3496. image.attr( "x", nx - 21 ).attr( "y", ny - 21 );
  3497. },
  3498. remove: function(){
  3499. [ timer1, timer2 ].invoke( "stop" );
  3500. image.remove();
  3501. for (var p in flames)
  3502. removeFlame( flames, p );
  3503. }
  3504. };
  3505. var nx = ox, ny = oy;
  3506. var image = layer.image("images/smoke.png", nx - 21, ny - 21, 43, 43).hide();
  3507. var flames = {};
  3508. timer1 = timeline.setTimeout(function(){
  3509. image.show();
  3510. timer2 = timeline.setInterval(function(){
  3511. if(random() < 0.9)
  3512. appendFlame( [ nx, ny ], PI * 2 * random(), 60, 200 + 500 * random(), flames );
  3513. for (var p in flames)
  3514. updateFlame( flames, p );
  3515. }, Ucren.isIe ? 20 : 40);
  3516. }, start || 0);
  3517. return object;
  3518. };;
  3519. return exports;
  3520. });
  3521. /**
  3522. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\flash.js
  3523. */
  3524. define("scripts/object/flash.js", function(exports){
  3525. /**
  3526. *
  3527. */
  3528. var layer = require("scripts/layer");
  3529. var timeline = require("scripts/timeline").use( "flash" ).init( 10 );
  3530. var tween = require("scripts/lib/tween");
  3531. var sound = require("scripts/lib/sound");
  3532. var image, snd, xDiff = 0, yDiff = 0;
  3533. var anim = tween.quadratic.cio;
  3534. var anims = [];
  3535. var dur = 100;
  3536. exports.set = function(){
  3537. image = layer.createImage( "flash", "images/flash.png", 0, 0, 358, 20 ).hide();
  3538. snd = sound.create( "sound/splatter" );
  3539. };
  3540. exports.showAt = function( x, y, an ){
  3541. image.rotate( an, true ).scale( 1e-5, 1e-5 ).attr({
  3542. x: x + xDiff,
  3543. y: y + yDiff
  3544. }).show();
  3545. anims.clear && anims.clear();
  3546. snd.play();
  3547. timeline.createTask({
  3548. start: 0, duration: dur, data: [ 1e-5, 1 ],
  3549. object: this, onTimeUpdate: this.onTimeUpdate,
  3550. recycle: anims
  3551. });
  3552. timeline.createTask({
  3553. start: dur, duration: dur, data: [ 1, 1e-5 ],
  3554. object: this, onTimeUpdate: this.onTimeUpdate,
  3555. recycle: anims
  3556. });
  3557. };
  3558. exports.onTimeUpdate = function( time, a, b, z ){
  3559. image.scale( z = anim( time, a, b - a, dur ), z );
  3560. };;
  3561. return exports;
  3562. });
  3563. /**
  3564. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\fps.js
  3565. */
  3566. define("scripts/object/fps.js", function(exports){
  3567. // var layer = require("scripts/layer");
  3568. // var timeline =require("scripts/timeline");
  3569. // var text, fps = "fps: ";
  3570. // exports.set = function(){
  3571. // text = layer.createText( "default", fps + "0", 4, 470 ).attr( "fill", "#ccc" );
  3572. // };
  3573. // exports.update = function(){
  3574. // text.attr( "text", fps + ( timeline.getFPS() >> 0 ) );
  3575. // };;
  3576. return exports;
  3577. });
  3578. /**
  3579. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\game-over.js
  3580. */
  3581. define("scripts/object/game-over.js", function(exports){
  3582. var layer = require("scripts/layer");
  3583. var tween = require("scripts/lib/tween");
  3584. var timeline = require("scripts/timeline");
  3585. var message = require("scripts/message");
  3586. var state = require("scripts/state");
  3587. var exponential = tween.exponential.co;
  3588. /**
  3589. * "game-over"模块
  3590. */
  3591. exports.anims = [];
  3592. exports.set = function(){
  3593. this.image = layer.createImage( "default", "images/game-over.png", 75, 198, 490, 85 ).hide().scale( 1e-5, 1e-5 );
  3594. };
  3595. exports.show = function( start ){
  3596. timeline.createTask({
  3597. start: start, duration: 500, data: [ 1e-5, 1, "show" ],
  3598. object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,
  3599. recycle: this.anims
  3600. });
  3601. };
  3602. exports.hide = function( start ){
  3603. timeline.createTask({
  3604. start: start, duration: 500, data: [ 1, 1e-5, "hide" ],
  3605. object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,
  3606. recycle: this.anims
  3607. });
  3608. };
  3609. // 显示/隐藏 相关
  3610. exports.onZoomStart = function( sz, ez, mode ){
  3611. if( mode == "show" )
  3612. this.image.show();
  3613. };
  3614. exports.onZooming = function( time, sz, ez, z ){
  3615. this.image.scale( z = exponential( time, sz, ez - sz, 500 ), z );
  3616. };
  3617. exports.onZoomEnd = function( sz, ez, mode ){
  3618. if( mode == "show" )
  3619. state( "click-enable" ).on();
  3620. else if( mode === "hide" )
  3621. this.image.hide();
  3622. };;
  3623. return exports;
  3624. });
  3625. /**
  3626. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\home-desc.js
  3627. */
  3628. define("scripts/object/home-desc.js", function(exports){
  3629. var displacement = require("scripts/factory/displacement");
  3630. var tween = require("scripts/lib/tween");
  3631. exports = displacement.create("images/home-desc.png", 161, 91, -161, 140, 7, 127, tween.exponential.co, 500);;
  3632. return exports;
  3633. });
  3634. /**
  3635. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\home-mask.js
  3636. */
  3637. define("scripts/object/home-mask.js", function(exports){
  3638. var displacement = require("scripts/factory/displacement");
  3639. var tween = require("scripts/lib/tween");
  3640. exports = displacement.create("images/home-mask.png", 640, 183, 0, -183, 0, 0, tween.exponential.co, 1e3);;
  3641. return exports;
  3642. });
  3643. /**
  3644. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\knife.js
  3645. */
  3646. define("scripts/object/knife.js", function(exports){
  3647. var timeline = require("scripts/timeline");
  3648. var layer = require("scripts/layer").getLayer( "knife" );
  3649. var Ucren = require("scripts/lib/ucren");
  3650. /**
  3651. * 刀光模块
  3652. */
  3653. var lastX = null, lastY = null;
  3654. var abs = Math.abs;
  3655. var life = 200;
  3656. var stroke = 10;
  3657. var color = "#cbd3db";
  3658. var anims = [];
  3659. var switchState = true;
  3660. var knifes = [];
  3661. function ClassKnifePart( conf ){
  3662. this.sx = conf.sx;
  3663. this.sy = conf.sy;
  3664. this.ex = conf.ex;
  3665. this.ey = conf.ey;
  3666. knifes.push( this );
  3667. }
  3668. ClassKnifePart.prototype.set = function(){
  3669. var sx, sy, ex, ey, dx, dy, ax, ay;
  3670. sx = this.sx;
  3671. sy = this.sy;
  3672. ex = this.ex;
  3673. ey = this.ey;
  3674. dx = sx - ex;
  3675. dy = sy - ey;
  3676. ax = abs(dx);
  3677. ay = abs(dy);
  3678. if(ax > ay)
  3679. sx += dx < 0 ? -1 : 1,
  3680. sy += dy < 0 ? -( 1 * ay / ax ) : 1 * ay / ax;
  3681. else
  3682. sx += dx < 0 ? -( 1 * ax / ay ) : 1 * ax / ay,
  3683. sy += dy < 0 ? -1 : 1;
  3684. this.line = layer.path( "M" + sx + "," + sy + "L" + ex + "," + ey ).attr({
  3685. "stroke": color,
  3686. "stroke-width": stroke + "px"
  3687. });
  3688. timeline.createTask({ start: 0, duration: life, object: this, onTimeUpdate: this.update, onTimeEnd: this.end, recycle: anims });
  3689. return this;
  3690. };
  3691. ClassKnifePart.prototype.update = function( time ){
  3692. this.line.attr( "stroke-width", stroke * (1 - time / life) + "px" );
  3693. };
  3694. ClassKnifePart.prototype.end = function(){
  3695. this.line.remove();
  3696. var index;
  3697. if( index = knifes.indexOf( this ) )
  3698. knifes.splice( index, 1 );
  3699. };
  3700. exports.newKnife = function(){
  3701. lastX = lastY = null;
  3702. };
  3703. exports.through = function( x, y ){
  3704. if( !switchState )
  3705. return ;
  3706. var ret = null;
  3707. if( lastX !== null && ( lastX != x || lastY != y ) )
  3708. new ClassKnifePart({ sx: lastX, sy: lastY, ex: x, ey: y }).set(),
  3709. ret = [ lastX, lastY, x, y ];
  3710. lastX = x;
  3711. lastY = y;
  3712. return ret;
  3713. };
  3714. exports.pause = function(){
  3715. anims.clear();
  3716. this.switchOff();
  3717. };
  3718. exports.switchOff = function(){
  3719. switchState = false;
  3720. };
  3721. exports.switchOn = function(){
  3722. switchState = true;
  3723. this.endAll();
  3724. };
  3725. exports.endAll = function(){
  3726. for(var i = knifes.length - 1; i >= 0; i --)
  3727. knifes[i].end();
  3728. };;
  3729. return exports;
  3730. });
  3731. /**
  3732. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\light.js
  3733. */
  3734. define("scripts/object/light.js", function(exports){
  3735. /**
  3736. * 炸弹爆炸时的光线
  3737. */
  3738. var layer = require("scripts/layer");
  3739. var maskLayer = layer.getLayer( "mask" );
  3740. layer = layer.getLayer( "light" );
  3741. var Ucren = require("scripts/lib/ucren");
  3742. var timeline = require("scripts/timeline");
  3743. var message = require("scripts/message");
  3744. var random = Ucren.randomNumber;
  3745. var pi = Math.PI;
  3746. var sin = Math.sin;
  3747. var cos = Math.cos;
  3748. var lights = [];
  3749. var indexs = [];
  3750. var lightsNum = 10;
  3751. for(var i = 0; i < lightsNum; i ++)
  3752. indexs[i] = i;
  3753. exports.start = function( boom ){
  3754. var x = boom.originX, y = boom.originY, time = 0, idx = indexs.random();
  3755. var i = lightsNum, b = function(){
  3756. build( x, y, idx[ this ] );
  3757. };
  3758. while( i -- )
  3759. timeline.setTimeout( b.bind( i ), time += 100 );
  3760. timeline.setTimeout(function(){
  3761. this.overWhiteLight();
  3762. }.bind( this ), time + 100);
  3763. };
  3764. exports.overWhiteLight = function(){
  3765. message.postMessage( "overWhiteLight.show" );
  3766. this.removeLights();
  3767. var dur = 4e3;
  3768. var mask = maskLayer.rect( 0, 0, 640, 480 ).attr({ fill: "#fff", stroke: "none" });
  3769. var control = {
  3770. onTimeUpdate: function( time ){
  3771. mask.attr( "opacity", 1 - time / dur );
  3772. },
  3773. onTimeEnd: function(){
  3774. mask.remove();
  3775. message.postMessage( "game.over" );
  3776. }
  3777. };
  3778. timeline.createTask({
  3779. start: 0, duration: dur,
  3780. object: control, onTimeUpdate: control.onTimeUpdate, onTimeEnd: control.onTimeEnd
  3781. });
  3782. };
  3783. exports.removeLights = function(){
  3784. for(var i = 0, l = lights.length; i < l; i ++)
  3785. lights[i].remove();
  3786. lights.length = 0;
  3787. };
  3788. function build( x, y, r ){
  3789. var a1, a2, x1, y1, x2, y2;
  3790. a1 = r * 36 + random( 10 );
  3791. a2 = a1 + 5;
  3792. a1 = pi * a1 / 180;
  3793. a2 = pi * a2 / 180;
  3794. x1 = x + 640 * cos( a1 );
  3795. y1 = y + 640 * sin( a1 );
  3796. x2 = x + 640 * cos( a2 );
  3797. y2 = y + 640 * sin( a2 );
  3798. var light = layer.path( [ "M", x, y, "L", x1, y1, "L", x2, y2, "Z" ] ).attr({
  3799. stroke: "none",
  3800. fill: "#fff"
  3801. });
  3802. lights.push( light );
  3803. };
  3804. return exports;
  3805. });
  3806. /**
  3807. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\logo.js
  3808. */
  3809. define("scripts/object/logo.js", function(exports){
  3810. var displacement = require("scripts/factory/displacement");
  3811. var tween = require("scripts/lib/tween");
  3812. exports = displacement.create("images/logo.png", 288, 135, 17, -182, 17, 1, tween.exponential.co, 1e3);;
  3813. return exports;
  3814. });
  3815. /**
  3816. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\lose.js
  3817. */
  3818. define("scripts/object/lose.js", function(exports){
  3819. var layer = require("scripts/layer");
  3820. var tween = require("scripts/lib/tween");
  3821. var timeline = require("scripts/timeline");
  3822. var Ucren = require("scripts/lib/ucren");
  3823. var message = require("scripts/message");
  3824. var anim = tween.exponential.co;
  3825. var back = tween.back.co;
  3826. /**
  3827. *
  3828. */
  3829. var o1, o2, o3, animLength = 500;
  3830. var conf1 = { src: "images/x.png", sx: 650, ex: 561, y: 5, w: 22, h: 19 };
  3831. var conf2 = { src: "images/xx.png", sx: 671, ex: 582, y: 5, w: 27, h: 26 };
  3832. var conf3 = { src: "images/xxx.png", sx: 697, ex: 608, y: 6, w: 31, h: 32 };
  3833. var number = 0;
  3834. exports.anims = [];
  3835. exports.set = function(){
  3836. o1 = layer.createImage( "default", conf1.src, conf1.sx, conf1.y, conf1.w, conf1.h ).hide();
  3837. o2 = layer.createImage( "default", conf2.src, conf2.sx, conf2.y, conf2.w, conf2.h ).hide();
  3838. o3 = layer.createImage( "default", conf3.src, conf3.sx, conf3.y, conf3.w, conf3.h ).hide();
  3839. };
  3840. exports.reset = function(){
  3841. number = 0;
  3842. [ [ o1, conf1 ], [ o2, conf2 ], [ o3, conf3 ] ].forEach(function( infx ){
  3843. infx[0].attr( "src", infx[1].src.replace( "xf.png", "x.png" ) );
  3844. })
  3845. };
  3846. exports.show = function( start ){
  3847. timeline.createTask({
  3848. start: start, duration: animLength, data: [ "show", conf1.sx, conf1.ex, conf2.sx, conf2.ex, conf3.sx, conf3.ex ],
  3849. object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,
  3850. recycle: this.anims
  3851. });
  3852. };
  3853. exports.hide = function( start ){
  3854. timeline.createTask({
  3855. start: start, duration: animLength, data: [ "hide", conf1.ex, conf1.sx, conf2.ex, conf2.sx, conf3.ex, conf3.sx ],
  3856. object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,
  3857. recycle: this.anims
  3858. });
  3859. };
  3860. exports.showLoseAt = function( x ){
  3861. var infx, inf = [
  3862. [ o1, conf1 ],
  3863. [ o2, conf2 ],
  3864. [ o3, conf3 ]
  3865. ];
  3866. createPosShow( x );
  3867. infx = inf[ ( ++ number ) - 1 ];
  3868. infx[0].attr( "src", infx[1].src.replace( "x.png", "xf.png" ) ).scale( 1e-5, 1e-5 );
  3869. this.scaleImage( infx[0] );
  3870. if( number == 3 )
  3871. message.postMessage( "game.over" );
  3872. };
  3873. exports.scaleImage = function( image ){
  3874. var dur = 500;
  3875. image.myOnScaling = image.myOnScaling || function( time, z ){
  3876. this.scale( z = back( time, 1e-5, 1 - 1e-5, dur ), z );
  3877. };
  3878. image.myOnScaleEnd = image.myOnScaleEnd || function(){
  3879. this.scale( 1, 1 );
  3880. };
  3881. timeline.createTask({
  3882. start: 0, duration: dur,
  3883. object: image, onTimeUpdate: image.myOnScaling, onTimeEnd: image.myOnScaleEnd,
  3884. recycle: this.anims
  3885. });
  3886. };
  3887. // 显示/隐藏 相关
  3888. exports.onTimeUpdate = function( time, mode, x1s, x1e, x2s, x2e, x3s, x3e ){
  3889. o1.attr( "x", anim( time, x1s, x1e - x1s, animLength ) );
  3890. o2.attr( "x", anim( time, x2s, x2e - x2s, animLength ) );
  3891. o3.attr( "x", anim( time, x3s, x3e - x3s, animLength ) );
  3892. };
  3893. exports.onTimeStart = function( mode ){
  3894. if( mode == "show" )
  3895. [ o1, o2, o3 ].invoke( "show" );
  3896. };
  3897. exports.onTimeEnd = function( mode ){
  3898. if( mode == "hide" )
  3899. [ o1, o2, o3 ].invoke( "hide" ),
  3900. this.reset();
  3901. };
  3902. function createPosShow( x ){
  3903. var image = layer.createImage( "default", "images/lose.png", x - 27, 406, 54, 50 ).scale( 1e-5, 1e-5 );
  3904. var duration = 500;
  3905. var control = {
  3906. show: function( start ){
  3907. timeline.createTask({
  3908. start: start, duration: duration, data: [ tween.back.co, 1e-5, 1 ],
  3909. object: this, onTimeUpdate: this.onScaling, onTimeEnd: this.onShowEnd
  3910. // recycle: anims
  3911. });
  3912. },
  3913. hide: function( start ){
  3914. timeline.createTask({
  3915. start: start, duration: duration, data: [ tween.back.ci, 1, 1e-5 ],
  3916. object: this, onTimeUpdate: this.onScaling, onTimeEnd: this.onHideEnd
  3917. // recycle: anims
  3918. });
  3919. },
  3920. onScaling: function( time, anim, a, b, z ){
  3921. image.scale( z = anim( time, a, b - a, duration ), z );
  3922. },
  3923. onShowEnd: function(){
  3924. this.hide( 1500 );
  3925. },
  3926. onHideEnd: function(){
  3927. image.remove();
  3928. }
  3929. };
  3930. control.show( 200 );
  3931. };
  3932. return exports;
  3933. });
  3934. /**
  3935. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\new-game.js
  3936. */
  3937. define("scripts/object/new-game.js", function(exports){
  3938. var rotate = require("scripts/factory/rotate");
  3939. var tween = require("scripts/lib/tween");
  3940. exports = rotate.create("images/new-game.png", 244, 231, 195, 195, 1e-5, tween.exponential.co, 500);;
  3941. return exports;
  3942. });
  3943. /**
  3944. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\new.js
  3945. */
  3946. define("scripts/object/new.js", function(exports){
  3947. var layer = require("scripts/layer");
  3948. var tween = require("scripts/lib/tween");
  3949. var timeline = require("scripts/timeline");
  3950. var Ucren = require("scripts/lib/ucren");
  3951. var image;
  3952. var cycleTime = 300;
  3953. var sx = 129, sy = 328, ex = 170, ey = 221, sw = 0, sh = 0, ew = 70, eh = 42, dy = 8;
  3954. var showAnim = tween.exponential.co;
  3955. var jumpAnim = tween.quadratic.ci;
  3956. exports.anims = [];
  3957. exports.set = function(){
  3958. image = layer.createImage( "default", "images/new.png", sx, sy, sw, sh );
  3959. };
  3960. exports.unset = function(){
  3961. };
  3962. exports.show = function( start ){
  3963. timeline.createTask({
  3964. start: start, duration: 500,
  3965. data: [ sx, ex, sy, ey, sw, ew, sh, eh ],
  3966. object: this, onTimeUpdate: this.onShowing, onTimeStart: this.onShowStart, onTimeEnd: this.onShowEnd,
  3967. recycle: this.anims
  3968. });
  3969. };
  3970. exports.hide = function( start ){
  3971. this.anims.clear();
  3972. timeline.createTask({
  3973. start: start, duration: 500,
  3974. data: [ ex, sx, ey, sy, ew, sw, eh, sh ],
  3975. object: this, onTimeUpdate: this.onShowing,
  3976. recycle: this.anims
  3977. });
  3978. };
  3979. exports.jump = function(){
  3980. this.anims.clear();
  3981. timeline.createTask({ start: 0, duration: -1, object: this, onTimeUpdate: this.onJumping, recycle: this.anims });
  3982. };
  3983. // 显示相关
  3984. exports.onShowStart = function(){
  3985. };
  3986. exports.onShowing = function( time, sx, ex, sy, ey, sw, ew, sh, eh ){
  3987. image.attr({
  3988. x: showAnim( time, sx, ex - sx, 500 ),
  3989. y: showAnim( time, sy, ey - sy, 500 ),
  3990. width: showAnim( time, sw, ew - sw, 500 ),
  3991. height: showAnim( time, sh, eh - sh, 500 )
  3992. });
  3993. };
  3994. exports.onShowEnd = function(){
  3995. this.jump();
  3996. };
  3997. // 跳跃相关
  3998. exports.onJumping = function(time){
  3999. var t = parseInt(time / cycleTime);
  4000. time = time % cycleTime;
  4001. if( t % 2 ) time = cycleTime - time;
  4002. image.attr("y", jumpAnim( time, ey, dy, cycleTime ));
  4003. };;
  4004. return exports;
  4005. });
  4006. /**
  4007. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\ninja.js
  4008. */
  4009. define("scripts/object/ninja.js", function(exports){
  4010. var displacement = require("scripts/factory/displacement");
  4011. var tween = require("scripts/lib/tween");
  4012. exports = displacement.create("images/ninja.png", 244, 81, 315, -140, 315, 43, {
  4013. show: tween.bounce.co,
  4014. hide: tween.exponential.co
  4015. }, 1e3);;
  4016. return exports;
  4017. });
  4018. /**
  4019. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\quit.js
  4020. */
  4021. define("scripts/object/quit.js", function(exports){
  4022. var rotate = require("scripts/factory/rotate");
  4023. var tween = require("scripts/lib/tween");
  4024. exports = rotate.create("images/quit.png", 493, 311, 141, 141, 1e-5, tween.exponential.co, 500);;
  4025. return exports;
  4026. });
  4027. /**
  4028. * @source D:\hosting\demos\fruit-ninja\output\scripts\object\score.js
  4029. */
  4030. define("scripts/object/score.js", function(exports){
  4031. var layer = require("scripts/layer");
  4032. var tween = require("scripts/lib/tween");
  4033. var timeline = require("scripts/timeline");
  4034. var Ucren = require("scripts/lib/ucren");
  4035. var setTimeout = timeline.setTimeout.bind( timeline );
  4036. var anim = tween.exponential.co;
  4037. var message = require("scripts/message");
  4038. /**
  4039. * 分数模块
  4040. */
  4041. var image, text1, text2, animLength = 500;;
  4042. var imageSx = -94, imageEx = 6;
  4043. var text1Sx = -59, text1Ex = 41;
  4044. var text2Sx = -93, text2Ex = 7;
  4045. exports.anims = [];
  4046. exports.set = function(){
  4047. image = layer.createImage( "default", "images/score.png", imageSx, 8, 29, 31 ).hide();
  4048. text1 = layer.createText( "default", "0", text1Sx, 24, "90-#fc7f0c-#ffec53", "30px" ).hide();
  4049. text2 = layer.createText( "default", "BEST 999", text2Sx, 48, "#af7c05", "14px" ).hide();
  4050. };
  4051. exports.show = function( start ){
  4052. timeline.createTask({
  4053. start: start, duration: animLength, data: [ "show", imageSx, imageEx, text1Sx, text1Ex, text2Sx, text2Ex ],
  4054. object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,
  4055. recycle: this.anims
  4056. });
  4057. };
  4058. exports.hide = function( start ){
  4059. timeline.createTask({
  4060. start: start, duration: animLength, data: [ "hide", imageEx, imageSx, text1Ex, text1Sx, text2Ex, text2Sx ],
  4061. object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,
  4062. recycle: this.anims
  4063. });
  4064. };
  4065. exports.number = function( number ){
  4066. text1.attr( "text", number || 0 );
  4067. image.scale( 1.2, 1.2 );
  4068. setTimeout(function(){
  4069. image.scale( 1, 1 );
  4070. }, 60);
  4071. // message.postMessage( number, "score.change" );
  4072. };
  4073. // 显示/隐藏 相关
  4074. exports.onTimeUpdate = function( time, mode, isx, iex, t1sx, t1ex, t2sx, t2ex ){
  4075. image.attr( "x", anim( time, isx, iex - isx, animLength ) );
  4076. text1.attr( "x", anim( time, t1sx, t1ex - t1sx, animLength ) );
  4077. text2.attr( "x", anim( time, t2sx, t2ex - t2sx, animLength ) );
  4078. };
  4079. exports.onTimeStart = function( mode ){
  4080. if( mode === "show" )
  4081. [ image, text1, text2 ].invoke( "show" );
  4082. };
  4083. exports.onTimeEnd = function( mode ){
  4084. if( mode === "hide" )
  4085. [ image, text1, text2 ].invoke( "hide" ),
  4086. text1.attr( "text", 0 );
  4087. };;
  4088. return exports;
  4089. });
  4090. startModule("scripts/main");

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/162808
推荐阅读
相关标签
  

闽ICP备14008679号