2016-10-28 3 views
0

그래서 작은 유틸리티를 썼습니다. 약간의 시간을 절약하기 위해 확장 하겠지만, 컴파일러 문제는 없지만 모양을 그리는 것처럼 보입니다.왜이 사용자 지정 라이브러리는 도형을 그립니 까? Actionscript 3

사용자 정의 클래스 :

import ezd.easydraw.EasyDraw; 
stop(); 
var ezd:EasyDraw = new EasyDraw(); 
stage.focus = ezd._root; 
ezd.DrawCircle(300, 300, 500); 

내가 잘못 뭐하는 거지 :

package ezd.easydraw 
{ 
    import flash.display.MovieClip; 
    import flash.display.Shape; 

    public class EasyDraw extends MovieClip 
    { 
     public var _root:MovieClip = new MovieClip(); 
     public function DrawCircle(xpos:Number=200.0, ypos:Number=200.0, r:int=50, color:uint=0x00FF00, alph:Number=1.0) 
     { 
      _root = MovieClip(_root); 
      var circle:Shape = new Shape; 
      circle.graphics.beginFill(color, alph); 
      circle.graphics.drawCircle(xpos, ypos, r); 
      circle.graphics.endFill(); 
      _root.addChild(circle); 
     } 
     public function DrawRect(xpos:Number=200.0, ypos:Number=200.0, w:int=50, h:int=50, color:uint=0x00FF00, alph:Number=1.0) 
     { 
      _root = MovieClip(_root); 
      var rect:Shape = new Shape; 
      rect.graphics.beginFill(color, alph); 
      rect.graphics.drawRect(xpos, ypos, w, h); 
      rect.graphics.endFill(); 
      _root.addChild(rect); 
     } 
    } 
} 

그리고 "주"창 모양을 그리는?

답변

1

내가 뭘 잘못하고 있니?

  1. _root
  2. 표시 목록의 사용이
일반

  • 디자인을 어떻게 작동하는지 _root 변수는 전혀 쓸모가있다. 아마 일부 온라인 자습서에서 복사 한 것입니다. 그것은 나쁜 습관이고 더 나쁜 습관으로 이어집니다. 이미 존재하는 기능을 재창조합니다. 사용하지 마십시오.

    다음은 EasyDraw 클래스 그 자체입니다. 그 클래스는 기본적으로 셰이프를 추가하는 메서드가있는 빈 컨테이너입니다. DisplayObjectDisplayObjectContainer에 추가하는 디스플레이 목록의 일반적인 구조가 주어지면 이는 불필요하게 결합 된 것처럼 보입니다. 왜 컨테이너가 방법을 가지고 아이들을 만들까요? 대신 객체 지향 방식으로 원과 사각형을위한 별도의 클래스를 생성하십시오. 그런 다음 컨테이너가 필요한 경우 Sprite 개체에 추가하십시오. EasyDraw은 필요 없습니다.

    개략적 인 개념은 아래의 두 클래스로 이어질 수 있습니다. 그들은 당신의 코드를 기반으로합니다. 여기에 꽤 순진한 객체 지향 사고 : 당신은 원을 원합니까? 그것을위한 클래스를 만드십시오! 사각형을 원해? 그것을위한 클래스를 만드십시오! 그러나 그것은 일을 끝낸다.

    package ezd.easydraw 
    { 
        import flash.display.Shape; 
    
        public class RectangleShape extends Shape 
        { 
         public function RectangleShape(w:Number = 50, h:Number = 50, color:uint = 0) 
         { 
          graphics.beginFill(color, 1); 
          graphics.drawRect(-w/2, -h/2, w, h); 
          graphics.endFill(); 
         } 
        } 
    } 
    

    package ezd.easydraw 
    { 
        import flash.display.Shape; 
    
        public class CircleShape extends Shape 
        { 
         public function DrawCircle(r:Number=50, color:uint = 0) 
         { 
          graphics.beginFill(color, 1); 
          graphics.drawCircle(0, 0, r); 
          graphics.endFill(); 
         } 
        } 
    } 
    
    나는 주로 개인적인 취향 일부 조정이 당신의 방법 할 무료 느낌 :
    • 내가 같은 생성자에서 위치를 정의하는 매개 변수를 제거을 그들이 그냥 생성자를 부풀려서 각각 DisplayObject은 어쨌든 설정자를 정의합니다. 관련된 모든 값을 하나의 커다란 함수 호출로 밀어 넣으 려한다면, 생성 된 객체를 반환하는 static 메소드를 생성하는 것이 좋습니다.

    • 색상의 기본값은 다소 이상합니다. 나는 그것을 바꿨다.인스턴스를 생성하고 DisplayObjectContainer에 추가 :

    • 기원은, 당신은 단지 어떤 DisplayObject처럼 그들에게 를 사용 어쨌든 각 모양

    의 중심에있다. 그것이 중요한 포인트입니다. 그들은 이미 제자리에있는 API와 조화를 이룹니다. 귀하의 타임 라인 코드가 지금과 같을 수 :

    import ezd.easydraw.EasyDraw; 
    stop(); 
    var circle:Circle = new Circle(300, 0xff00); 
    circle.x = circle.y = 300; 
    addChild(circle); 
    

    을 이제 컨테이너에 원을 추가 할 경우 Sprite은 잘 할 것 :

    import ezd.easydraw.EasyDraw; 
    stop(); 
    var container:Sprite = new Sprite(); 
    addChild(container); 
    
    var circle:Circle = new Circle(300, 0xff00); 
    circle.x = circle.y = 300; 
    container.addChild(circle); 
    
  • 관련 문제