2012-04-17 3 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

+0

Я проверил с помощью следов, и это только кажется, вызывает removeChildAt (0) один раз за такт, несмотря на то, что определенно более одного. (и это на самом деле не удаляет его ...) –

ответ

1

У вас возникло непонимание разницы между иерархией экранных объектов и манипулированием объектом graphics отображаемого объекта.

Вы используете setInterval для вызова обратного вызова reDraw.

В обратном вызове reDraw вы используете graphics.moveTo и graphics.lineTo, чтобы нарисовать график. Однако каждый кадр, который вы постоянно рисуете на одном и том же «холсте», тот же Sprite: myShape.

Добавление и удаление отображаемых объектов друг от друга не требуется. В этом случае вам нужно только добавить объекты отображения один раз. И затем при каждом обновлении очистите полотно и начните рисовать снова.

Для примера рассмотрим следующее:

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

Большое вам спасибо, что работает отлично. Я не знал о различиях, но сейчас понимаю. –

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

Я дал это, но он все еще, кажется, ничего не снимает, они все еще наваливаются друг на друга. –

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>