2012-04-17 64 views
0

我想寫一個圖形文檔的基本代碼,該圖形文檔每次將int推入數組時都會在圖上顯示一個值。這裏是代碼 -Actionscript 3.0 - removeChild不起作用

import flash.display.Shape; 
import flash.display.MovieClip; 
import flash.display.Sprite; 
var myShape:Shape = new Shape(); 
myShape.graphics.lineStyle(2, 0x990000, 2); 
var max:Number = 0; 
var graph:Array = new Array(); 
var container:Sprite = new Sprite(); 
var redrawGraph = setInterval(reDraw,1000); 
function reDraw() 
    { 
     while (container.numChildren) 
     { 
      container.removeChildAt(0); 
     } 
     graph.push(randomNum()); 
     graph.reverse(); 
     for (var ints in graph) 
     { 
     if (graph[ints] > max) 
     { 
      max = graph[ints]; 
     } 
    } 
for (var i:Number = 0; i < graph.length-1; i++) 
{ 
    myShape.graphics.moveTo(550-i*50, (max – graph[i])*20); 
    myShape.graphics.lineTo(550-(i+1)*50, (max – graph[i+1])*20); 
    container.addChild(myShape); 
} 
this.addChild(container); 
graph.reverse(); 
} 

function randomNum():int 
{ 

return Math.floor(Math.random() * 11);` 

} 

除了我遇到是我結束了重疊的前一個,它應該被刪除舊的圖形形狀似乎並不奏效的部分圖形中的問題。 ..我無法弄清楚爲什麼。

任何幫助,將不勝感激。

(約格式化對不起...這將無法正常工作

+0

這可能是一個範圍的問題,我會嘗試把痕跡入'reDraw'功能,保證'container'和'this'是什麼,你希望他們是。另外,請考慮使用Timer類而不是'setInterval'。 – shanethehat 2012-04-17 11:32:36

+0

我檢查使用痕跡,它似乎只是每個週期調用removeChildAt(0)一次,儘管肯定有不止一個。 (它實際上並沒有刪除它...) – 2012-04-19 00:36:46

回答

1

您對顯示對象層次結構與操作顯示對象的graphics對象之間的差異存在誤解。

您正在使用setInterval調用reDraw回調。

reDraw回調中,您使用的是graphics.moveTographics.lineTo來繪製圖表。但是,您每一幀都在不斷繪製到相同的「畫布」上,同樣是SpritemyShape

不需要相互添加和移除顯示對象。在這種情況下,您只需添加一次顯示對象。然後在每次刷新時清除畫布並再次開始繪製。

例如,考慮以下幾點:

var myShape:Shape; 
    var graph:Array; 
    var container:Sprite = new Sprite(); 

    myShape = new Shape(); 
    graph = new Array(); 
    var redrawGraph:int = setInterval(reDraw,1000); 

    container.addChild(myShape); 
    this.addChild(container); 

這裏我創建一個形狀,把形狀放入容器中,然後加入所述容器到根顯示對象,並且那幾乎是它。然後......

private function reDraw():void { 
     myShape.graphics.clear(); 
     myShape.graphics.lineStyle(2, 0x990000, 2); 

     graph.unshift(randomNum()); 

     var i:uint, len:uint = graph.length, max:int = 0; 

     for (i=0; i< len; i++) { 
      max = Math.max(graph[i], max); 
     } 

     for (i = 0; i < len; i++) 
     { 
      myShape.graphics.moveTo(550-i*50, (max - graph[i])*20); 
      myShape.graphics.lineTo(550-(i+1)*50, (max - graph[i+1])*20); 

     } 
    } 

然後在這裏,請注意,我不刪除或添加任何東西顯示樹,這棵樹已經組織了我想要的方式。我正在重繪的所有內容都是清除我的形狀,然後按照我希望顯示的方式重新繪製它。

有時您確實需要操作顯示層次結構,但這不是其中之一。

here的工作示例...

+0

非常感謝,完美的作品。我沒有意識到這些差異,但現在我明白了。 – 2012-04-19 02:30:42

0

所以當你創建MyShape的對象添加名稱,所以再往這個myShapes可能是有用的,通過使用getChildByName方法去除。

做了一些修改之後...

而MyShape的創造......

var myShape:Shape = new Shape(); 
myShape.name = "myShape"; 
. 
. 
. 
for (var i:Number = 0; i < graph.length-1; i++) 
{ 
    myShape.graphics.moveTo(550-i*50, (max – graph[i])*20); 
    myShape.graphics.lineTo(550-(i+1)*50, (max – graph[i+1])*20); 
    container.addChild(myShape); 
} 
this.addChild(container); 

,同時消除...

while(this.getChildByName("myShape")!= null){ 
    this.removeChild(this.getChildByName("myShape")); 
} 

試試這個,這將是做工精細...

+0

我給了它一個去,但它似乎還沒有刪除任何東西,它們仍然堆疊在一起。 – 2012-04-17 06:29:46

0

檢查這個代碼...

在此代碼我添加的圖形直接在UIComponent,該會工作得很好

...

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
       minWidth="955" minHeight="600" 
       creationComplete="application1_creationCompleteHandler(event)" > 
    <mx:Script> 
     <![CDATA[ 
      import flash.display.MovieClip; 
      import flash.display.Shape; 
      import flash.display.Sprite; 

      import mx.core.UIComponent; 
      import mx.events.FlexEvent; 


      private var _max:Number = 0; 
      private var _graph:Array = new Array(); 
      private var _container:UIComponent ; 

      protected function application1_creationCompleteHandler(event:FlexEvent):void 
      { 

       _container = new UIComponent(); 
       this.addChild(_container); 
       _container.graphics.lineStyle(2, 0x990000, 2); 
       var redrawGraph = setInterval(reDraw,1000); 
      } 

      private function reDraw() 
      { 
       _graph.push(randomNum()); 
       _graph.reverse(); 
       _container.graphics.clear(); 
       _container.graphics.lineStyle(2, 0x990000, 2); 
       for (var ints in _graph) 
       { 
        if (_graph[ints] > _max) 
        { 
         _max = _graph[ints]; 
        } 
       } 

       for (var i:Number = 0; i < _graph.length-1; i++) 
       { 
        var a:Number = Number(_graph[i]); 
        var b:Number = Number(_graph[i+1]); 
        _container.graphics.moveTo(550-i*50,(_max-a) *20); 
        _container.graphics.lineTo(550-(i+1)*50,(_max-b)*20); 
       } 
       _graph.reverse(); 
      } 

      private function randomNum():int 
      { 
       return Math.floor(Math.random() * 11); 
      } 
     ]]> 
    </mx:Script> 
</mx:Application>