为了账号安全,请及时绑定邮箱和手机立即绑定

关于删除小球的pop()方法还有不理解的地方

pop()方法一次只能删除最后一个数组元素,而刷新率是每50ms一次,相当于一秒是刷新20次,也就是说一秒最多只能删除20个小球,但是每一秒产生新的小球数量却大于20,为什么实际上没有积压更多的小球呢,求解!!!

正在回答

2 回答

删除的是以整个数组为目标,当满足超出屏幕的小球就会被删除! balls.push(aBall);

//循环小球

for(var i = 0;i < digit[num].length;i++){

for(var j = 0;j <digit[num][i].length;j++){

if(digit[num][i][j] == 1){

var aBall = {

//坐标位置x

x:x+j*2*(cR+1)+(cR+1),

//坐标位置y

y:y+i*2*(cR+1)+(cR+1),

//加速度

g:1.5 + Math.random(),

//x方向速度

vx:Math.pow(-1,Math.ceil(Math.random()*1000)) * 4,

vy:-5,

color:colors[Math.floor(Math.random()*colors.length)]

}

balls.push(aBall);

}

}

}


//在屏幕中小球的数量

var cnt = 0;

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

if(balls[i].x + cR > 0 && balls[i].x - cR < window_width){

balls[cnt++] = balls[i];

}

}

//超出屏幕小球的数量

while(balls.length > Math.min(300,cnt)){

balls.pop();

}


0 回复 有任何疑惑可以回复我~
#1

暴走大熊 提问者

你虽然没有正面回答我的问题,但我通过你的回答突然想明白了,原来while语句的每一次删除动作是跟着每一次的for循环遍历走的,就是每往数组中加入一个小球,while语句就会检测并执行一次。 我之前的理解是while是跟着50ms的刷新走的,理解偏差了。 谢谢耐你的心回答!
2016-04-19 回复 有任何疑惑可以回复我~
#2

000339043 回复 暴走大熊 提问者

可是他的while没包含在for语句里面啊
2016-05-11 回复 有任何疑惑可以回复我~
#3

dl_嘛哩嘛哩哄 回复 暴走大熊 提问者

同问,为什么while是跟着for走,while没有包括在for里面啊???
2016-05-14 回复 有任何疑惑可以回复我~
#4

暴走大熊 提问者 回复 dl_嘛哩嘛哩哄

每次的刷新,首先带来for语句的遍历循环每一个小球,把所有没有超出屏幕范围的球放置小球数组的前面(前cnt个),直到把所有球都遍历完毕,然后再执行while,while是一直循环往复的检测这个数组,只要检测到一次小球数量大于cnt(或300),就删除数组最后一个,直到小球数量不大于cnt(或300)为止,才会结束while循环。因为这两个循环都是在一刷新中搞定的,所以与50ms没有什么关系。
2016-05-14 回复 有任何疑惑可以回复我~
#5

暴走大熊 提问者 回复 000339043

同上回复
2016-05-14 回复 有任何疑惑可以回复我~
#6

飞过那座山 回复 暴走大熊 提问者

每次不止往数组里加入一个小球。而且电脑的运行速度是很快的,while循环能pop数组里出界的所有小球。
2016-06-30 回复 有任何疑惑可以回复我~
#7

西风潇潇 回复 暴走大熊 提问者

还是一样啊。pop()方法不是删除最后的小球吗,也就是最新的小球,
2016-07-11 回复 有任何疑惑可以回复我~
#8

鱼字头上一把刀 回复 暴走大熊 提问者

while是自己走的吧~也可以改写成for循环呀~拿到cnt之后,他就只和balls.length有关。 删除不是因为加了几个球,而是因为球的位置发生了改变吧
2016-10-16 回复 有任何疑惑可以回复我~
查看6条回复

其实我觉得直接改变balls的长度会更好!

balls.length = Math.min(300, cnt);


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于删除小球的pop()方法还有不理解的地方

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信