2011-03-26 61 views
0

我正在做一個尋路項目,作爲我第四年軟件工程學位的一部分。 我們假設給一堆多智能體尋路算法提供視覺表示。最簡單的是A *適用於多代理。擺動柵格單元的顏色淡化動畫Pin

無論如何,我們的環境是一個網格地圖,每個單元格可以被阻塞或用作代理程序路徑的一部分。我想要做的是使用動畫給出代理的最終移動的良好表示,但在網格中爲動畫改變顏色。 I.E用一些顏色畫出路徑中的每一步,以顯示代理如何移動。

而我想要做的另一件事是通過在打開列表和A *算法的閉合列表中繪製其計算過程中的更改來表示算法的工作方式。

我正在使用觀察者設計模式的改編版本,從我的算法層發送事件到我的控制器和GUI層。 我想在GUI層中做的事情是每次將一個圖塊添加到打開的列表中時,我想讓該圖元以某種顏色繪製,然後根據預定義的計時器將其消除,或者稍後可以將滑塊添加到控制這個計時器。我看了一下code here。看起來很簡單,問題是每個tile動畫必須獨立於其他動畫,以允許算法和所有內容繼續運行並啓動不同的動畫。

那麼實現我要找的結果的最好方法是什麼?我應該爲每個動畫打開一個不同的線程,還是爲每個單元格預先製作線程? 這對於應用程序來說會是一種矯枉過正,因爲可以有多達1000個單元,因此可以有近1000個執行動畫的線程。

我想我可能會遇到的另一個問題是,它可能會發生這樣的事實,一個單元格將開始其顏色衰落動畫,然後將不得不重新啓動,我不希望兩個動畫在同一時間去(只一個線程同時爲同一個單元格執行動畫)。

我希望我已經足夠清楚我想要達到的目標,如果有人有任何想法或想法,它可以幫助我實現我的項目。

+0

「我希望我已經清楚了我想要達到的目標......」直到現在編輯10分鐘後,我甚至可以理解你發佈的那些信件。所以不行。技術學位第四年的人應該能夠找到他們的換檔鍵,並在每個句子的開頭應用一次,並且每次使用「I」這個詞。它也不利於使用* wanna *等俚語詞彙。這些是國際論壇,很多人不會理解這個詞。那些確實會認爲你是愚蠢的,不值得他們的關注和時間。請多加小心。 – 2011-03-26 12:31:52

回答

2

你可以找到三叉戟動畫庫有用。更多的信息在http://kenai.com/projects/trident/pages/Home

+0

看起來像一個很酷的圖書館,它如何處理同時發生的許多動畫?它會有效嗎?看起來好像我不得不爲每個單元格創建這些時間軸對象之一,難道不會像每個單元格創建一個線程一樣?謝謝 – 2011-03-26 14:54:38

+0

三叉戟非常高效。看看基里爾的博客:http://www.pushing-pixels.org/2009/06/23/trident-part-5-supporting-ui-toolkits.html – 2011-03-26 16:57:40

1

我會考慮只有一個動畫線程的場景。你可能會請嘗試以下策略:

  • 標準事件線程擺動事件
  • 一個工作線程的邏輯
  • 只有一個額外的所有動畫

這第三個線程管理你的GUI中的所有動畫。因此它維護一個動畫動作列表以及它們的時間戳。這種動作可以是例如在適當的數據結構中「將單元格的顏色[1,2]設置爲CF0000 @ 17:01:00」。這個動作列表由工作者線程和動畫動作填充(例如,你可以爲衰落單元添加多個動作 - 1),現在設置爲100%@; 2)設定爲75%@現在+ 10秒; 3)設置爲50%@現在+ 20s ...)。確保這個列表是正確同步的,因爲它將從兩個線程訪問。

如果您保持此列表按時間戳排序,則很容易確定此線程在任何時候必須執行的操作。這個線程然後有一個非常簡單的循環,例如像

while(true) { 
    AnimationAction action = list.get(0); 
    if(action!=null && action.timestamp <= now()) { 
      action.perform(); // <= be sure that paint events occur in the edt 
     list.remove(0); 
     continue; 
    } 
    sleep(...); 
} 

請注意,您可以確定時間從下一個動作的時間戳睡覺,但考慮到到達一個新的動畫事件可能要中斷此。否則,您也可以在短時間內入睡。

關於你的第二個問題,如果一個新的動作到來,這個線程可能會根據需要從這個列表中刪除任何動作。因此,您可能還需要維護一個輔助數據結構以便高效地完成此操作。

+0

謝謝,那種我心目中的,我是什麼我不確定如何告知animationManager線程需要多長時間進入休眠狀態,因爲每個更改都可能發生在不同的時刻。線程應該可以隨時保持活躍狀態​​或以某種方式設法喚醒下一個動畫在隊列中需要改變。也許我需要使用一種接近遊戲中發生的機制,每次線程醒來都會檢查上一次執行其操作的時間,然後根據經過的時間計算顏色值chnage,這是否有必要?謝謝 – 2011-03-26 16:44:29

+0

@Amit正如在我的回答中所提到的,您可以睡一段固定的時間(例如,對於任何類型的衰落動畫,大約50到100毫秒應該是可以的),或者僅僅是time.timestamp-now()。在後一種情況下,一定要處理一個新行動到達的情況,必須在此之前安排並在此情況下中斷睡眠。如果你想在你的評論中以另一種方式處理它,你會遇到不同的情況。然後,您必須根據過期的時間來管理所有「正在進行的」衰落並重新處理它們中的每一個。 – Howard 2011-03-26 16:55:07

+0

+1只要確保在[事件派發線程](http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html)上執行所有繪圖。 – trashgod 2011-03-26 17:01:32

1

我會用javax.swing.TimerAlphaComposite,如演示here