Javascript 游戏时钟小试

读了一篇<<如何实现游戏主循环(Game Loop)的详细解析>> 的文章, 用javascript实现一下,目前仍没有完全参透其中含义, 出来的效果不能另人满意



<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>Javascript 游戏时钟小试</title>
<script type="text/javascript" src="jquery-1.6.4.js"></script>
<style type="text/css">
body{font-size: 14px;}
.wrap{border:solid 1px #f60; width:500px; height:300px; position:relative;}
.item{border:solid 1px #660; line-height:30px; height:30px;}
.red{color:red;}
.block{width:10px;height:10px;background-color:#aaa;position:absolute;z-index:10000;line-height:0;font-size:0;}
.ss{width:1px;height:14px;background-color:#eee;color:#ff0;line-height:0;font-size:10px;line-height: 14px;margin-top: 1px;}
#debug{position:fixed; border:solid 1px #f60; width:600px;height:100%;right:0;top: 0;overflow: scroll;}
</style>
</head>
<body>
[url=javascript:start()]start[/url] |
[url=javascript:pause()]pause[/url] |
addBlock[url=javascript:addBlock()][1][/url][url=javascript:addBlock2()][10][/url](<span id="blocks">0</span>) |
Frame: <span id='Frame'>0</span> |
SkipedFrame: <span id='skipFrame'>0</span> |
[url=javascript:big()]复杂计算[/url] |
[url=javascript:$('#debug')]ClearDebug[/url]
<div class="wrap" id="msg">
<div id="block-x" class="block" style="top:20px;left:0;background-color:#f60;"></div>
</div>
<div class="wrap">
<div class='ss' id='s_0'></div>
<div class='ss' id='s_1'></div>
<div class='ss' id='s_2'></div>
<div class='ss' id='s_3'></div>
<div class='ss' id='s_4'></div>
<div class='ss' id='s_5'></div>
<div class='ss' id='s_6'></div>
<div class='ss' id='s_7'></div>
<div class='ss' id='s_8'></div>
<div class='ss' id='s_9'></div>
<div class='ss' id='s_10'></div>
<div class='ss' id='s_11'></div>
<div class='ss' id='s_12'></div>
<div class='ss' id='s_13'></div>
<div class='ss' id='s_14'></div>
<div class='ss' id='s_15'></div>
<div class='ss' id='s_16'></div>
<div class='ss' id='s_17'></div>
<div class='ss' id='s_18'></div>
<div class='ss' id='s_19'></div>
</div>
<div id="debug"></div>

<script type="text/javascript">
//模拟复杂计算
function big(){
//b = (new Date()).getTime();
var i=0;
while(i++ <500000){
(new Date()).getTime();
}
//alert((new Date()).getTime() - b);
}

function GetTickCount(){return (new Date()).getTime();}

var fps = 25;
var SKIP_TICKS = 1000 / fps;
var MAX_FRAMESKIP = 5;
var next_game_tick = GetTickCount();
var game_is_running = false;
var interpolation = 0, loop = 0;
var nowFrame = 0;
var skipFrame = 0;
var speed = 50;// px/s
var timer;
var time_interval = 10;
var x = 0;
var $bbbox=$('#block-x');

function start(){
if(game_is_running === true) return;
game_is_running = true;
next_game_tick = GetTickCount();
timer = setInterval(function(){
loops = 0;
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
update_game();
next_game_tick += SKIP_TICKS;
loops++;
skipFrame += loops > 1 ? 1 : 0;
//debug(x)
//$bbbox.width(x + 10);
}

interpolation = ( GetTickCount() + SKIP_TICKS - next_game_tick ) / SKIP_TICKS;
display_game( interpolation );

},time_interval);
}

function pause(){
clearInterval(timer);
game_is_running = false;
}

function update_game(){
nowFrame++;
var i,l;
for(i=0,l=arr1.length;i<l;i++){
next(arr2[i]);
}
}

function debug(){
var x='';
for(var j=0,len=arguments.length;j<len;j++){
x+=' | ' + arguments[j];
}
$('#debug').prepend(x + '<br >')
x = null;
}

var arr_c = [];
function c(interpolation){
arr_c.push(interpolation);
while(arr_c.length>20) arr_c = arr_c.slice(1);
var i;
for(i=0,len=arr_c.length;i<len;i++){
$('#s_'+i).css({width : arr_c[i] * 100 + 50});//.html(arr_c[i])
}
}

//0,1,2,3,4,5
function next(arr){
arr[0] += arr[2] * arr[4] * SKIP_TICKS ;
if(arr[0]<0){
arr[0] = 0;
arr[2] *= -1;
}else if(arr[0]>=490){
arr[0] = 490;
arr[2] *= -1;
}

arr[1] += arr[3] * arr[5] * SKIP_TICKS;
if(arr[1]<0){
arr[1] = 0;
arr[3] *= -1;
}else if(arr[1]>290){
arr[1] = 290;
arr[3] *= -1;
}
}

var arr1 = [];
var arr2 = [];//[x,y,1,1,speed_x,speed_y]
function display_game(interpolation){
$('#Frame').html(nowFrame);
$('#skipFrame').html(skipFrame);
var i,l;
for(i=0,l=arr1.length;i<l;i++){
//debug(arr2[i][0], arr2[i][1]* interpolation)
$(arr1[i]).css({left : arr2[i][0] , top : arr2[i][1]});
}

c(interpolation);

//模拟很卡
//if(Math.random()>0.99) big();
}


function addBlock(){
var block = $('<div class="block" id="b'+ arr1.length +'"></div>');
$('#msg').append(block);
var a = Math.random() * speed / 1.1 + 2;
var b = Math.sqrt(speed * speed - a * a);
arr2.push([0,0,1,1,a/1000,b/1000]);
arr1.push(block);
block = null;
$('#blocks').html(arr1.length);
}

function addBlock2(){
var _i=0;
while(_i++ <10) addBlock();
}


</script>


</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值