HTML5教程 H5和JS实现的切水果游戏
等等 2018-03-12 来源 :网络 阅读 1616 评论 0

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

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


所有JavaScript代码

/**

 * this file was compiled by jsbuild 0.9.6

 * @date Fri, 20 Jul 2012 16:21:18 UTC

 * @author dron

 * @site //ucren.com

 */

void function(global){

var mapping = {}, cache = {};

global.startModule = function(m){

require(m).start();

};

global.define = function(id, func){

mapping[id] = func;

};

global.require = function(id){

if(!/\.js$/.test(id))

id += '.js';

if(cache[id])

return cache[id];

else

return cache[id] = mapping[id]({});

};

}(this);

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\collide.js

 */ 

define("scripts/collide.js", function(exports){

var fruit = require("scripts/factory/fruit");

var Ucren = require("scripts/lib/ucren");


var fruits = fruit.getFruitInView();


/**

* 碰撞检测

*/


exports.check = function( knife ){

var ret = [], index = 0;


fruits.forEach(function( fruit ){

   var ck = lineInEllipse(

    knife.slice( 0, 2 ), 

    knife.slice( 2, 4 ), 

    [ fruit.originX, fruit.originY ],

    fruit.radius

   );

   if( ck )

       ret[ index ++ ] = fruit;

});

return ret;

};


function sqr(x){

return x * x;

}


function sign(n){

return n < 0 ? -1 : ( n > 0 ? 1 : 0 );

}


function equation12( a, b, c ){

if(a == 0)return;


var delta = b * b - 4 * a * c;

if(delta == 0)

return [ -1 * b / (2 * a), -1 * b / (2 * a) ];

else if(delta > 0)

return [ (-1 * b + Math.sqrt(delta)) / (2 * a),  (-1 * b - Math.sqrt(delta)) / (2 * a) ];

}


// 返回线段和椭圆的两个交点,如果不相交,返回 null

function lineXEllipse( p1, p2, c, r, e ){

// 线段:p1, p2    圆心:c    半径:r    离心率:e

if (r <= 0) return;

e = e === undefined ? 1 : e;

var t1 = r, t2 = r * e, k;


a = sqr( t2) * sqr(p1[0] - p2[0]) + sqr(t1) * sqr(p1[1] - p2[1]);


if (a <= 0) return;


b = 2 * sqr(t2) * (p2[0] - p1[0]) * (p1[0] - c[0]) + 2 * sqr(t1) * (p2[1] - p1[1]) * (p1[1] - c[1]);

c = sqr(t2) * sqr(p1[0] - c[0]) + sqr(t1) * sqr(p1[1] - c[1]) - sqr(t1) * sqr(t2);


if (!( k = equation12(a, b, c, t1, t2) )) return;


var result = [

[ p1[0] + k[0] * (p2[0] - p1[0]), p1[1] + k[0] * (p2[1] - p1[1]) ],

[ p1[0] + k[1] * (p2[0] - p1[0]), p1[1] + k[1] * (p2[1] - p1[1]) ]

];


if ( !( ( sign( result[0][0] - p1[0] ) * sign( result[0][0] - p2[0] ) <= 0 ) &&

( sign( result[0][1] - p1[1] ) * sign( result[0][1] - p2[1] ) <= 0 ) ) )

result[0] = null;


if ( !( ( sign( result[1][0] - p1[0] ) * sign( result[1][0] - p2[0] ) <= 0 ) &&

( sign( result[1][1] - p1[1] ) * sign( result[1][1] - p2[1] ) <= 0 ) ) )

result[1] = null;


return result;

}


// 判断计算线段和椭圆是否相交

function lineInEllipse( p1, p2, c, r, e ){

var t = lineXEllipse( p1, p2, c, r, e );

return t && ( t[0] || t[1] );

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\control.js

 */ 

define("scripts/control.js", function(exports){

var Ucren = require("scripts/lib/ucren");

var knife = require("scripts/object/knife");

var message = require("scripts/message");

var state = require("scripts/state");


var canvasLeft, canvasTop;


canvasLeft = canvasTop = 0;


exports.init = function(){

this.fixCanvasPos();

this.installDragger();

this.installClicker();

};


exports.installDragger = function(){

   var dragger = new Ucren.BasicDrag({ type: "calc" });


   dragger.on( "returnValue", function( dx, dy, x, y, kf ){

    if( kf = knife.through( x - canvasLeft, y - canvasTop ) )

           message.postMessage( kf, "slice" );

   });


   dragger.on( "startDrag", function(){

       knife.newKnife();

   });


   dragger.bind( document.documentElement );

};


exports.installClicker = function(){

   Ucren.addEvent( document, "click", function(){

       if( state( "click-enable" ).ison() )

        message.postMessage( "click" );

   });

};


exports.fixCanvasPos = function(){

var de = document.documentElement;


var fix = function( e ){

   canvasLeft = ( de.clientWidth - 640 ) / 2;

   canvasTop = ( de.clientHeight - 480 ) / 2 - 40;

};


fix();


Ucren.addEvent( window, "resize", fix );

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\game.js

 */ 

define("scripts/game.js", function(exports){

/**

* game logic

*/

var timeline = require("scripts/timeline");

var Ucren = require("scripts/lib/ucren");

var sound = require("scripts/lib/sound");

var fruit = require("scripts/factory/fruit");

var score = require("scripts/object/score");

var message = require("scripts/message");

var state = require("scripts/state");

var lose = require("scripts/object/lose");

var gameOver = require("scripts/object/game-over");

var knife = require("scripts/object/knife");

// var sence = require("scripts/sence");

var background = require("scripts/object/background");

var light = require("scripts/object/light");


var scoreNumber = 0;


var random = Ucren.randomNumber;


var volleyNum = 2, volleyMultipleNumber = 5;

var fruits = [];

var gameInterval;


var snd;

var boomSnd;


// fruit barbette

var barbette = function(){

   if( fruits.length >= volleyNum )

       return ;


   var startX = random( 640 ), endX = random( 640 ), startY = 600;

   var f = fruit.create( startX, startY ).shotOut( 0, endX );


   fruits.push( f );

   snd.play();


   barbette();

};


// start game

exports.start = function(){

   snd = sound.create( "sound/throw" );

   boomSnd = sound.create( "sound/boom" );

   timeline.setTimeout(function(){

       state( "game-state" ).set( "playing" );

       gameInterval = timeline.setInterval( barbette, 1e3 );

   }, 500);

};


exports.gameOver = function(){

   state( "game-state" ).set( "over" );

   gameInterval.stop();


   gameOver.show();


   // timeline.setTimeout(function(){

   //     // sence.switchSence( "home-menu" );

   //     // TODO: require 出现互相引用时,造成死循环,这个问题需要跟进,这里暂时用 postMessage 代替

   //     message.postMessage( "home-menu", "sence.switchSence" );

   // }, 2000);


   scoreNumber = 0;

   volleyNum = 2;

   fruits.length = 0;

};


exports.applyScore = function( score ){

   if( score > volleyNum * volleyMultipleNumber )

       volleyNum ++,

       volleyMultipleNumber += 50;

};


exports.sliceAt = function( fruit, angle ){

   var index;


   if( state( "game-state" ).isnot( "playing" ) )

       return;


   if( fruit.type != "boom" ){

       fruit.broken( angle );

       if( index = fruits.indexOf( fruit ) )

           fruits.splice( index, 1 );

       score.number( ++ scoreNumber );

       this.applyScore( scoreNumber );

   }else{

       boomSnd.play();

       this.pauseAllFruit();

       background.wobble();

       light.start( fruit );

   }

};


exports.pauseAllFruit = function(){

   gameInterval.stop();

   knife.pause();

   fruits.invoke( "pause" );

};


// message.addEventListener("fruit.fallOff", function( fruit ){

// var index;

// if( ( index = fruits.indexOf( fruit ) ) > -1 )

//    fruits.splice( index, 1 );

// });


message.addEventListener("fruit.remove", function( fruit ){

   var index;

   if( ( index = fruits.indexOf( fruit ) ) > -1 )

       fruits.splice( index, 1 );

});


var eventFruitFallOutOfViewer = function( fruit ){

   if( fruit.type != "boom" )

       lose.showLoseAt( fruit.originX );

};


state( "game-state" ).hook( function( value ){

   if( value == "playing" )

       message.addEventListener( "fruit.fallOutOfViewer", eventFruitFallOutOfViewer );

   else

       message.removeEventListener( "fruit.fallOutOfViewer", eventFruitFallOutOfViewer );

} );


message.addEventListener("game.over", function(){

   exports.gameOver();

   knife.switchOn();

});


message.addEventListener("overWhiteLight.show", function(){

   knife.endAll();

   for(var i = fruits.length - 1; i >= 0; i --)

       fruits[i].remove();

   background.stop();

});


message.addEventListener("click", function(){

   state( "click-enable" ).off();

   gameOver.hide();

   message.postMessage( "home-menu", "sence.switchSence" );

});;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\layer.js

 */ 

define("scripts/layer.js", function(exports){

/**

* layer manager

*/


var Raphael = require("scripts/lib/raphael");

var Ucren = require("scripts/lib/ucren");


var layers = {};

var zindexs = {

"default": zi(),

"light": zi(),

"knife": zi(),

"fruit": zi(),

"juice": zi(),

"flash": zi(),

"mask": zi()

};


exports.createImage = function( layer, src, x, y, w, h ){

layer = this.getLayer( layer );

   return layer.image( src, x, y, w, h );

};


exports.createText = function( layer, text, x, y, fill, size ){

layer = this.getLayer( layer );


if( Ucren.isIe )

y += 2;


return layer.text(x, y, text).attr({

fill: fill || "#fff",

"font-size": size || "14px",

"font-family": "黑体",

"text-anchor": "start"

});

};


exports.getLayer = function( name ){

var p, layer;

name = name || "default";


if( p = layers[name] ){

   return p;

}else{

layer = Ucren.makeElement( "div", { "class": "layer", "style": "z-index: " + ( zindexs[name] || 0 ) + ";" } );

Ucren.Element( "extra" ).add( layer );

p = layers[name] = Raphael( layer, 640, 480 );

// if( Ucren.isSafari )

//     p.safari();

return p;

}

};


function zi(){

   return zi.num = ++ zi.num || 2;

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\main.js

 */ 

define("scripts/main.js", function(exports){

var timeline = require("scripts/timeline");

var tools = require("scripts/tools");

var sence = require("scripts/sence");

var Ucren = require("scripts/lib/ucren");

var buzz = require("scripts/lib/buzz");

var control = require("scripts/control");

var csl = require("scripts/object/console");

var message = require("scripts/message");

var state = require("scripts/state");


var game = require("scripts/game");


var collide = require("scripts/collide");


var setTimeout = timeline.setTimeout.bind( timeline );


var log = function(){

   var time = 1e3, add = 300, fn;

   fn = function( text ){

       setTimeout( function(){ csl.log( text ); }, time );

       time += add;

   };

   fn.clear = function(){

       setTimeout( csl.clear.bind( csl ), time );

       time += add;

   };

   return fn;

}();


exports.start = function(){


   [ timeline, sence, control ].invoke( "init" );


   log( "正在加载鼠标控制脚本" );

   log( "正在加载图像资源" );

log( "正在加载游戏脚本" );

   log( "正在加载剧情" );

   log( "正在初始化" );

log( "正在启动游戏..." );

   log.clear();


   setTimeout( sence.switchSence.saturate( sence, "home-menu" ), 3000 );

};


message.addEventListener("slice", function( knife ){

   var fruits = collide.check( knife ), angle;

   if( fruits.length )

       angle = tools.getAngleByRadian( tools.pointToRadian( knife.slice(0, 2), knife.slice(2, 4) ) ),

       fruits.forEach(function( fruit ){

          message.postMessage( fruit, angle, "slice.at" );

       });

});


message.addEventListener("slice.at", function( fruit, angle ){


   if( state( "sence-state" ).isnot( "ready" ) )

       return ;


   if( state( "sence-name" ).is( "game-body" ) ){

       game.sliceAt( fruit, angle );

       return ;

   }


   if( state( "sence-name" ).is( "home-menu" ) ){

       fruit.broken( angle );

       if( fruit.isHomeMenu )

           switch( 1 ){

               case fruit.isDojoIcon:

                   sence.switchSence( "dojo-body" ); break;

               case fruit.isNewGameIcon:

                   sence.switchSence( "game-body" ); break;

               case fruit.isQuitIcon:

                   sence.switchSence( "quit-body" ); break;

           }

       return ;

   }

});


var tip = "";


if( !Ucren.isChrome )

   tip = "$为了获得最佳流畅度,推荐您使用 <span class='b'>Google Chrome</span> 体验本游戏";


if( !buzz.isSupported() )

   tip = tip.replace( "$", "您的浏览器不支持 &lt;audio&gt 播放声效,且" );


tip = tip.replace( "$", "" );


Ucren.Element( "browser" ).html( tip );;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\message.js

 */ 

define("scripts/message.js", function(exports){

/**

* a simple message manager

* @author dron

* @date 2012-06-27

*/


var Ucren = require("scripts/lib/ucren");


/**

* send a message

* @param  {Any} message,message... message contents

* @param  {String} to message address

*/

exports.postMessage = function( message/*, message, message... */, to ){

var messages = [].slice.call( arguments, 0 ),

splitIndex = messages.length - 1;


to = messages[ splitIndex ];

messages.slice( 0, splitIndex );


Ucren.dispatch( to, messages );

};


/**

* bind an message handler

* @param {String}   from message address

* @param {Function} fn message handler

*/

exports.addEventListener = function( from, fn ){

Ucren.dispatch( from, fn );

};


/**

* remove an message handler

* @param {String}   from message address

* @param {Function} fn message handler

*/

exports.removeEventListener = function( from, fn ){

Ucren.dispatch.remove( from, fn );

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\sence.js

 */ 

define("scripts/sence.js", function(exports){

var Ucren = require("scripts/lib/ucren");

var sound = require("scripts/lib/sound");

var fruit = require("scripts/factory/fruit");

var flash = require("scripts/object/flash");


var state = require("scripts/state");

var message = require("scripts/message");


// the fixed elements

var background = require("scripts/object/background");

var fps = require("scripts/object/fps");


// the home page elements

var homeMask = require("scripts/object/home-mask");

var logo = require("scripts/object/logo");

var ninja = require("scripts/object/ninja")

var homeDesc = require("scripts/object/home-desc");


var dojo = require("scripts/object/dojo");

var newGame = require("scripts/object/new-game");

var quit = require("scripts/object/quit");

var newSign = require("scripts/object/new");

var peach, sandia, boom;


// the elements in game body

var score = require("scripts/object/score");

var lose = require("scripts/object/lose");


// the game logic

var game = require("scripts/game");


// the elements in 'developing' module

var developing = require("scripts/object/developing");

var gameOver = require("scripts/object/game-over");


// commons

var message = require("scripts/message");

var timeline = require("scripts/timeline");

var setTimeout = timeline.setTimeout.bind( timeline );

var setInterval = timeline.setInterval.bind( timeline );


var menuSnd;

var gameStartSnd;


// initialize sence

exports.init = function(){

   menuSnd = sound.create( "sound/menu" );

   gameStartSnd = sound.create( "sound/start" );

[ background, homeMask, logo, ninja, homeDesc, dojo, newSign, newGame, quit, score, lose, developing, gameOver, flash /*, fps */ ].invoke( "set" );

   // setInterval( fps.update.bind( fps ), 500 );

};


// switch sence

exports.switchSence = function( name ){

   var curSence = state( "sence-name" );

   var senceState = state( "sence-state" );


   if( curSence.is( name ) )

       return ;


   var onHide = function(){

       curSence.set( name );

       senceState.set( "entering" );

       switch( name ){

           case "home-menu": this.showMenu( onShow ); break;

           case "dojo-body": this.showDojo( onShow ); break;

           case "game-body": this.showNewGame( onShow ); break;

           case "quit-body": this.showQuit( onShow ); break;

       }

   }.bind( this );


   var onShow = function(){

       senceState.set( "ready" );


       if( name == "dojo-body" || name == "quit-body" ){

           exports.switchSence( "home-menu" );

       }

   };


   senceState.set( "exiting" );


   if( curSence.isunset() ) onHide();

   else if( curSence.is( "home-menu" ) ) this.hideMenu( onHide );

   else if( curSence.is( "dojo-body" ) ) this.hideDojo( onHide );

   else if( curSence.is( "game-body" ) ) this.hideNewGame( onHide );

   else if( curSence.is( "quit-body" ) ) this.hideQuit( onHide );

};


// to enter home page menu

exports.showMenu = function( callback ){

   var callee = arguments.callee;

   var times = callee.times = ++ callee.times || 1;


   peach = fruit.create( "peach", 137, 333, true );

   sandia = fruit.create( "sandia", 330, 322, true );

   boom = fruit.create( "boom", 552, 367, true, 2500 );


   [ peach, sandia, boom ].forEach(function( f ){ f.isHomeMenu = 1; });

   peach.isDojoIcon = sandia.isNewGameIcon = boom.isQuitIcon = 1;


   var group = [

    [ homeMask, 0 ], 

    [ logo, 0 ], 


    [ ninja, 500 ], 

    [ homeDesc, 1500 ], 


    [ dojo, 2000 ], 

    [ newGame, 2000 ], 

    [ quit, 2000 ],


       [ newSign, 2000 ],


       [ peach, 2000 ],

       [ sandia, 2000 ],

       [ boom, 2000 ]

   ];


   group.invoke( "show" );

   [ peach, sandia ].invoke( "rotate", 2500 );


   menuSnd.play();

   setTimeout( callback, 2500 );

};


// to exit home page menu

exports.hideMenu = function( callback ){

   [ newSign, dojo, newGame, quit ].invoke( "hide" );

   [ homeMask, logo, ninja, homeDesc ].invoke( "hide" );

   [ peach, sandia, boom ].invoke( "fallOff", 150 );


   menuSnd.stop();

   setTimeout( callback, fruit.getDropTimeSetting() );

};


// to enter game body

exports.showNewGame = function( callback ){

   score.show();

   lose.show();

   game.start();


   gameStartSnd.play();

   setTimeout( callback, 1000 );

};


// to exit game body

exports.hideNewGame = function( callback ){

   score.hide();

   lose.hide();


   gameStartSnd.stop();

   setTimeout( callback, 1000 );

};


// to enter dojo mode

exports.showDojo = function( callback ){

   developing.show( 250 );

   setTimeout( callback, 1500 );

};


// to exit dojo mode

exports.hideDojo = function( callback ){

   // TODO: 

   setTimeout( callback, 1000 );

};


// to enter quit page

exports.showQuit = function( callback ){

   developing.show( 250 );

   setTimeout( callback, 1500 );

};


// to exit quit page

exports.hideQuit = function( callback ){

   // TODO: 

   setTimeout( callback, 1000 );

};


message.addEventListener("sence.switchSence", function( name ){

   exports.switchSence( name );

});;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\state.js

 */ 

define("scripts/state.js", function(exports){

/**

* a simple state manager

* @author dron

* @date 2012-06-28

*/

var Ucren = require("scripts/lib/ucren");

var timeline = require("scripts/timeline");


/**

* usage:

* state( key ).is( value ) -> determine if the value of key is the given value

* state( key ).isnot( value ) -> determine if the value of key is not given value

* state( key ).ison() -> determine if the value of key is the boolean value 'true'

* state( key ).isoff() -> determine if the value of key is the boolean value 'false'

* state( key ).isunset() -> determine if the value of key is undefined

* state( key ).set( value ) -> set the value of key to a given value

* state( key ).get() -> get the value of key

* state( key ).on() -> set the value of key to boolean value 'true'

* state( key ).off() -> set the value of key to boolean value 'false'

*/


var stack = {};

var cache = {};

var callbacks = {};


exports = function( key ){


if( cache[ key ] )

   return cache[ key ];


return cache[ key ] = {

is: function( value ){

   return stack[key] === value;

},


isnot: function( value ){

   return stack[key] !== value;

},


ison: function(){

return this.is( true );

},


isoff: function(){

return this.isnot( true );

},


isunset: function(){

return this.is( undefined );

},


set: function(){

var lastValue = NaN;

return function( value ){

   var c;

   stack[key] = value;

   if( lastValue !== value && ( c = callbacks[ key ] ) )

    for(var i = 0, l = c.length; i < l; i ++)

    c[i].call( this, value );

  lastValue = value;

}

}(),


get: function(){

   return stack[key];

},


on: function(){

var me = this;

me.set( true );

return {

keep: function( time ){

timeline.setTimeout( me.set.saturate( me, false ), time );

}

}

},


off: function(){

var me = this;

   me.set( false );

   return {

    keep: function( time ){

    timeline.setTimeout( me.set.saturate( me, true ), time );

    }

   }

},


hook: function( fn ){

var c;

   if( !( c = callbacks[ key ] ) )

       callbacks[ key ] = [ fn ];

   else

    c.push( fn );

},


unhook: function(){

   // TODO: 

}

}

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\timeline.js

 */ 

define("scripts/timeline.js", function(exports){

/**

* a easy timeline manager

* @version 1.0

* @author dron

*/


var Ucren = require("scripts/lib/ucren");

var timerCache = {};

var timeline = {};


// var timer = timeline;

// <or>

// var timer = timeline.use( name ).init( 10 ); // to use a new timeline instance

// 

// var t = timer.createTask(...);

// t.stop();

// 

// timer.setTimeout(...);

// timer.setInterval(...);

// timer.getFPS();


function ClassTimer(){

   this.tasks = [];

   this.addingTasks = [];

   this.adding = 0;

}


/**

* initialize timeline

*/

ClassTimer.prototype.init = function( ms ){

var me = this;


if( me.inited )

   return ;

else

me.inited = 1;


me.startTime = now();

me.intervalTime = ms || 5;

me.count = 0;


me.intervalFn = function(){

   me.count ++;

   me.update( now() );

};


me.start();


return me;

};


/**

* create a task

* @param  {Object} conf the config

* @return {Task} a task instance

*/

ClassTimer.prototype.createTask = function( conf ){

/* e.g. timer.createTask({

start: 500, duration: 2000, data: [a, b, c,..], object: module, 

onTimeUpdate: fn(time, a, b, c,..), onTimeStart: fn(a, b, c,..), onTimeEnd: fn(a, b, c,..),

recycle: []

}); */

var task = createTask( conf );

   this.addingTasks.unshift( task );

   this.adding = 1;


   if( conf.recycle )

    this.taskList( conf.recycle, task );


   this.start();


   return task;

};


/**

* use a array to recycle the task

* @param  {Array} queue be use for recycling task

* @param  {Task} task a task instance

* @return {Array} this queue

*/

ClassTimer.prototype.taskList = function( queue, task ){

if( !queue.clear )

queue.clear = function(){

var i = this.length;

while( i -- )

task = this[i],

task.stop(),

this.splice( i, 1 );

return this;

};


if( task )

   queue.unshift( task );


return queue;

};


/**

* create a timer for once callback

* @param {Function} fn callback function

* @param {Number}   time time, unit: ms

*/

ClassTimer.prototype.setTimeout = function( fn, time ){

   // e.g. setTimeout(fn, time);

   return this.createTask({ start: time, duration: 0, onTimeStart: fn });

};


/**

* create a timer for ongoing callback

* @param {Function} fn callback function

* @param {Number}   time time, unit: ms

*/

ClassTimer.prototype.setInterval = function( fn, time ){

   // e.g. setInterval(fn, time);

   var timer = setInterval( fn, time );

   return {

    stop: function(){

       clearInterval( timer );

    }

   };

};


/**

* get the current fps

* @return {Number} fps number

*/

ClassTimer.prototype.getFPS = function(){

var t = now(), c = this.count, fps = c / ( t - this.startTime ) * 1e3;

if( c > 1e3 )

this.count = 0,

this.startTime = t;

return fps;

};


// privates


ClassTimer.prototype.start = function(){

clearInterval( this.interval );

this.interval = setInterval( this.intervalFn, this.intervalTime );

};


ClassTimer.prototype.stop = function(){

clearInterval( this.interval );

};


ClassTimer.prototype.update = function( time ){

var tasks = this.tasks, addingTasks = this.addingTasks, adding = this.adding;

var i = tasks.length, t, task, start, duration, data;


while( i -- ){

    task = tasks[i];

    start = task.start;

    duration = task.duration;


    if( time >= start ){


    if( task.stopped ){

       tasks.splice( i, 1 );

       continue;

    }


    checkStartTask( task );

    if( ( t = time - start ) < duration )

       updateTask( task, t );

    else

    updateTask( task, duration ),

    task.onTimeEnd.apply( task.object, task.data.slice(1) ),

    tasks.splice( i, 1 );

    }

}


   if( adding )

    tasks.unshift.apply( tasks, addingTasks ),

    addingTasks.length = adding = 0;


   if( !tasks.length )

    this.stop();

};


timeline.use = function( name ){

var module;


if( module = timerCache[ name ] )

   return module;

else

module = timerCache[ name ] = new ClassTimer;


return module;

};


/**

* @functions

*/


var now = function(){

return new Date().getTime();

};


var createTask = function( conf ){

var object = conf.object || {};

conf.start = conf.start || 0;

return {

start: conf.start + now(),

duration: conf.duration == -1 ? 86400000 : conf.duration,

data: conf.data ? [ 0 ].concat( conf.data ) : [ 0 ],

started: 0,

object: object,

onTimeStart: conf.onTimeStart || object.onTimeStart || Ucren.nul,

onTimeUpdate: conf.onTimeUpdate || object.onTimeUpdate || Ucren.nul,

onTimeEnd: conf.onTimeEnd || object.onTimeEnd || Ucren.nul,

stop: function(){

   this.stopped = 1;

}

}

};


var updateTask = function( task, time ){

var data = task.data;

data[0] = time;

task.onTimeUpdate.apply( task.object, data );

};


var checkStartTask = function( task ){

if( !task.started )

task.started = 1,

   task.onTimeStart.apply( task.object, task.data.slice(1) ),

   updateTask( task, 0 );

};


/**

* for compatible the old version

*/

exports = timeline.use( "default" ).init( 10 );

exports.use = function( name ){

if( Ucren.isIe )

   exports;

return timeline.use( name );

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\tools.js

 */ 

define("scripts/tools.js", function(exports){

exports.unsetObject = function( object ){

for(var i in object)

   if(object.hasOwnProperty(i) && typeof object[i] == "function")

    object[i] = function(){};

};


exports.getAngleByRadian = function( radian ){

return radian * 180 / Math.PI;

}


exports.pointToRadian = function( origin, point ){

var PI = Math.PI;


if( point[0] === origin[0] ){

if ( point[1] > origin[1] )

return PI * 0.5;

return PI * 1.5

}else if( point[1] === origin[1] ){

if ( point[0] > origin[0] )

return 0;

return PI;

}


var t = Math.atan( ( origin[1] - point[1] ) / ( origin[0] - point[0] ) );


if( point[0] > origin[0] && point[1] < origin[1] )

return t + 2 * PI;


if( point[0] > origin[0] && point[1] > origin[1] )

return t;


return t + PI;

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\displacement.js

 */ 

define("scripts/factory/displacement.js", function(exports){

var layer = require("scripts/layer");

var timeline = require("scripts/timeline");

var tween = require("scripts/lib/tween");


/**

* 位移类模块模型

*/


exports.create = function( imageSrc, width, height, origX, origY, targetX, targetY, animMap, animDur ){

var module = {};

var image;


var anim = {};


if( typeof animMap === "function" )

   anim.show = anim.hide = animMap;

else

anim = animMap;


var createTask = function( start, duration, sx, sy, ex, ey, anim, mode ){

timeline.createTask({

start: start,

duration: duration,

object: module, data: [ sx, sy, ex, ey, anim, mode ],

onTimeUpdate: module.onTimeUpdate, onTimeStart: module.onTimeStart, onTimeEnd: module.onTimeEnd,

recycle: module.anims

});

};


module.anims = [];


module.set = function(){

image = layer.createImage( "default", imageSrc, origX, origY, width, height );

};


module.show = function( start ){

createTask(  start, animDur, origX, origY, targetX, targetY, anim.show, "show" );

};


module.hide = function(){

this.anims.clear();

createTask( 0, animDur, targetX, targetY, origX, origY, anim.hide, "hide" );

};


module.onTimeUpdate = function( time, sx, sy, ex, ey, anim ){

   image.attr( {

    x: anim( time, sx, ex - sx, animDur ),

    y: anim( time, sy, ey - sy, animDur )

   } );

};


module.onTimeStart = function(){


};


module.onTimeEnd = function( sx, sy, ex, ey, anim ){

   if( anim === "hide" )

    image.hide();

};


return module;

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\fruit.js

 */ 

define("scripts/factory/fruit.js", function(exports){

var layer = require("scripts/layer");

var Ucren = require("scripts/lib/ucren");

var timeline = require("scripts/timeline").use( "fruit" ).init( 1 );

var timeline2 = require("scripts/timeline").use( "fruit-apart" ).init( 1 );

var tween = require("scripts/lib/tween");

var message = require("scripts/message");

var flame = require("scripts/object/flame");

var flash = require("scripts/object/flash");

var juice = require("scripts/factory/juice");


var ie = Ucren.isIe;

var safari = Ucren.isSafari;


/**

* 水果模块模型

*/


var zoomAnim = tween.exponential.co;

var rotateAnim = tween.circular;

var linearAnim = tween.linear;

var dropAnim = tween.quadratic.ci;

var fallOffAnim = tween.quadratic.co;


var random = Ucren.randomNumber;

var min = Math.min;

var average = function( a, b ){ return ( ( a + b ) / 2 ) >> 0; };


var dropTime = 1200, dropXScope = 200, shadowPos = 50;


var infos = {

// type: [ imageSrc, width, height, radius, fixAngle, isReverse, juiceColor ]

boom: [ "images/fruit/boom.png", 66, 68, 26, 0, 0, null ],

peach: [ "images/fruit/peach.png", 62, 59, 37, -50, 0, "#e6c731" ],

sandia: [ "images/fruit/sandia.png", 98, 85, 38, -100, 0, "#c00" ],

apple: [ "images/fruit/apple.png", 66, 66, 31, -54, 0, "#c8e925" ],

banana: [ "images/fruit/banana.png", 126, 50, 43, 90, 0, null ],

basaha: [ "images/fruit/basaha.png", 68, 72, 32, -135, 0, "#c00" ]

};


// TODO: 是否水果全开?

var types = [ "peach", "sandia", "apple", "banana", "basaha" ];

// var types = [ "sandia", "boom" ];

var rotateSpeed = [ 60, 50, 40, -40, -50, -60 ];


var fruitCache = [];


function ClassFruit(conf){

   var info = infos[ conf.type ], radius = info[3];


this.type = conf.type;

   this.originX = conf.originX;

   this.originY = conf.originY;

   this.radius = radius;

   this.startX = conf.originX;

   this.startY = conf.originY;

   this.radius = radius;


   this.anims = [];


   if( this.type === "boom" )

       this.flame = flame.create( this.startX - radius + 4, this.startY - radius + 5, conf.flameStart || 0 );

}


ClassFruit.prototype.set = function( hide ){

var inf = infos[ this.type ], radius = this.radius;


this.shadow = layer.createImage( "fruit", "images/shadow.png", this.startX - radius, this.startY - radius + shadowPos, 106, 77 );

this.image = layer.createImage( "fruit", inf[0], this.startX - radius, this.startY - radius, inf[1], inf[2] );


if( hide )

this.image.hide(),

this.shadow.hide();


return this;

};


ClassFruit.prototype.pos = function( x, y ){

if( x == this.originX && y == this.originY )

   return ;


var r = this.radius;


this.originX = x;

this.originY = y;


this.image.attr({ x: x -= r, y: y -= r });

this.shadow.attr({ x: x, y: y + shadowPos });


if( this.type === "boom" )

   this.flame.pos( x + 4, y + 5 );

};


ClassFruit.prototype.show = function( start ){

timeline.createTask({ 

start: start, duration: 500, data: [ 1e-5, 1, "show" ], 

object: this, onTimeUpdate: this.onScaling, onTimeStart: this.onShowStart,

recycle: this.anims

});

};


ClassFruit.prototype.hide = function( start ){

if( this.type !== "boom" ) // if it is not a boom, it can't to be hide.

   return ;


this.anims.clear();

this.flame.remove();

timeline.createTask({ 

start: start, duration: 500, data: [ 1, 1e-5, "hide" ], 

object: this, onTimeUpdate: this.onScaling, onTimeEnd: this.onHideEnd,

recycle: this.anims

});

};


ClassFruit.prototype.rotate = function( start, speed ){

this.rotateSpeed = speed || rotateSpeed[ random( 6 ) ];

this.rotateAnim = timeline.createTask({

start: start, duration: -1, 

object: this, onTimeUpdate: this.onRotating,

recycle: this.anims

});

};


ClassFruit.prototype.broken = function( angle ){

if( this.brokend )return;

this.brokend = true;


var index;

if( ( index = fruitCache.indexOf( this ) ) > -1 )

   fruitCache.splice( index, 1 );


if( this.type !== "boom" )

flash.showAt( this.originX, this.originY, angle ),

juice.create( this.originX, this.originY, infos[ this.type ][6] ),

   this.apart( angle );

else

this.hide();

};


ClassFruit.prototype.pause = function(){

if( this.brokend )

   return;

this.anims.clear();

if( this.type == "boom" )

   this.flame.remove();

};


// 分开

ClassFruit.prototype.apart = function( angle ){

this.anims.clear();

this.image.hide();

this.shadow.hide();

this.aparted = true;


var inf = infos[ this.type ], preSrc = inf[0].replace( ".png", "" ), radius = this.radius;

var create = layer.createImage.saturate( layer, this.startX - radius, this.startY - radius, inf[1], inf[2] );


angle = ( ( angle % 180 ) + 360 + inf[4] ) % 360;


this.bImage1 = create( "fruit", preSrc + "-1.png" );

this.bImage2 = create( "fruit", preSrc + "-2.png" );


[ this.bImage1, this.bImage2 ].invoke( "rotate", angle );


this.apartAngle = angle;

timeline2.createTask({ 

start: 0, duration: dropTime, object: this, 

onTimeUpdate: this.onBrokenDropUpdate, onTimeStart: this.onBrokenDropStart, onTimeEnd: this.onBrokenDropEnd,

recycle: this.anims

});

};


// 抛出

ClassFruit.prototype.shotOut = function(){

var sign = [ -1, 1 ];

   return function( start, endX ){


this.shotOutStartX = this.originX;

this.shotOutStartY = this.originY;

this.shotOutEndX = average( this.originX, endX );

this.shotOutEndY = min( this.startY - random( this.startY - 100 ), 200 );

this.fallOffToX = endX;


timeline.createTask({

start: start, duration: dropTime, object: this,

onTimeUpdate: this.onShotOuting, onTimeStart: this.onShotOutStart, onTimeEnd: this.onShotOutEnd,

recycle: this.anims

});


if( this.type != "boom" )

this.rotate( 0, ( random( 180 ) + 90 ) * sign[ random( 2 ) ] );


return this;

};

}();


// 掉落

ClassFruit.prototype.fallOff = function(){

var sign = [ -1, 1 ];

var signIndex = 0;

   return function( start, x ){


if( this.aparted || this.brokend )

return ;


var y = 600;


if( typeof x !== "number" )

   x = this.originX + random( dropXScope ) * sign[ ( signIndex ++ ) % 2 ];


this.fallTargetX = x;

this.fallTargetY = y;


timeline.createTask({

start: start, duration: dropTime, object: this,

onTimeUpdate: this.onFalling, onTimeStart: this.onFallStart, onTimeEnd: this.onFallEnd,

recycle: this.anims

});

}

}();


ClassFruit.prototype.remove = function(){

var index;


this.anims.clear();


if( this.image )

this.image.remove(),

this.shadow.remove();


if( this.bImage1 )

this.bImage1.remove(),

this.bImage2.remove();


if( this.type === "boom" )

   this.flame.remove();


if( ( index = fruitCache.indexOf( this ) ) > -1 )

   fruitCache.splice( index, 1 );


for(var name in this)

if( typeof this[name] === "function" )

this[name] = function( name ){

   return function(){

   throw new Error( "method " + name + " has been removed" );

};

}( name );

else delete this[name];


message.postMessage( this, "fruit.remove" );

};


// 显示/隐藏 相关


ClassFruit.prototype.onShowStart = function(){

this.image.show();

// this.shadow.show();

};


ClassFruit.prototype.onScaling = function( time, a, b, z ){

this.image.scale( z = zoomAnim( time, a, b - a, 500 ), z );

this.shadow.scale( z, z );

};


ClassFruit.prototype.onHideEnd = function(){

this.remove();

};


// 旋转相关


ClassFruit.prototype.onRotateStart = function(){


};


ClassFruit.prototype.onRotating = function( time ){

this.image.rotate( ( this.rotateSpeed * time / 1e3 ) % 360, true );

};


// 裂开相关


ClassFruit.prototype.onBrokenDropUpdate = function( time ){

var radius = this.radius;

this.bImage1.attr({ 

x: linearAnim( time, this.brokenPosX - radius, this.brokenTargetX1, dropTime ), 

y: dropAnim( time, this.brokenPosY - radius, this.brokenTargetY1 - this.brokenPosY + radius, dropTime ) 

}).rotate( linearAnim( time, this.apartAngle, this.bImage1RotateAngle, dropTime ), true );

this.bImage2.attr({ 

x: linearAnim( time, this.brokenPosX - radius, this.brokenTargetX2, dropTime ), 

y: dropAnim( time, this.brokenPosY - radius, this.brokenTargetY2 - this.brokenPosY + radius, dropTime ) 

}).rotate( linearAnim( time, this.apartAngle, this.bImage2RotateAngle, dropTime ), true );

};


ClassFruit.prototype.onBrokenDropStart = function(){

this.brokenTargetX1 = -( random( dropXScope ) + 75 );

this.brokenTargetX2 = random( dropXScope + 75 );

this.brokenTargetY1 = 600;

this.brokenTargetY2 = 600;

this.brokenPosX = this.originX;

this.brokenPosY = this.originY;

this.bImage1RotateAngle = - random( 150 ) - 50;

this.bImage2RotateAngle = random( 150 ) + 50;


for(var f, i = fruitCache.length - 1; i >= 0; i --)

if( fruitCache[i] === this )

fruitCache.splice( i, 1 );

};


ClassFruit.prototype.onBrokenDropEnd = function(){

this.remove();

};


// 抛出相关


ClassFruit.prototype.onShotOuting = function( time ){

this.pos(

linearAnim( time, this.shotOutStartX, this.shotOutEndX - this.shotOutStartX, dropTime ),

fallOffAnim( time, this.shotOutStartY, this.shotOutEndY - this.shotOutStartY, dropTime )

);

};


ClassFruit.prototype.onShotOutStart = function(){

// body...

};


ClassFruit.prototype.onShotOutEnd = function(){

this.fallOff( 0, this.fallOffToX );

};


// 掉落相关


ClassFruit.prototype.onFalling = function( time ){

var y;

this.pos( 

linearAnim( time, this.brokenPosX, this.fallTargetX - this.brokenPosX, dropTime ), 

y = dropAnim( time, this.brokenPosY, this.fallTargetY - this.brokenPosY, dropTime ) 

);

this.checkForFallOutOfViewer( y );

};


ClassFruit.prototype.onFallStart = function(){

this.brokenPosX = this.originX;

this.brokenPosY = this.originY;

};


ClassFruit.prototype.onFallEnd = function(){

message.postMessage( this, "fruit.fallOff" );

this.remove();

};


// privates


ClassFruit.prototype.checkForFallOutOfViewer = function( y ){

if( y > 480 + this.radius )

this.checkForFallOutOfViewer = Ucren.nul,

this.rotateAnim && this.rotateAnim.stop(),

   message.postMessage( this, "fruit.fallOutOfViewer" );

};


exports.create = function( type, originX, originY, isHide, flameStart ){

if( typeof type == "number" ) // 缺省 type

isHide = originY,

originY = originX,

   originX = type,

   type = getType();


var fruit = new ClassFruit({ type: type, originX: originX, originY: originY, flameStart: flameStart }).set( isHide );

fruitCache.unshift( fruit );


return fruit;

};


exports.getFruitInView = function(){

   return fruitCache;

};


exports.getDropTimeSetting = function(){

return dropTime;

};


function getType(){

if( random( 8 ) == 4 )

   return "boom";

else

    return types[ random( 5 ) ];

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\juice.js

 */ 

define("scripts/factory/juice.js", function(exports){

/**

* 果汁

*/

var Ucren = require("scripts/lib/ucren");

var layer = require("scripts/layer").getLayer("juice");

var timeline = require("scripts/timeline").use( "juice" ).init( 10 );

var tween = require("scripts/lib/tween");

var tools = require("scripts/tools");


var random = Ucren.randomNumber;

var dur = 1500;

var anim = tween.exponential.co;

var dropAnim = tween.quadratic.co;

var sin = Math.sin;

var cos = Math.cos;


var num = 10;

var radius = 10;


// if( Ucren.isIe6 || Ucren.isSafari )

//     switchOn = false;


// if( Ucren.isIe || Ucren.isSafari )

// num = 6;


function ClassJuice( x, y, color ){

this.originX = x;

this.originY = y;

this.color = color;


   this.distance = random( 200 ) + 100;

   this.radius = radius;

   this.dir = random( 360 ) * Math.PI / 180;

}


ClassJuice.prototype.render = function(){

this.circle = layer.circle( this.originX, this.originY, this.radius ).attr({

fill: this.color,

stroke: "none"

});

};


ClassJuice.prototype.sputter = function(){

timeline.createTask({

start: 0, duration: dur,

object: this, onTimeUpdate: this.onTimeUpdate, onTimeEnd: this.onTimeEnd

});

};


ClassJuice.prototype.onTimeUpdate = function( time ){

var distance, x, y, z;


distance = anim( time, 0, this.distance, dur );

x = this.originX + distance * cos( this.dir );

y = this.originY + distance * sin( this.dir ) + dropAnim( time, 0, 200, dur );

z = anim( time, 1, -1, dur );


this.circle.attr({ cx: x, cy: y }).scale( z, z );

};


ClassJuice.prototype.onTimeEnd = function(){

this.circle.remove();

tools.unsetObject( this );

};


exports.create = function( x, y, color ){

   for(var i = 0; i < num; i ++)

    this.createOne( x, y, color );

};


exports.createOne = function( x, y, color ){

if( !color )

   return;


var juice = new ClassJuice( x, y, color );

juice.render();

juice.sputter();

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\factory\rotate.js

 */ 

define("scripts/factory/rotate.js", function(exports){

var layer = require("scripts/layer");

var timeline = require("scripts/timeline");

var Ucren = require("scripts/lib/ucren");


/**

* 旋转类模块模型

*/


exports.create = function( imageSrc, x, y, w, h, z, anim, animDur ){

var module = {}, image;

var rotateDire = [12, -12][Ucren.randomNumber(2)];

var defaultAngle = Ucren.randomNumber(360);


module.anims = [];


module.set = function(){

   image = layer.createImage( "default", imageSrc, x, y, w, h ).scale( z, z ).rotate( defaultAngle, true );

};


module.show = function(start){

timeline.createTask({ 

start: start, 

duration: animDur, 

object: this, 

data: [z, 1], 

onTimeUpdate: this.onZooming,

onTimeEnd: this.onShowEnd,

recycle: this.anims

});

};


module.hide = function(start){

this.anims.clear();

timeline.createTask({ 

start: start, 

duration: animDur, 

object: this, 

data: [ 1, z ], 

onTimeUpdate: this.onZooming,

recycle: this.anims

});

};


module.onShowEnd = function(name){

this.anims.clear();

timeline.createTask({ 

start: 0, 

duration: -1, 

object: this, 

onTimeUpdate: module.onRotating,

recycle: this.anims

});

};


module.onZooming = function(){

var z;

return function( time, a, b ){

   image.scale( z = anim( time, a, b - a, animDur ), z );

}

}();


module.onRotating = function(){

var lastTime = 0, an = defaultAngle;

   return function( time, name, a, b ){

    an = ( an + ( time - lastTime ) / 1e3 * rotateDire ) % 360;

    image.rotate( an, true );

       lastTime = time;

}

}();


return module;

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\buzz.js

 */ 

define("scripts/lib/buzz.js", function(exports){

// ----------------------------------------------------------------------------

// Buzz, a Javascript HTML5 Audio library

// v 1.0.x beta

// Licensed under the MIT license.

// //buzz.jaysalvat.com/

// ----------------------------------------------------------------------------

// Copyright (C) 2011 Jay Salvat

// //jaysalvat.com/

// ----------------------------------------------------------------------------

// Permission is hereby granted, free of charge, to any person obtaining a copy

// of this software and associated documentation files ( the "Software" ), to deal

// in the Software without restriction, including without limitation the rights

// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

// copies of the Software, and to permit persons to whom the Software is

// furnished to do so, subject to the following conditions:

//

// The above copyright notice and this permission notice shall be included in

// all copies or substantial portions of the Software.

//

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

// THE SOFTWARE.

// ----------------------------------------------------------------------------


var buzz = {

   defaults: {

       autoplay: false,

       duration: 5000,

       formats: [],

       loop: false,

       placeholder: '--',

       preload: 'metadata',

       volume: 80

   },

   types: {

       'mp3': 'audio/mpeg',

       'ogg': 'audio/ogg',

       'wav': 'audio/wav',

       'aac': 'audio/aac',

       'm4a': 'audio/x-m4a'

   },

   sounds: [],

   el: document.createElement( 'audio' ),


   sound: function( src, options ) {

       options = options || {};


       var pid = 0,

           events = [],

           eventsOnce = {},

           supported = buzz.isSupported();


       // publics

       this.load = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.load();

           return this;

       };


       this.play = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.play();

           return this;

       };


       this.togglePlay = function() {

           if ( !supported ) {

             return this;

           }


           if ( this.sound.paused ) {

               this.sound.play();

           } else {

               this.sound.pause();

           }

           return this;

       };


       this.pause = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.pause();

           return this;

       };


       this.isPaused = function() {

           if ( !supported ) {

             return null;

           }


           return this.sound.paused;

       };


       this.stop = function() {

           if ( !supported  ) {

             return this;

           }


           this.setTime( this.getDuration() );

           this.sound.pause();

           return this;

       };


       this.isEnded = function() {

           if ( !supported ) {

             return null;

           }


           return this.sound.ended;

       };


       this.loop = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.loop = 'loop';

           this.bind( 'ended.buzzloop', function() {

               this.currentTime = 0;

               this.play();

           });

           return this;

       };


       this.unloop = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.removeAttribute( 'loop' );

           this.unbind( 'ended.buzzloop' );

           return this;

       };


       this.mute = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.muted = true;

           return this;

       };


       this.unmute = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.muted = false;

           return this;

       };


       this.toggleMute = function() {

           if ( !supported ) {

             return this;

           }


           this.sound.muted = !this.sound.muted;

           return this;

       };


       this.isMuted = function() {

           if ( !supported ) {

             return null;

           }


           return this.sound.muted;

       };


       this.setVolume = function( volume ) {

           if ( !supported ) {

             return this;

           }


           if ( volume < 0 ) {

             volume = 0;

           }

           if ( volume > 100 ) {

             volume = 100;

           }


           this.volume = volume;

           this.sound.volume = volume / 100;

           return this;

       };


       this.getVolume = function() {

           if ( !supported ) {

             return this;

           }


           return this.volume;

       };


       this.increaseVolume = function( value ) {

           return this.setVolume( this.volume + ( value || 1 ) );

       };


       this.decreaseVolume = function( value ) {

           return this.setVolume( this.volume - ( value || 1 ) );

       };


       this.setTime = function( time ) {

           if ( !supported ) {

             return this;

           }


           this.whenReady( function() {

               this.sound.currentTime = time;

           });

           return this;

       };


       this.getTime = function() {

           if ( !supported ) {

             return null;

           }


           var time = Math.round( this.sound.currentTime * 100 ) / 100;

           return isNaN( time ) ? buzz.defaults.placeholder : time;

       };


       this.setPercent = function( percent ) {

           if ( !supported ) {

             return this;

           }


           return this.setTime( buzz.fromPercent( percent, this.sound.duration ) );

       };


       this.getPercent = function() {

           if ( !supported ) {

             return null;

           }


var percent = Math.round( buzz.toPercent( this.sound.currentTime, this.sound.duration ) );

           return isNaN( percent ) ? buzz.defaults.placeholder : percent;

       };


       this.setSpeed = function( duration ) {

if ( !supported ) {

             return this;

           }


           this.sound.playbackRate = duration;

       };


       this.getSpeed = function() {

if ( !supported ) {

             return null;

           }


           return this.sound.playbackRate;

       };


       this.getDuration = function() {

           if ( !supported ) {

             return null;

           }


           var duration = Math.round( this.sound.duration * 100 ) / 100;

           return isNaN( duration ) ? buzz.defaults.placeholder : duration;

       };


       this.getPlayed = function() {

if ( !supported ) {

             return null;

           }


           return timerangeToArray( this.sound.played );

       };


       this.getBuffered = function() {

if ( !supported ) {

             return null;

           }


           return timerangeToArray( this.sound.buffered );

       };


       this.getSeekable = function() {

if ( !supported ) {

             return null;

           }


           return timerangeToArray( this.sound.seekable );

       };


       this.getErrorCode = function() {

           if ( supported && this.sound.error ) {

               return this.sound.error.code;

           }

           return 0;

       };


       this.getErrorMessage = function() {

if ( !supported ) {

             return null;

           }


           switch( this.getErrorCode() ) {

               case 1:

                   return 'MEDIA_ERR_ABORTED';

               case 2:

                   return 'MEDIA_ERR_NETWORK';

               case 3:

                   return 'MEDIA_ERR_DECODE';

               case 4:

                   return 'MEDIA_ERR_SRC_NOT_SUPPORTED';

               default:

                   return null;

           }

       };


       this.getStateCode = function() {

if ( !supported ) {

             return null;

           }


           return this.sound.readyState;

       };


       this.getStateMessage = function() {

if ( !supported ) {

             return null;

           }


           switch( this.getStateCode() ) {

               case 0:

                   return 'HAVE_NOTHING';

               case 1:

                   return 'HAVE_METADATA';

               case 2:

                   return 'HAVE_CURRENT_DATA';

               case 3:

                   return 'HAVE_FUTURE_DATA';

               case 4:

                   return 'HAVE_ENOUGH_DATA';

               default:

                   return null;

           }

       };


       this.getNetworkStateCode = function() {

if ( !supported ) {

             return null;

           }


           return this.sound.networkState;

       };


       this.getNetworkStateMessage = function() {

if ( !supported ) {

             return null;

           }


           switch( this.getNetworkStateCode() ) {

               case 0:

                   return 'NETWORK_EMPTY';

               case 1:

                   return 'NETWORK_IDLE';

               case 2:

                   return 'NETWORK_LOADING';

               case 3:

                   return 'NETWORK_NO_SOURCE';

               default:

                   return null;

           }

       };


       this.set = function( key, value ) {

           if ( !supported ) {

             return this;

           }


           this.sound[ key ] = value;

           return this;

       };


       this.get = function( key ) {

           if ( !supported ) {

             return null;

           }


           return key ? this.sound[ key ] : this.sound;

       };


       this.bind = function( types, func ) {

           if ( !supported ) {

             return this;

           }


           types = types.split( ' ' );


           var that = this,

efunc = function( e ) { func.call( that, e ); };


           for( var t = 0; t < types.length; t++ ) {

               var type = types[ t ],

                   idx = type;

                   type = idx.split( '.' )[ 0 ];


                   events.push( { idx: idx, func: efunc } );

                   this.sound.addEventListener( type, efunc, true );

           }

           return this;

       };


       this.unbind = function( types ) {

           if ( !supported ) {

             return this;

           }


           types = types.split( ' ' );


           for( var t = 0; t < types.length; t++ ) {

               var idx = types[ t ],

                   type = idx.split( '.' )[ 0 ];


               for( var i = 0; i < events.length; i++ ) {

                   var namespace = events[ i ].idx.split( '.' );

                   if ( events[ i ].idx == idx || ( namespace[ 1 ] && namespace[ 1 ] == idx.replace( '.', '' ) ) ) {

                       this.sound.removeEventListener( type, events[ i ].func, true );

                       // remove event

                       events.splice(i, 1);

                   }

               }

           }

           return this;

       };


       this.bindOnce = function( type, func ) {

           if ( !supported ) {

             return this;

           }


           var that = this;


           eventsOnce[ pid++ ] = false;

           this.bind( pid + type, function() {

              if ( !eventsOnce[ pid ] ) {

                  eventsOnce[ pid ] = true;

                  func.call( that );

              }

              that.unbind( pid + type );

           });

       };


       this.trigger = function( types ) {

           if ( !supported ) {

             return this;

           }


           types = types.split( ' ' );


           for( var t = 0; t < types.length; t++ ) {

               var idx = types[ t ];


               for( var i = 0; i < events.length; i++ ) {

                   var eventType = events[ i ].idx.split( '.' );

                   if ( events[ i ].idx == idx || ( eventType[ 0 ] && eventType[ 0 ] == idx.replace( '.', '' ) ) ) {

                       var evt = document.createEvent('HTMLEvents');

                       evt.initEvent( eventType[ 0 ], false, true );

                       this.sound.dispatchEvent( evt );

                   }

               }

           }

           return this;

       };


       this.fadeTo = function( to, duration, callback ) {

if ( !supported ) {

             return this;

           }


           if ( duration instanceof Function ) {

               callback = duration;

               duration = buzz.defaults.duration;

           } else {

               duration = duration || buzz.defaults.duration;

           }


           var from = this.volume,

delay = duration / Math.abs( from - to ),

               that = this;

           this.play();


           function doFade() {

               setTimeout( function() {

                   if ( from < to && that.volume < to ) {

                       that.setVolume( that.volume += 1 );

                       doFade();

                   } else if ( from > to && that.volume > to ) {

                       that.setVolume( that.volume -= 1 );

                       doFade();

                   } else if ( callback instanceof Function ) {

                       callback.apply( that );

                   }

               }, delay );

           }

           this.whenReady( function() {

               doFade();

           });


           return this;

       };


       this.fadeIn = function( duration, callback ) {

           if ( !supported ) {

             return this;

           }


           return this.setVolume(0).fadeTo( 100, duration, callback );

       };


       this.fadeOut = function( duration, callback ) {

if ( !supported ) {

             return this;

           }


           return this.fadeTo( 0, duration, callback );

       };


       this.fadeWith = function( sound, duration ) {

           if ( !supported ) {

             return this;

           }


           this.fadeOut( duration, function() {

               this.stop();

           });


           sound.play().fadeIn( duration );


           return this;

       };


       this.whenReady = function( func ) {

           if ( !supported ) {

             return null;

           }


           var that = this;

           if ( this.sound.readyState === 0 ) {

               this.bind( 'canplay.buzzwhenready', function() {

                   func.call( that );

               });

           } else {

               func.call( that );

           }

       };


       // privates

       function timerangeToArray( timeRange ) {

           var array = [],

               length = timeRange.length - 1;


           for( var i = 0; i <= length; i++ ) {

               array.push({

                   start: timeRange.start( length ),

                   end: timeRange.end( length )

               });

           }

           return array;

       }


       function getExt( filename ) {

           return filename.split('.').pop();

       }


       function addSource( sound, src ) {

           var source = document.createElement( 'source' );

           source.src = src;

           if ( buzz.types[ getExt( src ) ] ) {

               source.type = buzz.types[ getExt( src ) ];

           }

           sound.appendChild( source );

       }


       // init

       if ( supported && src ) {


           for(var i in buzz.defaults ) {

             if(buzz.defaults.hasOwnProperty(i)) {

               options[ i ] = options[ i ] || buzz.defaults[ i ];

             }

           }


           this.sound = document.createElement( 'audio' );


           if ( src instanceof Array ) {

               for( var j in src ) {

                 if(src.hasOwnProperty(j)) {

                   addSource( this.sound, src[ j ] );

                 }

               }

           } else if ( options.formats.length ) {

               for( var k in options.formats ) {

                 if(options.formats.hasOwnProperty(k)) {

                   addSource( this.sound, src + '.' + options.formats[ k ] );

                 }

               }

           } else {

               addSource( this.sound, src );

           }


           if ( options.loop ) {

               this.loop();

           }


           if ( options.autoplay ) {

               this.sound.autoplay = 'autoplay';

           }


           if ( options.preload === true ) {

               this.sound.preload = 'auto';

           } else if ( options.preload === false ) {

               this.sound.preload = 'none';

           } else {

               this.sound.preload = options.preload;

           }


           this.setVolume( options.volume );


           buzz.sounds.push( this );

       }

   },


   group: function( sounds ) {

       sounds = argsToArray( sounds, arguments );


       // publics

       this.getSounds = function() {

           return sounds;

       };


       this.add = function( soundArray ) {

           soundArray = argsToArray( soundArray, arguments );

           for( var a = 0; a < soundArray.length; a++ ) {

               sounds.push( soundArray[ a ] );

           }

       };


       this.remove = function( soundArray ) {

           soundArray = argsToArray( soundArray, arguments );

           for( var a = 0; a < soundArray.length; a++ ) {

               for( var i = 0; i < sounds.length; i++ ) {

                   if ( sounds[ i ] == soundArray[ a ] ) {

                       delete sounds[ i ];

                       break;

                   }

               }

           }

       };


       this.load = function() {

           fn( 'load' );

           return this;

       };


       this.play = function() {

           fn( 'play' );

           return this;

       };


       this.togglePlay = function( ) {

           fn( 'togglePlay' );

           return this;

       };


       this.pause = function( time ) {

           fn( 'pause', time );

           return this;

       };


       this.stop = function() {

           fn( 'stop' );

           return this;

       };


       this.mute = function() {

           fn( 'mute' );

           return this;

       };


       this.unmute = function() {

           fn( 'unmute' );

           return this;

       };


       this.toggleMute = function() {

           fn( 'toggleMute' );

           return this;

       };


       this.setVolume = function( volume ) {

           fn( 'setVolume', volume );

           return this;

       };


       this.increaseVolume = function( value ) {

           fn( 'increaseVolume', value );

           return this;

       };


       this.decreaseVolume = function( value ) {

           fn( 'decreaseVolume', value );

           return this;

       };


       this.loop = function() {

           fn( 'loop' );

           return this;

       };


       this.unloop = function() {

           fn( 'unloop' );

           return this;

       };


       this.setTime = function( time ) {

           fn( 'setTime', time );

           return this;

       };


       this.setduration = function( duration ) {

           fn( 'setduration', duration );

           return this;

       };


       this.set = function( key, value ) {

           fn( 'set', key, value );

           return this;

       };


       this.bind = function( type, func ) {

           fn( 'bind', type, func );

           return this;

       };


       this.unbind = function( type ) {

           fn( 'unbind', type );

           return this;

       };


       this.bindOnce = function( type, func ) {

           fn( 'bindOnce', type, func );

           return this;

       };


       this.trigger = function( type ) {

           fn( 'trigger', type );

           return this;

       };


       this.fade = function( from, to, duration, callback ) {

           fn( 'fade', from, to, duration, callback );

           return this;

       };


       this.fadeIn = function( duration, callback ) {

           fn( 'fadeIn', duration, callback );

           return this;

       };


       this.fadeOut = function( duration, callback ) {

           fn( 'fadeOut', duration, callback );

           return this;

       };


       // privates

       function fn() {

           var args = argsToArray( null, arguments ),

               func = args.shift();


           for( var i = 0; i < sounds.length; i++ ) {

               sounds[ i ][ func ].apply( sounds[ i ], args );

           }

       }


       function argsToArray( array, args ) {

           return ( array instanceof Array ) ? array : Array.prototype.slice.call( args );

       }

   },


   all: function() {

     return new buzz.group( buzz.sounds );

   },


   isSupported: function() {

       return !!buzz.el.canPlayType;

   },


   isOGGSupported: function() {

       return !!buzz.el.canPlayType && buzz.el.canPlayType( 'audio/ogg; codecs="vorbis"' );

   },


   isWAVSupported: function() {

       return !!buzz.el.canPlayType && buzz.el.canPlayType( 'audio/wav; codecs="1"' );

   },


   isMP3Supported: function() {

       return !!buzz.el.canPlayType && buzz.el.canPlayType( 'audio/mpeg;' );

   },


   isAACSupported: function() {

       return !!buzz.el.canPlayType && ( buzz.el.canPlayType( 'audio/x-m4a;' ) || buzz.el.canPlayType( 'audio/aac;' ) );

   },


   toTimer: function( time, withHours ) {

       var h, m, s;

       h = Math.floor( time / 3600 );

       h = isNaN( h ) ? '--' : ( h >= 10 ) ? h : '0' + h;

       m = withHours ? Math.floor( time / 60 % 60 ) : Math.floor( time / 60 );

       m = isNaN( m ) ? '--' : ( m >= 10 ) ? m : '0' + m;

       s = Math.floor( time % 60 );

       s = isNaN( s ) ? '--' : ( s >= 10 ) ? s : '0' + s;

       return withHours ? h + ':' + m + ':' + s : m + ':' + s;

   },


   fromTimer: function( time ) {

       var splits = time.toString().split( ':' );

       if ( splits && splits.length == 3 ) {

           time = ( parseInt( splits[ 0 ], 10 ) * 3600 ) + ( parseInt(splits[ 1 ], 10 ) * 60 ) + parseInt( splits[ 2 ], 10 );

       }

       if ( splits && splits.length == 2 ) {

           time = ( parseInt( splits[ 0 ], 10 ) * 60 ) + parseInt( splits[ 1 ], 10 );

       }

       return time;

   },


   toPercent: function( value, total, decimal ) {

var r = Math.pow( 10, decimal || 0 );


return Math.round( ( ( value * 100 ) / total ) * r ) / r;

   },


   fromPercent: function( percent, total, decimal ) {

var r = Math.pow( 10, decimal || 0 );


       return  Math.round( ( ( total / 100 ) * percent ) * r ) / r;

   }

};


exports = buzz;;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\raphael.js

 */ 

define("scripts/lib/raphael.js", function(exports){

/*

* Raphael 1.5.2 - JavaScript Vector Library

*

* Copyright (c) 2010 Dmitry Baranovskiy (//raphaeljs.com)

* Licensed under the MIT (//raphaeljs.com/license.html) license.

*/


var Raphael;

var window = {};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\sound.js

 */ 

define("scripts/lib/sound.js", function(exports){

/**

* 简易声效控制

*/


/**

* 使用方法:

* var sound = require("scripts/lib/sound/main");

* var snd = sound.create("sounds/myfile");

* snd.play();

*/


var buzz = require("scripts/lib/buzz");

var supported = buzz.isSupported();


var config = { 

formats: [ "ogg", "mp3" ], 

preload: true, 

autoload: true, 

loop: false 

};


function ClassBuzz( src ){

   this.sound = new buzz.sound( src, config );

}


ClassBuzz.prototype.play = function( s ){

s = this.sound;

s.setPercent( 0 );

s.setVolume( 100 );

s.play();

};


ClassBuzz.prototype.stop = function(){

this.sound.fadeOut( 1e3, function(){

   this.pause();

} );

};


exports.create = function( src ){

if( !supported )

   return unSupported;

else

    return new ClassBuzz( src );

}


function unSupported(){

// TODO: 

}


unSupported.play =

unSupported.stop = function(){

// TODO: 

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\tween.js

 */ 

define("scripts/lib/tween.js", function(exports){

exports.exponential = function(){};

exports.exponential.co = function(index, offset, target, framesNum){ return (index == framesNum) ? offset + target : target * (-Math.pow(2, -10 * index / framesNum) + 1) + offset; };

// exports.exponential.ci = function(index, offset, target, framesNum){ return (index == 0) ? offset : target * Math.pow(2, 10 * (index / framesNum - 1)) + offset; }


exports.bounce = function(){};

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; };


exports.quadratic = function(){};

exports.quadratic.ci = function(index, offset, target, framesNum){ return target * (index /= framesNum) * index + offset; };

exports.quadratic.co = function(index, offset, target, framesNum){ return - target * (index /= framesNum) * (index - 2) + offset; }

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; };


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; }


exports.linear = function(index, offset, target, framesNum){ return target * index / framesNum + offset; };


exports.back = function(){};

exports.back.ci = function(index, offset, target, framesNum, s){ s = 1.70158; return target * (index /= framesNum) * index * ((s + 1) * index - s) + offset; };

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; };;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\lib\ucren.js

 */ 

define("scripts/lib/ucren.js", function(exports){

/**

* ucren-lite

* filename: boot.js

* author: dron

* version: 5.0.2.20120628

* date: 2009-03-15

* contact: ucren.com

*/


var Ucren;


var blankArray = [];

var slice = blankArray.slice;

var join = blankArray.join;


//

// [基本数据类型扩展]

//


// String.prototype.trim

if( !String.prototype.trim )

String.prototype.trim = function(){

return this.replace( /^\s+|\s+$/, "" );

};


// String.prototype.format

String.prototype.format = function( conf ){

var rtn = this, blank = {};

Ucren.each( conf, function( item, key ){

item = item.toString().replace( /\$/g, "$$$$" );

rtn = rtn.replace( RegExp( "@{" + key + "}", "g" ), item );

});

return rtn.toString();

};


// String.prototype.htmlEncode

String.prototype.htmlEncode = function(){

var div = document.createElement( "div" );

return function(){

var text;

div.appendChild( document.createTextNode( this ));

text = div.innerHTML;

div.innerHTML = "";

return text;

};

}();


// String.prototype.byteLength

String.prototype.byteLength = function(){

return this.replace( /[^\x00-\xff]/g, "  " ).length;

};


// String.prototype.subByte

String.prototype.subByte = function( len, tail ){

var s = this;

if( s.byteLength() <= len )

return s;

tail = tail || "";

len -= tail.byteLength();

return s = s.slice( 0, len ).replace( /( [^\x00-\xff] )/g, "$1 " )

.slice( 0, len )

.replace( /[^\x00-\xff]$/, "" )

.replace( /( [^\x00-\xff] ) /g, "$1" ) + tail;

}


// Function.prototype.defer

Function.prototype.defer = function( scope, timeout ){

var me = this;

var fn = function(){

me.apply( scope, arguments );

};

return setTimeout( fn, timeout );

};


// Function.prototype.bind

if( !Function.prototype.bind )

Function.prototype.bind = function( scope ){

var me = this;

return function(){

return me.apply( scope, arguments );

}

};


// Function.prototype.saturate

Function.prototype.saturate = function( scope/*, args */ ){

var fn = this, afters = slice.call( arguments, 1 );

return function(){

return fn.apply( scope, slice.call( arguments, 0 ).concat( afters ) );

}

};


// Array.prototype.indexOf

// if( !Array.prototype.indexOf )

Array.prototype.indexOf = function( item, i ){

var length = this.length;


if( !i )

   i = 0;


if( i < 0 )

i = length + i;

for( ; i < length; i ++ )

if( this[i] === item )

return i;

return -1;

};


// Array.prototype.every

// if( !Array.prototype.every )

Array.prototype.every = function( fn, context ) {

for ( var i = 0, len = this.length; i < len; i ++ )

if ( !fn.call( context, this[i], i, this ) )

return false;

return true;

};


// Array.prototype.filter

// if( !Array.prototype.filter )

Array.prototype.filter = function( fn, context ) {

var result = [], val;

for ( var i = 0, len = this.length; i < len; i ++ )

if ( val = this[i], fn.call( context, val, i, this ) )

result.push( val );

return result;

};


// Array.prototype.forEach

// if( !Array.prototype.forEach )

Array.prototype.forEach = function( fn, context ) {

for ( var i = 0, len = this.length; i < len; i ++ )

fn.call( context, this[i], i, this );

};


// Array.prototype.map

// if( !Array.prototype.map )

Array.prototype.map = function( fn, context ) {

var result = [];

for ( var i = 0, len = this.length; i < len; i ++ )

result[i] = fn.call( context, this[i], i, this );

return result;

};


// Array.prototype.some

// if( !Array.prototype.some )

Array.prototype.some = function( fn, context ) {

for ( var i = 0, len = this.length; i < len; i ++ )

if ( fn.call( context, this[i], i, this ) )

return true;

return false;

};


Array.prototype.invoke = function( method /*, args */ ){

   var args = slice.call( arguments, 1 );

    this.forEach( function( item ){

    if( item instanceof Array )

       item[0][method].apply( item[0], item.slice( 1 ) );

    else

    item[method].apply( item, args );

   });

   return this;

};


Array.prototype.random = function(){

var arr = this.slice( 0 ), ret = [], i = arr.length;

while( i -- )

ret.push( arr.splice( Ucren.randomNumber( i + 1 ), 1 )[0] );

return ret;

};


Ucren = {


//

// [全局属性]

//


// Ucren.isIe

isIe: /msie/i.test( navigator.userAgent ),


// Ucren.isIe6

isIe6: /msie 6/i.test( navigator.userAgent ),


// Ucren.isFirefox

isFirefox: /firefox/i.test( navigator.userAgent ),


// Ucren.isSafari

isSafari: /version\/[\d\.]+\s+safari/i.test( navigator.userAgent ),


// Ucren.isOpera

isOpera: /opera/i.test( navigator.userAgent ),


// Ucren.isChrome

isChrome: /chrome/i.test( navigator.userAgent ), //todo isChrome = true, isSafari = true


// Ucren.isStrict

isStrict: document.compatMode == "CSS1Compat",


// Ucren.tempDom

tempDom: document.createElement( "div" ),


//

// [全局方法]

//


// Ucren.apply

apply: function( form, to, except ){

if( !to )to = {};

if( except ){

Ucren.each( form, function( item, key ){

if( key in except )

return ;

to[key] = item;

});

}else{

Ucren.each( form, function( item, key ){

to[key] = item;

});

}

return to;

},


// Ucren.appendStyle

appendStyle: function( text ){

var style;


if( arguments.length > 1 )

text = join.call( arguments, "" );


if( document.createStyleSheet ){

style = document.createStyleSheet();

style.cssText = text;

}else{

style = document.createElement( "style" );

style.type = "text/css";

//style.innerHTML = text; fix Chrome bug

style.appendChild( document.createTextNode( text ));

document.getElementsByTagName( "head" )[0].appendChild( style );

}

},


// for copy : )

//

// var addEvent = function( target, name, fn ){

// var call = function(){

// fn.apply( target, arguments );

// };

// if( window.attachEvent )

// target.attachEvent( "on" + name, call );

// else if( window.addEventListener )

// target.addEventListener( name, call, false );

// else

// target["on" + name] = call;

// return call;

// }


// Ucren.addEvent

addEvent: function( target, name, fn ){

var call = function(){

fn.apply( target, arguments );

};

if( target.dom ){

target = target.dom;

}

if( window.attachEvent ){

target.attachEvent( "on" + name, call );

}else if( window.addEventListener ){

target.addEventListener( name, call, false );

}else{

target["on" + name] = call;

}

return call;

},


// Ucren.delEvent

delEvent: function( target, name, fn ){

if( window.detachEvent ){

target.detachEvent( "on" + name, fn );

}else if( window.removeEventListener ){

target.removeEventListener( name, fn, false );

}else if( target["on" + name] == fn ){

target["on" + name] = null;

}

},


// Ucren.Class

Class: function( initialize, methods, befores, afters ){

var fn, prototype, blank;

initialize = initialize || function(){};

methods = methods || {};

blank = {};

fn = function(){

this.instanceId = Ucren.id();

initialize.apply( this, arguments );

};

prototype = fn.prototype;

Ucren.registerClassEvent.call( prototype );

Ucren.each( methods, function( item, key ){

prototype[key] = function( method, name ){

if( typeof( method ) == "function" ){

return function(){

var args, rtn;

args = slice.call( arguments, 0 );

if( befores &&

befores.apply( this, [name].concat( args )) === false ){

return ;

}

this.fireEvent( "before" + name, args );

rtn = method.apply( this, args );

if( afters )

afters.apply( this, [name].concat( args ));

this.fireEvent( name, args );

return rtn;

};

}else{

return method;

}

}( item, key );

});

prototype.getOriginMethod = function( name ){

return methods[name];

};

return fn;

},


//private

registerClassEvent: function(){

this.on = function( name, fn ){

var instanceId = this.instanceId;

Ucren.dispatch( instanceId + name, fn.bind( this ));

};

this.onbefore = function( name, fn ){

var instanceId = this.instanceId;

Ucren.dispatch( instanceId + "before" + name, fn.bind( this ));

};

this.un = function( name, fn ){

//todo

};

this.fireEvent = function( name, args ){

var instanceId = this.instanceId;

Ucren.dispatch( instanceId + name, args );

};

},


// Ucren.createFuze

createFuze: function(){

var queue, fn, infire;

queue = [];

fn = function( process ){

if( infire ){

process();

}else{

queue.push( process );

}

};

fn.fire = function(){

while( queue.length ){

queue.shift()();

}

infire = true;

};

fn.extinguish = function(){

infire = false;

};

fn.wettish = function(){

if( queue.length ){

queue.shift()();

}

};

return fn;

},


// Ucren.createIf

// createIf: function( expressionFunction ){

// return function( callback ){

// var expression = expressionFunction();

// var returnValue = {

// Else: function( callback ){

// callback = callback || nul;

// expression || callback();

// }

// };

// callback = callback || nul;

// expression && callback();

// return returnValue;

// };

// },


// Ucren.dispatch

dispatch: function(){

var map = {}, send, incept, ret;


send = function( processId, args, scope ){

var processItems;

if( processItems = map[ processId ] )

Ucren.each( processItems, function( item ){

item.apply( scope, args );

});

};


incept = function( processId, fn ){

var m;

if( !( m = map[ processId ] ) )

map[processId] = [ fn ];

else

m.push( fn );

};


ret = function( arg1, arg2, arg3 ){

if( typeof( arg2 ) === "undefined" )

arg2 = [];


if( arg2 instanceof Array )

   send.apply( this, arguments );

else if( typeof( arg2 ) === "function" )

   incept.apply( this, arguments );

};


ret.remove = function( processId, fn ){

   var m, i;

   if( ( m = map[ processId ] ) && ~( i = m.indexOf( fn ) ) )

    m.splice( i, 1 );

};


return ret;

}(),


// Ucren.each ( not recommended )

each: function( unknown, fn ){

/// unknown 是 array 的,会慢慢退化,建议用 Array.prototype.forEach 替代

/// unknown 为其它类似的,短期内将暂时支持

if( unknown instanceof Array || ( typeof unknown == "object" &&

typeof unknown[0] != "undefined" && unknown.length )){

if( typeof unknown == "object" && Ucren.isSafari )

unknown = slice.call( unknown );

// for( var i = 0, l = unknown.length; i < l; i ++ ){

// if( fn( unknown[i], i ) === false ){

// break;

// }

// }

unknown.forEach( fn );

}else if( typeof( unknown ) == "object" ){

var blank = {};

for( var i in unknown ){

if( blank[i] ){

continue;

}

if( fn( unknown[i], i ) === false ){

break;

}

}

}else if( typeof( unknown ) == "number" ){

for( var i = 0; i < unknown; i ++ ){

if( fn( i, i ) === false ){

break;

}

}

}else if( typeof( unknown ) == "string" ){

for( var i = 0, l = unknown.length; i < l; i ++ ){

if( fn( unknown.charAt( i ), i ) === false ){

break;

}

}

}

},


// Ucren.Element

Element: function( el, returnDom ){

var rtn, handleId;

if( el && el.isUcrenElement ){

return returnDom ? el.dom : el;

}

el = typeof( el ) == "string" ? document.getElementById( el ) : el;


if( !el )

return null;


if( returnDom )

return el;


handleId = el.getAttribute( "handleId" );

if( typeof handleId == "string" ){

return Ucren.handle( handleId - 0 );

}else{

rtn = new Ucren.BasicElement( el );

handleId = Ucren.handle( rtn );

el.setAttribute( "handleId", handleId + "" );

return rtn;

}

},


// Ucren.Event

Event: function( e ){

e = e || window.event;


if( !e ){

var c = arguments.callee.caller;

while( c ){

e = c.arguments[0];

if( e && typeof( e.altKey ) == "boolean" ){ // duck typing

break;

}

c = c.caller;

e = null;

}

}


return e;

},


// Ucren.fixNumber

fixNumber: function( unknown, defaultValue ){

return typeof( unknown ) == "number" ? unknown : defaultValue;

},


// Ucren.fixString

fixString: function( unknown, defaultValue ){

return typeof( unknown ) == "string" ? unknown : defaultValue;

},


// Ucren.fixConfig

fixConfig: function( conf ){

var defaultConf;

defaultConf = {};

if( typeof conf == "undefined" ){

return defaultConf;

}else if( typeof conf == "function" ){

return new conf;

}else{

return conf;

}

},


// Ucren.handle

handle: function( unknown ){

var fn, type, number;

fn = arguments.callee;

if( !fn.cache ){

fn.cache = {};

}

if( typeof( fn.number ) == "undefined" ){

fn.number = 0;

}

type = typeof( unknown );

if( type == "number" ){

return fn.cache[unknown.toString()];

}else if( type == "object" || type == "function" ){

number = fn.number ++;

fn.cache[number.toString()] = unknown;

return number;

}

},


// Ucren.id

id: function(){

var id = arguments.callee;

id.number = ++ id.number || 0;

return "_" + id.number;

},


// Ucren.loadImage

loadImage: function( urls, onLoadComplete ){

var length = urls.length;

var loaded = 0;

var check = function(){

if( loaded == length )

onLoadComplete && onLoadComplete();

};

Ucren.each( urls, function( url ){

var img = document.createElement( "img" );

img.onload = img.onerror = function(){

this.onload = this.onerror = null;

loaded ++;

check();

};

Ucren.tempDom.appendChild( img );

img.src = url;

});

},


// Ucren.loadScript

loadScript: function( src, callback ){

Ucren.request( src, function( text ){

eval( text );

callback && callback( text );

});

},


// Ucren.makeElement

makeElement: function( tagName, attributes ){

var el = document.createElement( tagName );

var setStyle = function( unknown ){

if( typeof unknown == "string" )

el.style.cssText = unknown;

else

Ucren.apply( unknown, el.style );

};


for ( var prop in attributes ) {

if ( prop === "class" )

el.className = attributes[prop];

else if ( prop === "for" )

el.htmlFor = attributes[prop];

else if( prop === "style" )

setStyle( attributes[prop] );

else

el.setAttribute( prop, attributes[prop] );

}


return el;

},


// Ucren.nul

nul: function(){

return false;

},


// Ucren.queryString

// queryString: function( name, sourceString ){

// var source, pattern, result;

// source = sourceString || location.href;

// pattern = new RegExp( "( \\?|& )" + name + "=( [^&#]* )( #|&|$ )", "i" );

// result = source.match( pattern );

// return result ? result[2] : "";

// },


// Ucren.randomNumber

randomNumber: function( num ){

return Math.floor( Math.random() * num );

},


// Ucren.randomWord

randomWord: function(){

var cw = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

return function( length, sourceString ){

var words, re = [];

words = sourceString || cw;

Ucren.each( length, function( index ){

re[index] = words.charAt( this.randomNumber( words.length ));

}.bind( this ));

return re.join( "" );

}

}(),


// Ucren.request

request: function( url, callback ){

request = Ucren.request;

var xhr = request.xhr;

if( !request.xhr ){

if( window.XMLHttpRequest ){

xhr = request.xhr = new XMLHttpRequest();

}else{

xhr = request.xhr = new ActiveXObject( "Microsoft.XMLHTTP" );

}

}

xhr.open( "GET", url, true );

xhr.onreadystatechange = function(){

if( xhr.readyState == 4 && xhr.status == 200 ){

callback( xhr.responseText );

}

};

xhr.send( null );

}


// // Ucren.decodeColor

// decodeColor: function(){

// var r = /^\#?( \w{2})( \w{2})( \w{2})$/;

// var x = function( x ){

// return parseInt( x, 16 );

// };

// return function( color ){

// r.test( color );

// return {

// red: x( RegExp.$1 ),

// green: x( RegExp.$2 ),

// blue: x( RegExp.$3 )

// };

// }

// }(),


// // Ucren.encodeColor

// encodeColor: function(){

// var x = function( x ){

// return x.toString( 16 ).split( "." )[0];

// };

// x = x.improve( function( origin, x ){

// x = origin( x );

// return x.length == 1 ? "0" + x : x;

// });

// return function( data ){

// return ["#", x( data.red ), x( data.green ), x( data.blue )].join( "" );

// }

// }()

};


//

// [底层操作类]

//


// Ucren.BasicDrag

Ucren.BasicDrag = Ucren.Class( 

/* constructor */ function( conf ){

conf = Ucren.fixConfig( conf );

this.type = Ucren.fixString( conf.type, "normal" );


var isTouch = this.isTouch = "ontouchstart" in window;


this.TOUCH_START = isTouch ? "touchstart" : "mousedown",

this.TOUCH_MOVE = isTouch ? "touchmove" : "mousemove",

this.TOUCH_END = isTouch ? "touchend" : "mouseup";

},


/* methods */ {

bind: function( el, handle ){

el = Ucren.Element( el );

handle = Ucren.Element( handle ) || el;


var evt = {};


evt[this.TOUCH_START] = function( e ){

e = Ucren.Event( e );

this.startDrag();

e.cancelBubble = true;

e.stopPropagation && e.stopPropagation();

return e.returnValue = false;

}.bind( this );


handle.addEvents( evt );

this.target = el;

},


//private

getCoors: function( e ){

var coors = [];

if ( e.targetTouches && e.targetTouches.length ) { // iPhone

var thisTouch = e.targetTouches[0];

coors[0] = thisTouch.clientX;

coors[1] = thisTouch.clientY;

}else{ // all others

coors[0] = e.clientX;

coors[1] = e.clientY;

}

return coors;

},


//private

startDrag: function(){

var target, draging, e;

target = this.target;

draging = target.draging = {};


this.isDraging = true;


draging.x = parseInt( target.style( "left" ), 10 ) || 0;

draging.y = parseInt( target.style( "top" ), 10 ) || 0;


e = Ucren.Event();

var coors = this.getCoors( e );

draging.mouseX = coors[0];

draging.mouseY = coors[1];


this.registerDocumentEvent();

},


//private

endDrag: function(){

this.isDraging = false;

this.unRegisterDocumentEvent();

},


//private

registerDocumentEvent: function(){

var target, draging;

target = this.target;

draging = target.draging;


draging.documentSelectStart =

Ucren.addEvent( document, "selectstart", function( e ){

e = e || event;

e.stopPropagation && e.stopPropagation();

e.cancelBubble = true;

return e.returnValue = false;

});


draging.documentMouseMove =

Ucren.addEvent( document, this.TOUCH_MOVE, function( e ){

var ie, nie;

e = e || event;

ie = Ucren.isIe && e.button != 1;

nie = !Ucren.isIe && e.button != 0;

if( (ie || nie ) && !this.isTouch )

this.endDrag();

var coors = this.getCoors( e );

draging.newMouseX = coors[0];

draging.newMouseY = coors[1];

e.stopPropagation && e.stopPropagation();

return e.returnValue = false;

}.bind( this ));


draging.documentMouseUp =

Ucren.addEvent( document, this.TOUCH_END, function(){

this.endDrag();

}.bind( this ));


var lx, ly;


clearInterval( draging.timer );

draging.timer = setInterval( function(){

var x, y, dx, dy;

if( draging.newMouseX != lx && draging.newMouseY != ly ){

lx = draging.newMouseX;

ly = draging.newMouseY;

dx = draging.newMouseX - draging.mouseX;

dy = draging.newMouseY - draging.mouseY;

x = draging.x + dx;

y = draging.y + dy;

if( this.type == "calc" ){

this.returnValue( dx, dy, draging.newMouseX, draging.newMouseY );

}else{

target.left( x ).top( y );

}

}

}.bind( this ), 10 );

},


//private

unRegisterDocumentEvent: function(){

var draging = this.target.draging;

Ucren.delEvent( document, this.TOUCH_MOVE, draging.documentMouseMove );

Ucren.delEvent( document, this.TOUCH_END, draging.documentMouseUp );

Ucren.delEvent( document, "selectstart", draging.documentSelectStart );

clearInterval( draging.timer );

},


//private

returnValue: function( dx, dy, x, y ){

//todo something

}

}

);


// Ucren.Template

Ucren.Template = Ucren.Class( 

/* constructor */ function(){

this.string = join.call( arguments, "" );

},


/* methods */ {

apply: function( conf ){

return this.string.format( conf );

}

}

);


// Ucren.BasicElement

Ucren.BasicElement = Ucren.Class( 

/* constructor */ function( el ){

this.dom = el;

this.countMapping = {};

},


/* methods */ {

isUcrenElement: true,


attr: function( name, value ){

if( typeof value == "string" ){

this.dom.setAttribute( name, value );

}else{

return this.dom.getAttribute( name );

}

return this;

},


style: function( /* unknown1, unknown2 */ ){

var getStyle = Ucren.isIe ?

function( name ){

return this.dom.currentStyle[name];

} :


function( name ){

var style;

style = document.defaultView.getComputedStyle( this.dom, null );

return style.getPropertyValue( name );

};


return function( unknown1, unknown2 ){

if( typeof unknown1 == "object" ){

Ucren.each( unknown1, function( value, key ){

this[key] = value;

}.bind( this.dom.style ));

}else if( typeof unknown1 == "string" && typeof unknown2 == "undefined" ){

return getStyle.call( this, unknown1 );

}else if( typeof unknown1 == "string" && typeof unknown2 != "undefined" ){

this.dom.style[unknown1] = unknown2;

}

return this;

};

}(),


hasClass: function( name ){

var className = " " + this.dom.className + " ";

return className.indexOf( " " + name + " " ) > -1;

},


setClass: function( name ){

if( typeof( name ) == "string" )

this.dom.className = name.trim();

return this;

},


addClass: function( name ){

var el, className;

el = this.dom;

className = " " + el.className + " ";

if( className.indexOf( " " + name + " " ) == -1 ){

className += name;

className = className.trim();

className = className.replace( / +/g, " " );

el.className = className;

}

return this;

},


delClass: function( name ){

var el, className;

el = this.dom;

className = " " + el.className + " ";

if( className.indexOf( " " + name + " " ) > -1 ){

className = className.replace( " " + name + " ", " " );

className = className.trim();

className = className.replace( / +/g, " " );

el.className = className;

}

return this;

},


html: function( html ){

var el = this.dom;


if( typeof html == "string" ){

el.innerHTML = html;

}else if( html instanceof Array ){

el.innerHTML = html.join( "" );

}else{

return el.innerHTML;

}

return this;

},


left: function( number ){

var el = this.dom;

if( typeof( number ) == "number" ){

el.style.left = number + "px";

this.fireEvent( "infect", [{ left: number }] );

}else{

return this.getPos().x;

}

return this;

},


top: function( number ){

var el = this.dom;

if( typeof( number ) == "number" ){

el.style.top = number + "px";

this.fireEvent( "infect", [{ top: number }] );

}else{

return this.getPos().y;

}

return this;

},


width: function( unknown ){

var el = this.dom;

if( typeof unknown == "number" ){

el.style.width = unknown + "px";

this.fireEvent( "infect", [{ width: unknown }] );

}else if( typeof unknown == "string" ){

el.style.width = unknown;

this.fireEvent( "infect", [{ width: unknown }] );

}else{

return this.getSize().width;

}

return this;

},


height: function( unknown ){

var el = this.dom;

if( typeof unknown == "number" ){

el.style.height = unknown + "px";

this.fireEvent( "infect", [{ height: unknown }] );

}else if( typeof unknown == "string" ){

el.style.height = unknown;

this.fireEvent( "infect", [{ height: unknown }] );

}else{

return this.getSize().height;

}

return this;

},


count: function( name ){

return this.countMapping[name] = ++ this.countMapping[name] || 1;

},


display: function( bool ){

var dom = this.dom;

if( typeof( bool ) == "boolean" ){

dom.style.display = bool ? "block" : "none";

this.fireEvent( "infect", [{ display: bool }] );

}else{

return this.style( "display" ) != "none";

}

return this;

},


first: function(){

var c = this.dom.firstChild;

while( c && !c.tagName && c.nextSibling ){

c = c.nextSibling;

}

return c;

},


add: function( dom ){

var el;

el = Ucren.Element( dom );

this.dom.appendChild( el.dom );

return this;

},


remove: function( dom ){

var el;

if( dom ){

el = Ucren.Element( dom );

el.html( "" );

this.dom.removeChild( el.dom );

}else{

el = Ucren.Element( this.dom.parentNode );

el.remove( this );

}

return this;

},


insert: function( dom ){

var tdom;

tdom = this.dom;

if( tdom.firstChild ){

tdom.insertBefore( dom, tdom.firstChild );

}else{

this.add( dom );

}

return this;

},


addEvents: function( conf ){

var blank, el, rtn;

blank = {};

rtn = {};

el = this.dom;

Ucren.each( conf, function( item, key ){

rtn[key] = Ucren.addEvent( el, key, item );

});

return rtn;

},


removeEvents: function( conf ){

var blank, el;

blank = {};

el = this.dom;

Ucren.each( conf, function( item, key ){

Ucren.delEvent( el, key, item );

});

return this;

},


getPos: function(){

var el, parentNode, pos, box, offset;

el = this.dom;

pos = {};


if( el.getBoundingClientRect ){

box = el.getBoundingClientRect();

offset = Ucren.isIe ? 2 : 0;

var doc = document;

var scrollTop = Math.max( doc.documentElement.scrollTop,

doc.body.scrollTop );

var scrollLeft = Math.max( doc.documentElement.scrollLeft,

doc.body.scrollLeft );

return {

x: box.left + scrollLeft - offset,

y: box.top + scrollTop - offset

};

}else{

pos = {

x: el.offsetLeft,

y: el.offsetTop

};

parentNode = el.offsetParent;

if( parentNode != el ){

while( parentNode ){

pos.x += parentNode.offsetLeft;

pos.y += parentNode.offsetTop;

parentNode = parentNode.offsetParent;

}

}

if( Ucren.isSafari && this.style( "position" ) == "absolute" ){ // safari doubles in some cases

pos.x -= document.body.offsetLeft;

pos.y -= document.body.offsetTop;

}

}


if( el.parentNode ){

parentNode = el.parentNode;

}else{

parentNode = null;

}


while( parentNode && parentNode.tagName.toUpperCase() != "BODY" &&

parentNode.tagName.toUpperCase() != "HTML" ){ // account for any scrolled ancestors

pos.x -= parentNode.scrollLeft;

pos.y -= parentNode.scrollTop;

if( parentNode.parentNode ){

parentNode = parentNode.parentNode;

}else{

parentNode = null;

}

}


return pos;

},


getSize: function(){

var dom = this.dom;

var display = this.style( "display" );


if ( display && display !== "none" ) {

return { width: dom.offsetWidth, height: dom.offsetHeight };

}


var style = dom.style;

var originalStyles = {

visibility: style.visibility,

position:   style.position,

display:    style.display

};


var newStyles = {

visibility: "hidden",

display:    "block"

};


if ( originalStyles.position !== "fixed" )

 newStyles.position = "absolute";


this.style( newStyles );


var dimensions = {

width:  dom.offsetWidth,

height: dom.offsetHeight

};


this.style( originalStyles );


return dimensions;

},


observe: function( el, fn ){

el = Ucren.Element( el );

el.on( "infect", fn.bind( this ));

return this;

},


usePNGbackground: function( image ){

var dom;

dom = this.dom;

if( /\.png$/i.test( image ) && Ucren.isIe6 ){

dom.style.filter =

"progid:DXImageTransform.Microsoft.AlphaImageLoader( src='" +

image + "',sizingMethod='scale' );";

/// _background: none;

///  _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader( src='images/pic.png',sizingMethod='scale' );

}else{

dom.style.backgroundImage = "url( " + image + " )";

}

return this;

},


setAlpha: function(){

var reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/;

return function( value ){

var element = this.dom, es = element.style;

if( !Ucren.isIe ){

es.opacity = value / 100;

/* }else if( es.filter === "string" ){ */

}else{

if ( element.currentStyle && !element.currentStyle.hasLayout )

es.zoom = 1;


if ( reOpacity.test( es.filter )) {

value = value >= 99.99 ? "" : ( "alpha( opacity=" + value + " )" );

es.filter = es.filter.replace( reOpacity, value );

} else {

es.filter += " alpha( opacity=" + value + " )";

}

}

return this;

};

}(),


fadeIn: function( callback ){

if( typeof this.fadingNumber == "undefined" )

this.fadingNumber = 0;

this.setAlpha( this.fadingNumber );


var fading = function(){

this.setAlpha( this.fadingNumber );

if( this.fadingNumber == 100 ){

clearInterval( this.fadingInterval );

callback && callback();

}else

this.fadingNumber += 10;

}.bind( this );


this.display( true );

clearInterval( this.fadingInterval );

this.fadingInterval = setInterval( fading, Ucren.isIe ? 20 : 30 );


return this;

},


fadeOut: function( callback ){

if( typeof this.fadingNumber == "undefined" )

this.fadingNumber = 100;

this.setAlpha( this.fadingNumber );


var fading = function(){

this.setAlpha( this.fadingNumber );

if( this.fadingNumber == 0 ){

clearInterval( this.fadingInterval );

this.display( false );

callback && callback();

}else

this.fadingNumber -= 10;

}.bind( this );


clearInterval( this.fadingInterval );

this.fadingInterval = setInterval( fading, Ucren.isIe ? 20 : 30 );


return this;

},


useMouseAction: function( className, actions ){

/**

*  调用示例:  el.useMouseAction( "xbutton", "over,out,down,up" );

*  使用效果:  el 会在 "xbutton xbutton-over","xbutton xbutton-out","xbutton xbutton-down","xbutton xbutton-up"

*             等四个 className 中根据相应的鼠标事件来进行切换。

*  特别提示:  useMouseAction 可使用不同参数多次调用。

*/

if( !this.MouseAction )

this.MouseAction = new Ucren.MouseAction({ element: this });

this.MouseAction.use( className, actions );

return this;

}

}

);


if( Ucren.isIe )

document.execCommand( "BackgroundImageCache", false, true );


for( var i in Ucren ){

   exports[i] = Ucren[i];

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\background.js

 */ 

define("scripts/object/background.js", function(exports){

var Ucren = require("scripts/lib/ucren");

var layer = require("scripts/layer");

var timeline = require("scripts/timeline");

var image, time;


var random = Ucren.randomNumber;


exports.set = function(){

image = layer.createImage( "default", "images/background.jpg", 0, 0, 640, 480 );

};


exports.wobble = function(){

time = timeline.setInterval( wobble, 50 );

};


exports.stop = function(){

   time.stop();

   image.attr({ x: 0, y: 0 });

};


function wobble(){

   var x, y;

   x = random( 12 ) - 6;

   y = random( 12 ) - 6;

   image.attr({ x: x, y: y });

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\console.js

 */ 

define("scripts/object/console.js", function(exports){

var layer = require("scripts/layer");


var x = 16, y = 0;

var texts = [];


exports.set = function(){


};


exports.clear = function(){

   for(var i = 0, l = texts.length; i < l; i ++)

    texts[i].remove();

   texts.length = y = 0;

};


exports.log = function(text){

y += 20;

   texts.push( layer.createText( "default", text, x, y ) );

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\developing.js

 */ 

define("scripts/object/developing.js", function(exports){

var layer = require("scripts/layer");

var tween = require("scripts/lib/tween");

var timeline = require("scripts/timeline");

var message = require("scripts/message");


var exponential = tween.exponential.co;


/**

* "coming soon" 模块

*/


exports.anims = [];


exports.set = function(){

this.image = layer.createImage( "default", "images/developing.png", 103, 218, 429, 53 ).hide().scale( 1e-5, 1e-5 );

};


exports.show = function( start ){

   timeline.createTask({

start: start, duration: 500, data: [ 1e-5, 1, "show" ],

object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,

recycle: this.anims

});


this.hide( 2000 );

};


exports.hide = function( start ){

   timeline.createTask({

start: start, duration: 500, data: [ 1, 1e-5, "hide" ],

object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,

recycle: this.anims

});

};


// 显示/隐藏 相关


exports.onZoomStart = function(){

this.image.show();

};


exports.onZooming = function( time, sz, ez, z ){

this.image.scale( z = exponential( time, sz, ez - sz, 500 ), z );

};


exports.onZoomEnd = function( sz, ez, mode ){

   if( mode === "hide" )

       this.image.hide();

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\dojo.js

 */ 

define("scripts/object/dojo.js", function(exports){

var rotate = require("scripts/factory/rotate");

var tween = require("scripts/lib/tween");


exports = rotate.create("images/dojo.png", 41, 240, 175, 175, 1e-5, tween.exponential.co, 500);;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\flame.js

 */ 

define("scripts/object/flame.js", function(exports){


/**

* 火焰模块

* @author zswang, dron

*/


var layer = require("scripts/layer").getLayer( "fruit" );

var timeline = require("scripts/timeline");

var Ucren = require("scripts/lib/ucren");


/*

raphael.path('M 27,122 Q 9,42 27,21 45,42 27,122')

.attr({

stroke: 'none',

fill: '180-#D8D380-#EDED7A-#D8D380'

});

*/


// 缩写

var math = Math, cos = math.cos, sin = math.sin,

trunc = parseInt,

random = math.random,

PI = math.PI;


var guid = 0;


/**

* 添加一个火苗

* @param{Array} center 中心位置 单位像素

* @param{Number} angle 运动方向 单位幅度

* @param{Number} length 运动长度 单位像素

* @param{Number} life 存活时间 单位毫秒

*/

function appendFlame( center, angle, length, life, flames ){

return flames[guid] = {

id: guid ++,

birthday: new Date,

center: center,

angle: angle,

length: length,

life: life,

path: layer.path().attr({ stroke: 'none', fill: trunc( angle * 180 / PI ) + '-#fafad9-#f0ef9c' })

};

}


var radius = 15;


function updateFlame( flames, n ){

var item = flames[n];


if ( !item ) 

return;


var age, center, p1, p2, p3, p4;


age = 1 - (new Date - item.birthday) / item.life;


if ( age <= 0 ){

item.path.remove();

delete flames[item.id];

return;

}


var ia, ic, il;


ia = item.angle;

ic = item.center;

il = item.length;


center = [ trunc(ic[0] + cos(ia) * il * (1 - age)), trunc(ic[1] + sin(ia) * il * (1 - age)) ];

p1 = [ trunc(center[0] - cos(ia) * radius * age), trunc(center[1] - sin(ia) * radius * age) ];

p2 = [ trunc(center[0] + cos(ia) * radius * age), trunc(center[1] + sin(ia) * radius * age) ];

p3 = [ trunc(center[0] - cos(ia + .5 * PI) * radius * .4 * age), trunc(center[1] - sin(ia + .5 * PI) * radius * .4 * age) ];

p4 = [ trunc(center[0] - cos(ia - .5 * PI) * radius * .4 * age), trunc(center[1] - sin(ia - .5 * PI) * radius * .4 * age) ];


item.path.attr({ path: 'M' + p1 + ' Q' + [ p3, p2, p4, p1 ].join(' ') });

};


function removeFlame( flames, n ){

   var item = flames[n];


   if( !item )

    return;


   item.path.remove();

   delete flames[ n ];

};


exports.create = function( ox, oy, start ){

var timer1, timer2;


  var object = {

  pos: function( x, y ){

     nx = x;

     ny = y;

     image.attr( "x", nx - 21 ).attr( "y", ny - 21 );

  },


  remove: function(){

     [ timer1, timer2 ].invoke( "stop" );

     image.remove();


     for (var p in flames)

removeFlame( flames, p );

  }

  };


var nx = ox, ny = oy;

var image = layer.image("images/smoke.png", nx - 21, ny - 21, 43, 43).hide();

var flames = {};


timer1 = timeline.setTimeout(function(){

image.show();

timer2 = timeline.setInterval(function(){

if(random() < 0.9)

appendFlame( [ nx, ny ], PI * 2 * random(), 60, 200 + 500 * random(), flames );


for (var p in flames)

updateFlame( flames, p );


}, Ucren.isIe ? 20 : 40);


}, start || 0);


return object;

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\flash.js

 */ 

define("scripts/object/flash.js", function(exports){

/**

*

*/


var layer = require("scripts/layer");

var timeline = require("scripts/timeline").use( "flash" ).init( 10 );

var tween = require("scripts/lib/tween");

var sound = require("scripts/lib/sound");


var image, snd, xDiff = 0, yDiff = 0;


var anim = tween.quadratic.cio;

var anims = [];

var dur = 100;


exports.set = function(){

image = layer.createImage( "flash", "images/flash.png", 0, 0, 358, 20 ).hide();

snd = sound.create( "sound/splatter" );

};


exports.showAt = function( x, y, an ){

   image.rotate( an, true ).scale( 1e-5, 1e-5 ).attr({

       x: x + xDiff,

       y: y + yDiff

   }).show();


   anims.clear && anims.clear();


   snd.play();


   timeline.createTask({

       start: 0, duration: dur, data: [ 1e-5, 1 ],

       object: this, onTimeUpdate: this.onTimeUpdate,

       recycle: anims

   });


   timeline.createTask({

       start: dur, duration: dur, data: [ 1, 1e-5 ],

       object: this, onTimeUpdate: this.onTimeUpdate,

       recycle: anims

   });

};


exports.onTimeUpdate = function( time, a, b, z ){

   image.scale( z = anim( time, a, b - a, dur ), z );

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\fps.js

 */ 

define("scripts/object/fps.js", function(exports){

// var layer = require("scripts/layer");

// var timeline =require("scripts/timeline");


// var text, fps = "fps: ";


// exports.set = function(){

// text = layer.createText( "default", fps + "0", 4, 470 ).attr( "fill", "#ccc" );

// };


// exports.update = function(){

// text.attr( "text", fps + ( timeline.getFPS() >> 0 ) );

// };;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\game-over.js

 */ 

define("scripts/object/game-over.js", function(exports){

var layer = require("scripts/layer");

var tween = require("scripts/lib/tween");

var timeline = require("scripts/timeline");

var message = require("scripts/message");

var state = require("scripts/state");


var exponential = tween.exponential.co;


/**

* "game-over"模块

*/


exports.anims = [];


exports.set = function(){

this.image = layer.createImage( "default", "images/game-over.png", 75, 198, 490, 85 ).hide().scale( 1e-5, 1e-5 );

};


exports.show = function( start ){

   timeline.createTask({

start: start, duration: 500, data: [ 1e-5, 1, "show" ],

object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,

recycle: this.anims

});

};


exports.hide = function( start ){

   timeline.createTask({

start: start, duration: 500, data: [ 1, 1e-5, "hide" ],

object: this, onTimeUpdate: this.onZooming, onTimeStart: this.onZoomStart, onTimeEnd: this.onZoomEnd,

recycle: this.anims

});

};


// 显示/隐藏 相关


exports.onZoomStart = function( sz, ez, mode ){

if( mode == "show" )

this.image.show();

};


exports.onZooming = function( time, sz, ez, z ){

this.image.scale( z = exponential( time, sz, ez - sz, 500 ), z );

};


exports.onZoomEnd = function( sz, ez, mode ){

if( mode == "show" )

state( "click-enable" ).on();

   else if( mode === "hide" )

       this.image.hide();

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\home-desc.js

 */ 

define("scripts/object/home-desc.js", function(exports){

var displacement = require("scripts/factory/displacement");

var tween = require("scripts/lib/tween");


exports = displacement.create("images/home-desc.png", 161, 91, -161, 140, 7, 127, tween.exponential.co, 500);;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\home-mask.js

 */ 

define("scripts/object/home-mask.js", function(exports){

var displacement = require("scripts/factory/displacement");

var tween = require("scripts/lib/tween");


exports = displacement.create("images/home-mask.png", 640, 183, 0, -183, 0, 0, tween.exponential.co, 1e3);;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\knife.js

 */ 

define("scripts/object/knife.js", function(exports){

var timeline = require("scripts/timeline");

var layer = require("scripts/layer").getLayer( "knife" );

var Ucren = require("scripts/lib/ucren");


/**

* 刀光模块

*/


var lastX = null, lastY = null;

var abs = Math.abs;


var life = 200;

var stroke = 10;

var color = "#cbd3db";

var anims = [];

var switchState = true;

var knifes = [];


function ClassKnifePart( conf ){

   this.sx = conf.sx;

   this.sy = conf.sy;

   this.ex = conf.ex;

   this.ey = conf.ey;


   knifes.push( this );

}


ClassKnifePart.prototype.set = function(){

var sx, sy, ex, ey, dx, dy, ax, ay;


sx = this.sx;

sy = this.sy;

ex = this.ex;

ey = this.ey;


dx = sx - ex;

dy = sy - ey;

ax = abs(dx);

ay = abs(dy);


if(ax > ay)

   sx += dx < 0 ? -1 : 1,

   sy += dy < 0 ? -( 1 * ay / ax ) : 1 * ay / ax;

else

   sx += dx < 0 ? -( 1 * ax / ay ) : 1 * ax / ay,

   sy += dy < 0 ? -1 : 1;


this.line = layer.path( "M" + sx + "," + sy + "L" + ex + "," + ey ).attr({

"stroke": color,

"stroke-width": stroke + "px"

});


timeline.createTask({ start: 0, duration: life, object: this, onTimeUpdate: this.update, onTimeEnd: this.end, recycle: anims });

return this;

};


ClassKnifePart.prototype.update = function( time ){

this.line.attr( "stroke-width", stroke * (1 - time / life) + "px" );

};


ClassKnifePart.prototype.end = function(){

this.line.remove();


var index;

if( index = knifes.indexOf( this ) )

   knifes.splice( index, 1 );

};


exports.newKnife = function(){

   lastX = lastY = null;

};


exports.through = function( x, y ){

if( !switchState )

return ;

var ret = null;

if( lastX !== null && ( lastX != x || lastY != y ) )

   new ClassKnifePart({ sx: lastX, sy: lastY, ex: x, ey: y }).set(),

ret = [ lastX, lastY, x, y ];


lastX = x;

lastY = y;

return ret;

};


exports.pause = function(){

   anims.clear();

   this.switchOff();

};


exports.switchOff = function(){

   switchState = false;

};


exports.switchOn = function(){

switchState = true;

this.endAll();

};


exports.endAll = function(){

   for(var i = knifes.length - 1; i >= 0; i --)

knifes[i].end();

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\light.js

 */ 

define("scripts/object/light.js", function(exports){

/**

* 炸弹爆炸时的光线

*/


var layer = require("scripts/layer");


var maskLayer = layer.getLayer( "mask" );

layer = layer.getLayer( "light" );


var Ucren = require("scripts/lib/ucren");

var timeline = require("scripts/timeline");

var message = require("scripts/message");


var random = Ucren.randomNumber;

var pi = Math.PI;

var sin = Math.sin;

var cos = Math.cos;


var lights = [];

var indexs = [];

var lightsNum = 10;


for(var i = 0; i < lightsNum; i ++)

indexs[i] = i;


exports.start = function( boom ){

var x = boom.originX, y = boom.originY, time = 0, idx = indexs.random();


var i = lightsNum, b = function(){

   build( x, y, idx[ this ] );

};


while( i -- )

timeline.setTimeout( b.bind( i ), time += 100 );


timeline.setTimeout(function(){

   this.overWhiteLight();

}.bind( this ), time + 100);

};


exports.overWhiteLight = function(){

   message.postMessage( "overWhiteLight.show" );

   this.removeLights();


   var dur = 4e3;

   var mask = maskLayer.rect( 0, 0, 640, 480 ).attr({ fill: "#fff", stroke: "none" });

   var control = {

    onTimeUpdate: function( time ){

    mask.attr( "opacity", 1 - time / dur );

    },


    onTimeEnd: function(){

       mask.remove();

       message.postMessage( "game.over" );

    }

   };


   timeline.createTask({

start: 0, duration: dur,

object: control, onTimeUpdate: control.onTimeUpdate, onTimeEnd: control.onTimeEnd

});


};


exports.removeLights = function(){

   for(var i = 0, l = lights.length; i < l; i ++)

    lights[i].remove();

   lights.length = 0;

};


function build( x, y, r ){

   var a1, a2, x1, y1, x2, y2;


   a1 = r * 36 + random( 10 );

   a2 = a1 + 5;


   a1 = pi * a1 / 180;

   a2 = pi * a2 / 180;


   x1 = x + 640 * cos( a1 );

   y1 = y + 640 * sin( a1 );


   x2 = x + 640 * cos( a2 );

   y2 = y + 640 * sin( a2 );


   var light = layer.path( [ "M", x, y, "L", x1, y1, "L", x2, y2, "Z" ] ).attr({

    stroke: "none",

    fill: "#fff"

   });


   lights.push( light );

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\logo.js

 */ 

define("scripts/object/logo.js", function(exports){

var displacement = require("scripts/factory/displacement");

var tween = require("scripts/lib/tween");


exports = displacement.create("images/logo.png", 288, 135, 17, -182, 17, 1, tween.exponential.co, 1e3);;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\lose.js

 */ 

define("scripts/object/lose.js", function(exports){

var layer = require("scripts/layer");

var tween = require("scripts/lib/tween");

var timeline = require("scripts/timeline");

var Ucren = require("scripts/lib/ucren");

var message = require("scripts/message");


var anim = tween.exponential.co;

var back = tween.back.co;


/**

*/


var o1, o2, o3, animLength = 500;


var conf1 = { src: "images/x.png", sx: 650, ex: 561, y: 5, w: 22, h: 19 };

var conf2 = { src: "images/xx.png", sx: 671, ex: 582, y: 5, w: 27, h: 26 };

var conf3 = { src: "images/xxx.png", sx: 697, ex: 608, y: 6, w: 31, h: 32 };


var number = 0;


exports.anims = [];


exports.set = function(){

   o1 = layer.createImage( "default", conf1.src, conf1.sx, conf1.y, conf1.w, conf1.h ).hide();

   o2 = layer.createImage( "default", conf2.src, conf2.sx, conf2.y, conf2.w, conf2.h ).hide();

   o3 = layer.createImage( "default", conf3.src, conf3.sx, conf3.y, conf3.w, conf3.h ).hide();

};


exports.reset = function(){

   number = 0;

   [ [ o1, conf1 ], [ o2, conf2 ], [ o3, conf3 ] ].forEach(function( infx ){

       infx[0].attr( "src", infx[1].src.replace( "xf.png", "x.png" ) );

   })

};


exports.show = function( start ){

   timeline.createTask({

start: start, duration: animLength, data: [ "show", conf1.sx, conf1.ex, conf2.sx, conf2.ex, conf3.sx, conf3.ex ],

object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,

recycle: this.anims

});

};


exports.hide = function( start ){

   timeline.createTask({

start: start, duration: animLength, data: [ "hide", conf1.ex, conf1.sx, conf2.ex, conf2.sx, conf3.ex, conf3.sx ],

object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,

recycle: this.anims

});  

};


exports.showLoseAt = function( x ){


   var infx, inf = [

       [ o1, conf1 ],

       [ o2, conf2 ],

       [ o3, conf3 ]

   ];


   createPosShow( x );


   infx = inf[ ( ++ number ) - 1 ];

   infx[0].attr( "src", infx[1].src.replace( "x.png", "xf.png" ) ).scale( 1e-5, 1e-5 );

   this.scaleImage( infx[0] );


   if( number == 3 )

       message.postMessage( "game.over" );

};


exports.scaleImage = function( image ){

   var dur = 500;


   image.myOnScaling = image.myOnScaling || function( time, z ){

       this.scale( z = back( time, 1e-5, 1 - 1e-5, dur ), z );

   };


   image.myOnScaleEnd = image.myOnScaleEnd || function(){

       this.scale( 1, 1 );

   };


   timeline.createTask({

       start: 0, duration: dur,

       object: image, onTimeUpdate: image.myOnScaling, onTimeEnd: image.myOnScaleEnd,

       recycle: this.anims

   });

};


// 显示/隐藏 相关


exports.onTimeUpdate = function( time, mode, x1s, x1e, x2s, x2e, x3s, x3e ){

   o1.attr( "x", anim( time, x1s, x1e - x1s, animLength ) );

   o2.attr( "x", anim( time, x2s, x2e - x2s, animLength ) );

   o3.attr( "x", anim( time, x3s, x3e - x3s, animLength ) );

};


exports.onTimeStart = function( mode ){

   if( mode == "show" )

       [ o1, o2, o3 ].invoke( "show" );

};


exports.onTimeEnd = function( mode ){

   if( mode == "hide" )

       [ o1, o2, o3 ].invoke( "hide" ),

       this.reset();

};


function createPosShow( x ){

   var image = layer.createImage( "default", "images/lose.png", x - 27, 406, 54, 50 ).scale( 1e-5, 1e-5 );

   var duration = 500;


   var control = {

       show: function( start ){

           timeline.createTask({

               start: start, duration: duration, data: [ tween.back.co, 1e-5, 1 ],

               object: this, onTimeUpdate: this.onScaling, onTimeEnd: this.onShowEnd

               // recycle: anims

           });

       },


       hide: function( start ){

           timeline.createTask({

               start: start, duration: duration, data: [ tween.back.ci, 1, 1e-5 ],

               object: this, onTimeUpdate: this.onScaling, onTimeEnd: this.onHideEnd

               // recycle: anims

           });

       },


       onScaling: function( time, anim, a, b, z ){

           image.scale( z = anim( time, a, b - a, duration ), z );

       },


       onShowEnd: function(){

           this.hide( 1500 );

       },


       onHideEnd: function(){

           image.remove();

       }

   };


   control.show( 200 );

};


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\new-game.js

 */ 

define("scripts/object/new-game.js", function(exports){

var rotate = require("scripts/factory/rotate");

var tween = require("scripts/lib/tween");


exports = rotate.create("images/new-game.png", 244, 231, 195, 195, 1e-5, tween.exponential.co, 500);;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\new.js

 */ 

define("scripts/object/new.js", function(exports){

var layer = require("scripts/layer");

var tween = require("scripts/lib/tween");

var timeline = require("scripts/timeline");

var Ucren = require("scripts/lib/ucren");


var image;

var cycleTime = 300;


var sx = 129, sy = 328, ex = 170, ey = 221, sw = 0, sh = 0, ew = 70, eh = 42, dy = 8;


var showAnim = tween.exponential.co;

var jumpAnim = tween.quadratic.ci;


exports.anims = [];


exports.set = function(){

   image = layer.createImage( "default", "images/new.png", sx, sy, sw, sh );

};


exports.unset = function(){


};


exports.show = function( start ){

timeline.createTask({ 

       start: start, duration: 500,

       data: [ sx, ex, sy, ey, sw, ew, sh, eh ],

       object: this, onTimeUpdate: this.onShowing, onTimeStart: this.onShowStart, onTimeEnd: this.onShowEnd, 

       recycle: this.anims 

   });

};


exports.hide = function( start ){

   this.anims.clear();

   timeline.createTask({ 

       start: start, duration: 500,

       data: [ ex, sx, ey, sy, ew, sw, eh, sh ],

       object: this, onTimeUpdate: this.onShowing, 

       recycle: this.anims 

   });

};


exports.jump = function(){

   this.anims.clear();

   timeline.createTask({ start: 0, duration: -1, object: this, onTimeUpdate: this.onJumping, recycle: this.anims });

};


// 显示相关


exports.onShowStart = function(){

};


exports.onShowing = function( time, sx, ex, sy, ey, sw, ew, sh, eh ){

   image.attr({ 

    x: showAnim( time, sx, ex - sx, 500 ), 

    y: showAnim( time, sy, ey - sy, 500 ),

    width: showAnim( time, sw, ew - sw, 500 ),

    height: showAnim( time, sh, eh - sh, 500 )

   });

};


exports.onShowEnd = function(){

   this.jump();

};


// 跳跃相关


exports.onJumping = function(time){

var t = parseInt(time / cycleTime);


time = time % cycleTime;

if( t % 2 ) time = cycleTime - time;


image.attr("y", jumpAnim( time, ey, dy, cycleTime ));

};;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\ninja.js

 */ 

define("scripts/object/ninja.js", function(exports){

var displacement = require("scripts/factory/displacement");

var tween = require("scripts/lib/tween");


exports = displacement.create("images/ninja.png", 244, 81, 315, -140, 315, 43, {

show: tween.bounce.co,

hide: tween.exponential.co

}, 1e3);;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\quit.js

 */ 

define("scripts/object/quit.js", function(exports){

var rotate = require("scripts/factory/rotate");

var tween = require("scripts/lib/tween");


exports = rotate.create("images/quit.png", 493, 311, 141, 141, 1e-5, tween.exponential.co, 500);;


return exports;

});

/**

 * @source D:\hosting\demos\fruit-ninja\output\scripts\object\score.js

 */ 

define("scripts/object/score.js", function(exports){

var layer = require("scripts/layer");

var tween = require("scripts/lib/tween");

var timeline = require("scripts/timeline");

var Ucren = require("scripts/lib/ucren");


var setTimeout = timeline.setTimeout.bind( timeline );

var anim = tween.exponential.co;


var message = require("scripts/message");


/**

* 分数模块

*/


var image, text1, text2, animLength = 500;;


var imageSx = -94, imageEx = 6;

var text1Sx = -59, text1Ex = 41;

var text2Sx = -93, text2Ex = 7;


exports.anims = [];


exports.set = function(){

   image = layer.createImage( "default", "images/score.png", imageSx, 8, 29, 31 ).hide();

   text1 = layer.createText( "default", "0", text1Sx, 24, "90-#fc7f0c-#ffec53", "30px" ).hide();

   text2 = layer.createText( "default", "BEST 999", text2Sx, 48, "#af7c05", "14px" ).hide();

};


exports.show = function( start ){

timeline.createTask({

start: start, duration: animLength, data: [ "show", imageSx, imageEx, text1Sx, text1Ex, text2Sx, text2Ex ],

object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,

recycle: this.anims

});

};


exports.hide = function( start ){

timeline.createTask({

start: start, duration: animLength, data: [ "hide", imageEx, imageSx, text1Ex, text1Sx, text2Ex, text2Sx ],

object: this, onTimeUpdate: this.onTimeUpdate, onTimeStart: this.onTimeStart, onTimeEnd: this.onTimeEnd,

recycle: this.anims

});

};


exports.number = function( number ){

   text1.attr( "text", number || 0 );

   image.scale( 1.2, 1.2 );

   setTimeout(function(){

       image.scale( 1, 1 );

   }, 60);

   // message.postMessage( number, "score.change" );

};


// 显示/隐藏 相关


exports.onTimeUpdate = function( time, mode, isx, iex, t1sx, t1ex, t2sx, t2ex ){

   image.attr( "x", anim( time, isx, iex - isx, animLength ) );

   text1.attr( "x", anim( time, t1sx, t1ex - t1sx, animLength ) );

   text2.attr( "x", anim( time, t2sx, t2ex - t2sx, animLength ) );

};


exports.onTimeStart = function( mode ){

if( mode === "show" )

[ image, text1, text2 ].invoke( "show" );

};


exports.onTimeEnd = function( mode ){

   if( mode === "hide" )

       [ image, text1, text2 ].invoke( "hide" ),

       text1.attr( "text", 0 );

};;


return exports;

});


startModule("scripts/main");


希望这篇文章可以帮助到你。总之,同学们,你想要的职坐标IT频道都能找到!


本文由 @等等 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程