2011-12-07 2 views
0

플래시 as3에서 프레임 이벤트를 드래그하거나 화면 주위로 이동하면서 부모 클립과 자식 클립 사이에 선을 그릴 수 있습니다. 사실 이것은 다음과 같은 코드를 사용하여 작업을했다 :flash as3 - 하위 위치에 대한 부모 클립의 위치 가져 오기

/*private function drawLine(childCircle,parentCircle):void 
{ 
    parentCircle.graphics.clear(); 
    parentCircle.graphics.lineStyle(lineWeight,lineColor); 
    parentCircle.graphics.moveTo(0,0); 
    parentCircle.graphics.lineTo(childCircle.x,childCircle.y); 
}*/ 

을 그러나 문제는 여러 자식 원이 부모 만들 수 있습니다, 그래서 기능은 위의 찬성 첫 번째 자식에 대한 부모의 줄을 지 웁니다입니다 부모로부터 두 번째 아이에게 그리기. 그래서 부모 대신 자식 서클에 선을 추가해야한다고 생각했지만,이 작업을 수행 할 때 자식과 관련된 부모 원에 대한 올바른 좌표를 얻을 수 없습니다. 내 코드는 다음과 같습니다.

private function drawLine(childCircle,parentCircle):void 
{ 
    //trace (parentCircle.x + "|" + childCircle.x); 
    childCircle.graphics.clear(); 
    childCircle.graphics.lineStyle(lineWeight,lineColor); 
    childCircle.graphics.moveTo(0,0); 
    childCircle.graphics.lineTo(parentCircle.x,parentCircle.y); 
} 

누구든지이 작업을 수행 할 수 있습니다. globalToLocal 및 localToGlobal에 대한 함수를 보았지만 전 세계적인 위치는 원하지 않습니다. 나는이 시도 :

private function drawLine(childCircle,parentCircle):void 
{ 
    trace (parentCircle.x + "|" + childCircle.x); 
    childCircle.graphics.clear(); 
    childCircle.graphics.lineStyle(lineWeight,lineColor); 
    childCircle.graphics.moveTo(0,0); 
    childCircle.graphics.lineTo(-childCircle.x,-childCircle.y); 
} 

를 그리고 정확한 지점에서 끝나는하지만 라인 대신 부모의 자식 클립에 닿는 때문에 내가 사용 끌어서 쉽게 방정식에 문제가 발생합니다.

답변

1

, 나는 자신의 선 그리기 돌봐 하위 클래스를 만드는 것이 좋습니다 것입니다. 또한 Enter Frame 이벤트를 잊어 버리고 자식이 움직일 때만 선 그리기를 구현합니다.이 경우 MouseMove 이벤트에 의해 트리거되지만 다른 유형의 트리거가 될 수 있습니다.

private var container:DisplayObject; 
private var line:Shape = new Shape(); 

public function Child() 
{ 
     //add the Line to be drawn as a Shape 
     addChild(line); 

     //everything starts after the Child has been added to the Stage 
     addEventListener(Event.ADDED_TO_STAGE , onAdded); 
} 

private function onAdded(event:Event):void 
{ 
     // remove this listener 
     removeEventListener(Event.ADDED_TO_STAGE , onAdded); 

     //identify the container 
     container = this.parent; 

     //listen to a Mouse Down event 
     addEventListener(MouseEvent.MOUSE_DOWN , onMouseDown); 

     //the Stage listens to a Mouse Up event 
     stage.addEventListener(MouseEvent.MOUSE_UP , onMouseUp); 
} 

private function onMouseDown(event:MouseEvent):void 
{ 
    //start listening to the Mouse Move when the mouse is down 
     addEventListener(MouseEvent.MOUSE_MOVE , onMouseMove); 
} 

private function onMouseMove(event:MouseEvent):void 
{ 
    //draw the line from the parent coordinates to the child coordinates 
    line.graphics.clear(); 
    line..graphics.lineStyle(1); 
    line.graphics.moveTo(container.x , container.y); 
    line.graphics.lineTo(this.x , this.y); 
} 

private function onMouseUp(event:MouseEvent):void 
{ 
     removeEventListener(MouseEvent.MOUSE_MOVE , onMouseMove); 
} 
0

은 당신이 뭔가를 할 수 있습니다 :

private function drawLines():void 
{ 
    // Clear graphics, prep line style 
    parentCircle.graphics.clear(); 
    parentCircle.graphics.lineStyle(lineWeight,lineColor); 

    // Create an array of all children to draw to, then 
    // loop through that array drawing a line to each 
    var ar:Array = [child1, child2, child3]; 
    var len:uint = ar.length; 
    for (var i:uint=0; i<len; i++) 
    { 
     drawLine(ar[i], parentCircle); 
    } 
} 

private function drawLine(childCircle,parentCircle):void 
{ 
    parentCircle.graphics.moveTo(0,0); 
    parentCircle.graphics.lineTo(childCircle.x,childCircle.y); 
} 
0

이렇게하면 또한 선으로 부모에 연결 드래그 아이 클립을 포함하는 드래그 부모 클립을 제공 할 것입니다.

Circle 클래스 :

package 
{ 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class Circle extends Sprite 
    { 
     private var _fill:int; 

     public function Circle(fill:int=0xFFFFFF) 
     { 
      super(); 

      this._fill = fill; 

      this.addEventListener(MouseEvent.MOUSE_DOWN, _startDrag); 
      this.addEventListener(MouseEvent.MOUSE_UP, _stopDrag); 

      draw(); 
     } 

     public function draw():void 
     { 
      this.graphics.lineStyle(2); 
      this.graphics.beginFill(this._fill); 
      this.graphics.drawCircle(0, 0, 7); 
      this.graphics.endFill(); 
     } 

     private function _startDrag(e:MouseEvent):void 
     { 
      e.stopPropagation() 
      this.startDrag(); 
     } 

     private function _stopDrag(e:MouseEvent):void 
     { 
      e.stopPropagation() 
      this.stopDrag(); 
     } 
    } 
} 

Main 클래스 (Stage 클래스) 대신 부모로부터 그리기의

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.events.Event; 

    [SWF(backgroundColor="#EDEDED", frameRate="30", width="500", height="500")] 
    public class Main extends Sprite 
    { 
     private var _parentCircle:Circle; 
     private var _children:Array = []; 

     public function Main() 
     { 
      _parentCircle = new Circle(0xFF0000); 
      this.addChild(_parentCircle); 
      _parentCircle.x = 250; 
      _parentCircle.y = 250; 

        // create some children 
      for (var i:int=0; i < 5; i++) 
      { 
       var childCircle:Circle = new Circle(); 
       childCircle.x = Math.random() * 500 - 250; 
       childCircle.y = Math.random() * 500 - 250; 
       _parentCircle.addChild(childCircle); 
      } 

      this.addEventListener(Event.ENTER_FRAME, _redraw); 
     } 

     private function _redraw(e:Event):void 
     { 
      _parentCircle.graphics.clear(); 
      _parentCircle.graphics.lineStyle(1); 

      for (var i:int=0; i < _parentCircle.numChildren; i++) 
      { 
       var child:DisplayObject = _parentCircle.getChildAt(i); 
       _parentCircle.graphics.moveTo(0, 0); 
       _parentCircle.graphics.lineTo(child.x, child.y); 
      } 

      _parentCircle.draw(); 
     } 
    } 
}