2

好吧,在查看了这个问题三遍之后,发现没有与我的问题真正相关的内容,我现在要问了。


我很好奇并决定尝试看看我是否可以在帆布上制作一个非常基本的落沙玩具。

我确实成功地做到了,因为“沙子”像它应该在地面上堆积一样,但由于空气传播粒子和地面粒子之间的撞击检测,它会很快减慢。

自己看看编辑:可能是死链接,这里是一个 JsFiddle

通过单击并按住鼠标按钮生成粒子。在你生成了大约 200 个粒子之后,它就会跪下。

for(i in P){
    if(P[i].Y<canvas.height-1){
        P[i].Y++
        for(j in G){//This loop seems to cause the lag
            if(P[i].X==G[j].X&&P[i].Y==G[j].Y-1){
                G[G.length]={X:P[i].X,Y:P[i].Y}
            }
        }
    }else{
        G[G.length]={X:P[i].X,Y:P[i].Y}
    }
}

我只是想知道我是否做错了什么;我很确定它不应该落后那么严重。我也想知道是否有办法在没有嵌套循环的情况下做到这一点,但似乎我能够完成这项工作的唯一方法是检查每个单独的空气传播粒子与每个单独的地面粒子,这使得它滞后。

如果链接断开,请说出这个词,我将在此处发布整个代码。

谢谢

4

1 回答 1

2

更容易记住每堆沙子的高度(例如,对于每一列或画布中的 x 坐标)并检查它。您可以直接使用索引(应该与 x 坐标相同),因此您不需要遍历所有地面位置来找到正确的位置。

您只需对每个空载沙块进行一次校验,即与相应立柱的堆高进行校验。

此外,当沙子撞到堆上时,将其从“活动粒子”列表中删除,这样您就不需要每次都检查它,保持外for循环尽可能小/短。

使用桩的高度重新绘制每个桩(当沙粒具有不同的颜色时效果不佳......)或将不再掉落的沙子放在单独的内存结构中以正确地重新绘制桩。

于 2012-12-16T19:20:32.767 回答