Actionscript 3 stop()不起作用

时间:2011-12-02 13:21:21

标签: actionscript-3

我有一个actionscript类,它加载到一个flash文件中,该文件有一些基于时间轴的活动。

当我尝试使用stop();函数并编译此文件时,出现错误:

Warning: 1060: Migration issue: The method stop is no longer supported.  For more information, see MovieClip.stop()..

为什么会这样?

编辑:这是我的代码,它在画布上绘制一个弧

package {

    import flash.display.Sprite;
     import flash.display.Shape;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.utils.setInterval;
    import flash.utils.clearInterval;

    public class arcy extends Sprite {

        var my_canvas:Sprite = new Sprite();
        var deg_to_rad = 0.0174532925;
        var looper:int=0;
        var sec_count:int=80;
        var intervalID:int=0;


        public function arcy() {

            addChild(my_canvas);    
            var frequency = 6;
            intervalID = setInterval(on_enter_frame,frequency);

            my_canvas.graphics.lineStyle(40,0xCCCCCC,1,false,"normal", "none");
            //draw_arc(my_canvas,250,200,150,-200,-90,1); //final position
            //draw_arc(my_canvas,250,200,150,-450,-90,1); //initial position


        }

        public function make_circle(increment)
        {

        //creating a new shape instance
        var circle:Shape = new Shape(); 
        // starting color filling
        circle.graphics.beginFill( 0x52E700 , 1 );
        // drawing circle 
        circle.graphics.drawCircle( 0 , 0 , increment*1.2 );
        // repositioning shape
        circle.x = 250;                                 
        circle.y = 200;
        // adding displayobject to the display list
        addChild( circle ); 

        }

        public function draw_arc(movieclip,center_x,center_y,radius,angle_from,angle_to,precision) {
            var angle_diff=angle_to-angle_from;
            var steps=Math.round(angle_diff*precision);
            var angle=angle_from;
            var px=center_x+radius*Math.cos(angle*deg_to_rad);
            var py=center_y+radius*Math.sin(angle*deg_to_rad);
            movieclip.graphics.moveTo(px,py);
            for (var i:int=1; i<=steps; i++) {
                angle=angle_from+angle_diff/steps*i;
                movieclip.graphics.lineTo(center_x+radius*Math.cos(angle*deg_to_rad),center_y+radius*Math.sin(angle*deg_to_rad));
            }
        }

        public function on_enter_frame() {

                looper++;
                if(looper >= sec_count){
                clearInterval(intervalID);
stop();
//also tried MovieClip(root).stop();
                }

                make_circle(looper);
                my_canvas.graphics.clear();

                my_canvas.graphics.lineStyle(40,0x52E700,1,false,"normal", "none");
                draw_arc(my_canvas,250,200,150,270,270+looper*3,1);

                my_canvas.graphics.lineStyle(40,0xCCCCCC,1,false,"normal", "none");
                draw_arc(my_canvas,250,200,150,-450+looper*3,-90,1); //initial position

                my_canvas.graphics.lineStyle(40,0xFFFFFF,1,false,"normal", "none");
                draw_arc(my_canvas,250,200,150,-93+looper*3,-90+looper*3,1); //initial position

                my_canvas.graphics.lineStyle(40,0xFFFFFF,1,false,"normal", "none");
                draw_arc(my_canvas,250,200,150,-90,-87,1); //initial position

        }
    }

}

5 个答案:

答案 0 :(得分:1)

您的问题是您在函数内部调用了stop(),但没有为该方法指定对象。因此,arcy正在运行stop()命令并遇到问题,因为它是一个Sprite而不是MovieClip。

这是有问题的代码:

public function on_enter_frame() {

      looper++;
      if(looper >= sec_count){
      clearInterval(intervalID);
      stop(); // This is the problem.
}

您需要在MovieClip类型的对象上调用stop()。不幸的是,它看起来并不像你在代码中定义的那样 - 你没有强烈地输入你的许多变量,而且只有少数是Sprite类型的变量。 (事实上​​......您甚至没有在代码中导入flash.display.MovieClip。)

这是一个快速测试;让你的arcy类扩展MovieClip。如果您不再收到错误,则需要在另一个对象上调用stop()

答案 1 :(得分:1)

当您在代码中调用stop()时,您将在一个Sprite(“archy”)类中调用它。 Sprite没有时间轴(它们只是一个容器)因此没有stop()方法。这就是你收到错误的原因。

你想停止什么时间表?只需拨打clearInterval(),就可以正常停止间隔。

答案 2 :(得分:0)

我见过这种情况的唯一地方是尝试在不是.stop()的DisplayObject上调用MovieClip,就像尝试在{{1}上调用.stop()一样或Sprite。精灵和形状没有时间轴,无法停止,但是它不是标准方法丢失错误,而是动态抛出此警告。

您打算在Shape上调用哪个对象?

答案 3 :(得分:0)

通过使用另一个答案所述的stop();输入arcy类,它是一个sprite类型,并且没有stop函数,因为没有帧。

尝试此代码时

//also tried MovieClip(root).stop();

它失败了,因为arcy实例没有添加到舞台上。 为了访问该阶段,必须将类实例添加到该阶段。 真正的OOP方法是模块化这个类并让它发送一个事件。

// change this code 
looper++;
if(looper >= sec_count){
  clearInterval(intervalID);
  stop();
  //also tried MovieClip(root).stop();
}


// to
looper++;
if(looper >= sec_count){
  clearInterval(intervalID);
  this.dispatchEvent( new Event('DOSTOP') )
}



Now where you created the class instance add the event listener.

var myArcy:arcy = new arcy() // always strongly type your vars.
myArcy.addEventListener( 'DOSTOP', doStop )


// and add the call back function for the listeners
function doStop ( e:Event ):void{
  stop()
}

答案 4 :(得分:0)

你的类是一个Sprite(它没有时间轴)所以调用stop()会失败,因为Sprite.stop()不存在

你需要在动画片段上调用停止

someMovieClipReference.stop();

优雅......

if (someMovieClipReference is MovieClip)
    someMovieClipReference.stop();