2013-01-08 68 views
1

我在JavaScript中有一個尋找HTML5 canvas的尋路腳本,看起來有多路複用的問題。JavaScript/HTML5畫布尋路多路複用問題

jsFiddle Demo

劇本拍攝並稍微改編自接受蘇答案在這裏:A* Start path finding in HTML5 Canvas(其中也有同樣的錯誤)。

如何複製問題:只需在紅色正方形運動時在地圖上快速點擊,即可看到正方形分裂或分支到每個不同路徑。

我認爲發生的事情是,你應該注意到紅色方塊在分支過程中開始閃爍,它實際上只是同一個方塊試圖同時在多個地方,導致同一個方塊「傳送」回來並以交替幀的幀速率出現。這只是一個理論,但我認爲它實際上並沒有產生更多的方塊。

我不確定它是否與movePlayer()函數或pathFinding()函數有關。我認爲我需要做的是,如果對象正在移動並且目標磁貼已更新,請取消之前的任何操作,而不是繼續同時運行它們 - 我不知道該怎麼做。由於這將最終成爲敵人AI腳本,因此當玩家在地圖上移動時,目標圖塊將始終實時更新,這可能會導致此問題出現。

謝謝,我感謝任何幫助調試!

+0

我會嘗試預先計算幀並使其平滑 – philipp

+0

@philipp您的意思是某種幀緩衝? –

+0

至少爲查看/渲染部分 – philipp

回答

1

從我可以告訴,問題是與定時器正在使用。當您單擊時,它將計算當前位置與您單擊的位置之間的路徑,然後啓動一個計時器,使該方形沿該路徑移動,爲該計時器本地存儲信息。當你再次點擊時,它會啓動另一個定時器而不清除舊定時器,所以它現在同時從兩個不同的定時器沿着兩條路徑移動。它正在繪製每個計時器的每個動作,這可以看作是閃爍。

+0

所以你在說因爲'movePlayer()'遞歸地調用自己,如果'movePlayer()'當前已經在運行,那麼每次更新目標時間時都會複雜化呢?你提出什麼解決方案? –

+0

我可以想到兩個簡單的解決方案。第一種可能最簡單的方法是在新的啓動時清除舊的計時器。當調用setTimeout時,將結果設置爲全局變量(setTimeout/setInterval返回一個用於引用的整數定時器ID)。在調用setTimeout之前,在存儲的ID號碼上調用clearTimeout,這將停止前一個定時器的完成。第二個是將路徑存儲在全局而不是本地,但是您仍然可能需要管理定時器。 – Treip

+0

它沒有工作:(。var timer =(function(data,step){window.setTimeout(function(){movePlayer(data,step)},60)});','canvas.onclick = function (e){[...] clearTimeout(timer);}','function movePlayer(data,step){[...] timer(data,step);}'。與前面相同。 –