本文主要包含HTML5,JS,水果游戏等相关知识,匿名希望在学习及工作中可以帮助到您
切水果游戏曾经是一款风靡手机的休闲游戏,今天要介绍的就是一款网页版的切水果游戏,由JavaScript和HTML5实现,虽然功能和原版的相差很大,但是基本的功能还是具备了,还是模仿挺逼真的。有一定JavaScript水平的朋友可以看看源代码,相信你的JavaScript水平会有很大提升。

在线演示源码下载
所有JavaScript代码
/**
* this file was compiled by jsbuild 0.9.6
* @date Fri, 20 Jul 2012 16:21:18 UTC
* @author dron
* @site http://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()

