2012-01-08 81 views
0

我的問題是:如何僅使用代碼重繪形狀?如何在ActionScript 3.0中重繪形狀?

對任務本身的簡短評論。我有一個eventListener,它可以捕捉舞臺和舞臺大小的點擊。兩者都執行相同的功能 - redrawEvents(evt:Event)。舞臺包含一些代表某些事件的區塊。在每次重繪時,都會重新定位這些塊,並繪製線條(表示事件之間的連接)。

我已經想出了一種重新定位所有塊的方法,但是我被卡在重繪線上。

我使用單個形狀來保存所有行,因爲與塊不同,行不是交互式的。由於應用程序的全部內容都是創建一系列互連事件,所以每次創建新塊時都必須修改此形狀,這也會調用重繪功能。

下面是我用它來修改形狀

stage.addEventListener(MouseEvent.CLICK,redrawEvents); 

function redrawEvents (evt:Event) { 
    var lines:Shape = new Shape(); 
    lines.graphics.lineStyle(2, 0xFFFFFF, .75); 
    lines.graphics.clear(); 
    for (var k:int = 0; k < connections.length; k++){ 
     lines.graphics.moveTo(eventList[connections[k][0]].x + 50, eventList[connections[k][0]].y + 50); 
     lines.graphics.lineTo(eventList[connections[k][1]].x + 50, eventList[connections[k][1]].y + 50); 
    } 
    addChild(lines); 
} 

但是,每當形狀被修改了代碼,但它仍然會使屏幕上的自己的「舊版本」,而我不希望出現這種情況。我試圖創建和刪除實例,變量類型轉換,但仍然沒有解決問題。

在此先感謝

回答

3

每次繪製線條,您要添加一個新的Shape舞臺。您可以保留對其的引用並將其從顯示列表中刪除,或者在繪製新的一組行之前僅使用一個實例和Graphicsclear()方法。

+0

我已經更新了代碼^並回復了evilguy。 不過,這要麼是我做錯了什麼,要麼這些建議不能解決我的問題。現在我的舞臺上沒有任何線條:) – 2012-01-08 20:25:31

+0

@Loki'lines'是你的事件處理程序的一個局部變量 - 你在'Shape'的新實例上調用'clear()',所以你唯一重新清除是線條樣式。你需要將'lines'作爲一個類字段(或者保存在某個地方),只將其初始化一次(不是每次事件觸發)並在任何其他繪圖命令之前調用clear()。 – Staven 2012-01-08 20:30:30

+0

好吧,我們假設我會在'redrawEvents'之外放置'lines'和'lineStyle'以及全局變量。那我該如何訪問這個函數中的'lines'? – 2012-01-08 20:33:53

0

您是否每次重繪都創建新的Shape實例? 你嘗試過removeChild(線)嗎?

+0

我有,但是刪除形狀的insta,我總是需要在舞臺上保持1個實例,顯示對象之間的連接 – 2012-01-08 20:17:04

+0

@Loki:你需要刪除舊的實例,然後再添加新的一。 – Staven 2012-01-08 20:24:37

+0

好吧,顯然我必須在修改形狀之前移除孩子,並在修改後創建一個新孩子。儘管如此,當我試圖做到這一點 - 我有一個錯誤,說我不能刪除一個不存在的孩子。 – 2012-01-08 20:26:53