0

タイトルが正しいかどうかはわかりませんが...

特定の密度/流れ/速度構成で道路のセクションを (html + キャンバス + JavaScript で) アニメーション化したいと考えています。そのためには、一方の端に車両の「ソース」があり、もう一方の端に「シンク」が必要です。次に、特定のパラメーターによって、単位時間あたりに作成される車両の数と、その (一定の) 速度が決定されます。次に、特定のフレームレートで車両の位置をインクリメントするために、「クロック」ループが必要だと思います。できれば、ユーザーがフォーム内のいくつかの値を変更でき、実行中のアニメーションがそれに応じて更新されるようにします。

最終結果は、これの (もっと洗練された、できれば) バリエーションになるはずです (点滅して申し訳ありません)。

ここに画像の説明を入力

実際、これは非常に一般的な問題です。この効果を使用するスクリーンセーバーは何千もあります。最も顕著なのは、星の生成と星の移動のパラメータを持つ「星のフィールド」です。したがって、このアルゴリズムには何らかの「設計パターン」、またはより広範な形式 (おそらく名前) が必要だと思います。私の問題を解決するのは、一般的な制御フロー(ループ、カウンター、ifs)でこれを達成する方法に関するいくつかの例またはチュートリアルです。

どんなアイデアでも大歓迎です!

4

1 に答える 1

1

あなたの質問がよくわかりません。これはアルゴリズムの質問ではなく、プログラミングのアドバイスのようなものです。私はまさにこれを必要とするゲームを持っています(車ではなくモンスター用)、これが私がしたことです。これは一種の .Net 疑似コードですが、他の環境にも同様のものがあります。

手動でアニメーションを実行している場合、基本的に「ゲームループ」が必要です。

while (noinput):
    timenow = getsystemtime();  
    timedelta = timenow - timeprevious;  
    update_object_positions(timedelta);  
    draw_stuff_to_screen();
    timeprevious = timenow;
    noinput = check_for_input()

は、このループが最後に実行されてからの時間であるupdate_object_positions(timedelta)に沿ってすべてを移動します。timedeltatimedelta ごとに完全な再描画が実行されます。20ミリ秒ごとに1回など、一定の速度で実行したい場合はthread.sleep(20-timedelta)、時間を20ミリ秒に詰め込むことができます。

ご質問に戻ります。速度、車線、タイプなど、および表示される時間を含む車のクラスがありました。限られた数の「車」を持っていたので、これらは事前に生成されました。私はこれらをリストに入れ、それらが出現した時点でソートしました。次に、update_object_position(time)ルーチンで、次の車の開始時刻が現在の時刻より前であるかどうかを確認し、そうであれば、最初の (次の) 車の開始時刻が将来の時刻になるまで、その車をリストから除外しました。

無限の数の車が必要です (私は推測します)。これにはわずかな変更が必要です。各車線の最初の車を生成し、その開始時間を記録します。を呼び出すときupdate_object_position()、車を発進させる場合は、その車線の次の車とその時間を見つけて、それを次の車にします。繰り返したいパターンがある場合は、パターン全体を一度に生成してリストに入れ、リストが空になったら新しいパターンを生成します。これは、ユーザーに可変パターン フローを指定させるという点でもうまく機能します。

最後に、ボリュームが増加するにつれて、実際のトラフィック フローで何が起こるかを見てきましたか? ランダムな小さなブレーキ動作により、後ろの車がわずかに過剰に反応し、わずかな過剰反応が蓄積すると、道路の 1 km 後方で完全に停止する車に変わります。それは非常に奇妙で、適切なシミュレーションであるだけでなく、壁紙/スクリーンセーバーに大きな効果をもたらす可能性があります.

于 2013-04-27T08:55:52.503 に答える