2013-04-26 63 views
0

我不知道,如果題目是正確的,但...算法動畫整個場景運行要素

我想動畫(與HTML +帆布+ JavaScript)發生的一段路與給定的密度/流量/速度配置。爲此,我需要在一端有車輛的「源頭」,另一端有「水槽」。然後,某個參數將確定每個時間單位創建多少輛車輛,以及它們的(恆定)速度。然後,我想我應該有一個「時鐘」循環,以給定幀速率增加車輛的位置。優選地,用戶可以改變表格中的一些值,並且正在運行的動畫將相應地更新。

最終的結果應該是一個(複雜得多,希望)的這種變化(遺憾的閃爍):

enter image description here

其實這是一個很常見的問題,也有成千上萬的畫面'的使用這種效果的儲戶,最值得注意的是具有恆星生成和恆星運動參數的「恆星場」。所以,我相信這個算法必須有一些「設計模式」,或者更廣泛的形式(甚至可能是一個名字)。什麼可以解決我的問題將是一些例子或教程如何使用公共控制流(循環,計數器,ifs)來實現這一點。

任何想法非常感謝!

+0

最有可能的是在時間t有一個方程式的汽車速度。你有沒有找到一個方程來模擬這種行爲?如果是這樣,那麼其後相當簡單。你所有的待辦事項是將汽車放置在不同的起始位置,並在delta-t的每個汽車上運行下一個位置的方程,然後在delta-t時間的下一個位置對汽車進行動畫 – dchhetri 2013-04-26 03:13:00

+0

@ user814628我計劃使用恆定速度。所以,每輛車實例的速度都是不變的,而且它的位置增量會從中得出。我主要關心的是如何測試每輛車的創建和銷燬情況,特別是考慮到多車道環境,並且不是每個時鐘都會產生新的車輛。 – heltonbiker 2013-04-26 03:15:19

+0

你有什麼破壞車輛的條件?從控制點通過一定距離?或者也許在屏幕上不可見之後......?隨你便。同樣,您創造新車的條件是什麼?當車輛被摧毀時,你應該創建一個嗎?或者直到它達到最大上限數字...?這一切都有todo與規範,你沒有指定 – dchhetri 2013-04-26 14:52:37

回答

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)一切移動沿着timedelta,這是因爲這種循環上次執行多久。它會平淡地重繪每一次timedelta。如果您希望以恆定的速度運行,例如每20 mS一次,則可以使用thread.sleep(20-timedelta)填充時間至20mS。

回到你的問題。我有一個車類,包括速度,車道,類型等,以及它的出現時間。我擁有數量有限的「汽車」,所以這些都是預先生成的。我把它們放在一個列表中,按照它們出現的時間排序。然後在update_object_position(time)例程中,我看到下一輛車是否在當前時間之前有開始時間,如果是的話,我將車從列表中排除,直到第一輛(下一輛)車在未來有開始時間。

你想(我想)無限數量的汽車。這隻需要稍微變化。爲每個車道生成第一輛車,記錄其開始時間。當您撥打update_object_position()時,如果您啓動了一輛車,請爲該車道找到下一輛車及其時間,並製作下一輛車。如果您有要重複的模式,請一次性生成整個模式,然後在列表清空時生成新模式。這也可以讓用戶指定可變模式流程。

最後,您是否研究過卷在裝載時會發生什麼?隨機的小型制動活動導致汽車後方略微過度反應,並且隨着輕微的過度反應累積,它變成完全停止行駛一公里的汽車。它很奇怪,所以可能對你的壁紙/屏幕保護程序有很大的影響,以及作爲一個適當的模擬。

+0

這非常有用。我自己取得了一些進展,但我有興趣實施你的建議,特別是'update_positions'和'draw_everything'之間的分隔,因爲它們是不同的問題。此外,在我的情況下,在車道上創建新車的「規則」顯然取決於該車道上最後進入的車的位置。當我得到最終結果時,我會發佈一個答案供將來參考。謝謝! – heltonbiker 2013-04-27 19:32:27