ActionScript类引用

时间:2016-05-21 13:57:00

标签: actionscript-3

我有一个班级广场和一个班级圈。

这是我的班级圈子:

public class Circle extends MovieClip
    {
        var growthRate:Number = 2;

        public function Circle() 
        {

            addEventListener(Event.ENTER_FRAME, grow);  

        }
        function grow(e :Event):void
            {
                e.target.width +=growthRate;
                e.target.height +=growthRate;
            }

    }

我需要停止在Shape中的一个函数内生成圆圈。

public function Square() {
            buttonMode = true;
            addEventListener(MouseEvent.MOUSE_DOWN, down);

        }

        protected function down ( event: MouseEvent):void 
        {
        //here i need to stop the circle
        }

我不知道如何与Circle类建立关系以阻止圈子的增长。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

我不知道如何与Circle类建立关系以阻止圈子的增长。

那是因为你不能使用你现在拥有的代码。你班上没有什么可以从外面(public)访问,这会阻止增长。但是在你的课堂上甚至没有private来做这件事。功能根本不存在。

首先,创建所需的功能。并将其提供给public

以下是您的Circle课程的样子:

public class Circle extends Sprite
{
    private var growthRate:Number = 2;

    public function Circle() 
    {
        // nothing here

        // this is just to create a circle graphic, if you have artwork in your library symbol, you do not need this
        graphics.beginFill(0xffffff * Math.random());
        graphics.drawCircle(0, 0, 10 + 30 * Math.random());
        graphics.endFill();
    }

    public function startGrowing(rate:Number = 0):void
    {
        if(rate != 0)
        {
            growthRate = rate;
        }

        addEventListener(Event.ENTER_FRAME, grow);  
    }

    public function stopGrowing():void
    {
        removeEventListener(Event.ENTER_FRAME, grow);  
    }

    private function grow(e:Event):void
    {
        width += growthRate;
        height += growthRate;
    }
}

注意

  1. 构造函数:我用代码创建一个圆形图形。正如评论所说,如果Circle是与库符号关联的类,则不需要此类,因为您已经在符号中创建了图稿。
  2. 超级班:它是Sprite。这应该是您的默认超类。使用MovieClip的唯一真正原因是,如果您有时间轴动画。您发布的内容看起来并不像您所知,所以我建议Sprite
  3. 这两个新的公开方法:startGrowingstopGrowing,这些方法正是他们的名字所暗示的。 startGrowing有一个可选参数,可以以不同的增长率开始增长。
  4. 缺少e.target:这里没必要。
  5. 该代码的简单演示如下:

    var circle:Circle = new Circle();
    circle.x = 200;
    circle.y = 200;
    addChild(circle);
    
    circle.startGrowing();
    //circle.startGrowing(1); // grow slowly
    //circle.startGrowing(5); // grow fast
    

    要停止增长,请停止收听ENTER_FRAME Event

    到目前为止,现在对你的实际问题非常好了:

      

    如何与Circle类建立关系

    protected function down ( event: MouseEvent):void 
    {
        //here i need to stop the circle
    }
    

    你认为你应该在Square课程中建立这种联系,但你错了。 以这种方式连接两个类是非常的错误做法。您希望这些类尽可能个性化。

    把它想象成电话。您的手机是否可以直接通过特定的其他手机?没有。它能够连接到任何手机,这使得它比连接到另一部手机的手机更有用。

    使用事件在两个类之外建立连接。这就像你的手机用一个想要拨打的号码打电话到网络。然后,网络会找出如何找到具有该号码的另一部电话以及如何建立连接。

    作为一个简短的插曲,所以我们在同一页面上,这是我正在使用的Square课程:

    public class Square extends Sprite
    {
        public function Square() 
        {
            // nothing here
    
            // this is just to create a circle graphic, if you have artwork in your library symbol, you do not need this
            graphics.beginFill(0xffffff * Math.random());
            graphics.drawRect(0, 0, 100, 100);
            graphics.endFill();
        }
    }
    

    如您所见,它只有一个构造函数,我以编程方式绘制一个矩形。同样,如果您的图书馆符号中有所需的艺术作品,则无需这样做。在这种情况下,构造函数将为空,反过来整个类文件将为空。在这种情况下,您甚至不需要类文件。只需将库符号与名称相关联即可。 Square只是一个图形资产,没有附加任何代码。

    这是一个使用这两个类的完整文档类:

    package 
    {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
    
        public class Main extends Sprite 
        {
            private var circle:Circle;
    
            public function Main() 
            {
                circle = new Circle();
                circle.x = 200;
                circle.y = 200;
                addChild(circle);
    
                circle.startGrowing(1);
    
                var square:Square = new Square();
                addChild(square);
    
                square.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            }
    
            private function onMouseDown(e:MouseEvent):void
            {
                circle.stopGrowing();
            }
        }
    }
    

    如您所见,事件侦听器已添加到文档类中,并且事件发生时执行的函数也在Main中。

    这是没有正方形的变体。这次你必须点击圆圈才能阻止它的增长:

    package 
    {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
    
        public class Main extends Sprite 
        {
            private var circle:Circle;
    
            public function Main() 
            {
                circle = new Circle();
                circle.x = 200;
                circle.y = 200;
                addChild(circle);
    
                circle.startGrowing(1);
    
                circle.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            }
    
            private function onMouseDown(e:MouseEvent):void
            {
                circle.stopGrowing();
            }
        }
    }
    

    正如您所看到的,通过事件在两个类之外建立连接可以让您以不同的方式进行连接。就像让手机直接连接到网络而不是另一部手机一样。