Javascript 简易落沙玩具

Javascript 简易落沙玩具,javascript,html,canvas,html5-canvas,Javascript,Html,Canvas,Html5 Canvas,好吧,在把这个问题查了三遍之后,我发现与我的问题没有任何真正相关的东西,现在我要问了。 我很好奇,决定尝试一下,看看是否能在画布上制作一个非常基本的落沙玩具 我确实成功地做到了这一点,因为“沙子”像它应该的那样堆积在地面上,但由于空气粒子和地面粒子之间的碰撞检测,它的速度非常快 编辑:可能是死链接 通过单击并按住鼠标按钮生成粒子。当你产生了大约200个粒子后,它会被带到膝盖上 for(i in P){ if(P[i].Y<canvas.height-1){ P[i]

好吧,在把这个问题查了三遍之后,我发现与我的问题没有任何真正相关的东西,现在我要问了。

我很好奇,决定尝试一下,看看是否能在画布上制作一个非常基本的落沙玩具

我确实成功地做到了这一点,因为“沙子”像它应该的那样堆积在地面上,但由于空气粒子和地面粒子之间的碰撞检测,它的速度非常快

编辑:可能是死链接

通过单击并按住鼠标按钮生成粒子。当你产生了大约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}
    }
}
for(i在P中){

如果(P[i].Y

,则更容易记住每一堆沙子的高度(例如画布中的每一列或x坐标),并进行检查。您可以直接使用索引(应与x坐标相同),因此无需在所有地面位置循环以找到正确的位置

您只需对每个空气中的沙粒进行一次检查,即检查相应柱的桩高

此外,当沙子撞击到桩体时,将其从“活动粒子”列表中删除,这样您就不必每次都对其进行检查,使外部
for
-循环尽可能小/短


使用桩的高度重新绘制每个桩(当沙粒有单独的颜色时,效果不好…)或者将不再掉落的沙子放在单独的内存结构中,以便正确地重新绘制这些堆。

听起来是一个不错的解决方案;就像光线投射与光线跟踪。我会在有时间的时候测试它,如果它有效,我会给你最好的答案。谢谢:)只是想到了一些想法,可能还有更多优化的可能性……:)对其进行了测试,性能显著提高..谢谢。我将你的答案加上1,并将其选中标记链接指向的代码已更改。哦,我应该将该链接更新为不太可能损坏的链接。我将快速创建一个JSFIDLE。