2

さて、この問題を3回調べて、私の質問に本当に関連するものが何も見つからなかった後、私は今尋ねます。


私は興味を持ち、キャンバスで非常に基本的な落下砂のおもちゃを作ることができるかどうかを実験することにしました。

「砂」が本来のように地面に堆積するので、私はそれをうまくやりましたが、空中の粒子と地面の粒子の間の衝突検出のために、それは非常に速く遅くなります。

自分で確認してください編集:おそらくデッドリンク、代わりに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座標と同じである必要があります)、正しい位置を見つけるためにすべての地面の位置をループする必要はありません。

空中の砂片ごとに1つのチェック、つまり対応する柱の山の高さをチェックするだけで済みます。

さらに、砂が山に当たったら、「アクティブパーティクル」リストから砂を削除します。これにより、毎回チェックする必要がなくなり、外側のforループをできるだけ小さく/短くすることができます。

パイルの高さを使用して各パイルを再描画するか(砂粒の色が異なる場合はうまく機能しません...)、または落下しなくなった砂を別のメモリ構造に入れて、パイルを適切に再描画します。

于 2012-12-16T19:20:32.767 に答える