0

我是动作脚本的新手,

我的文档类是,

package
{
    //list of our imports these are classes we need in order to
    //run our application.
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;

    public class engine extends MovieClip
    {

        // moved ourShip to a class variable.
        private var Circle:circle = new circle()
        //our constructor function. This runs when an object of
        //the class is created
        public function engine()
        {
            addFrameScript(0, frame1);
            addFrameScript(1, frame2);
        }
        // frame 1 layer 1 --------------------------------------------------
        public function frame1()
        {
        stop();
        }
        //-------------------------------------------------------------------
        // frame 2 layer 1 --------------------------------------------------
        public function frame2()
        {
        Circle.x = stage.stageWidth / 2;
        Circle.y = stage.stageHeight / 2;
        addChild(Circle);
        }
        //-------------------------------------------------------------------
    }
}

我制作了两个框架,首先包含按钮和另一个我想移动但它不移动的圆圈,它停留在第二帧的中间

我的按钮类是

package
{
//imports
import flash.events.MouseEvent;
import flash.display.SimpleButton;
import flash.display.MovieClip;
//-------
public class start extends SimpleButton
 {
   public function start()
   {
   addEventListener(MouseEvent.CLICK, onTopClick);
   addEventListener(MouseEvent.MOUSE_OVER, onBottomOver);
   }

   function onTopClick(e:MouseEvent):void
   {
     MovieClip(root).gotoAndStop(2)
   }

   function onBottomOver(e:MouseEvent):void
   {
       }
 }
}

而我的圆形电影剪辑是

package
{
    //imports
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.ui.Keyboard;
    import flash.events.Event;
    import flash.events.KeyboardEvent; 

  public class circle extends MovieClip
  {
    private var speed:Number = 0.5;
    private var vx:Number = 0;
    private var vy:Number = 0;
    private var friction:Number = 0.93;
    private var maxspeed:Number = 8;
    public function circle()
    {
        addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
    }
    public function loop(e:Event) : void
    {
        addEventListener(KeyboardEvent.KEY_DOWN, keyHit);
        x+=vx;
        y+=vy
    }
    function keyHit(event:KeyboardEvent):void {
        switch (event.keyCode) {
            case Keyboard.RIGHT :
            vx+=speed;
            break;
            case Keyboard.LEFT :
            vx-=speed;
            break;
            case Keyboard.UP :
            vy-=speed;
            break;
            case Keyboard.DOWN :
            vy+=speed;
            break;
            }

            }
  }
}

很抱歉发布这么多内容供大家阅读,但 stackoverflow 是唯一可以帮助我的网站!

4

1 回答 1

1

你犯了几个重大错误。首先,addFrameScript()将代码放置在帧上不是正确的方法,请使用 Flash 的编辑器将代码放置在时间轴上。(IIRC,您必须从您的两个中进行一次调用才能使您添加到功能的所有代码)并且,如果 MCcurrentFrame是带有代码的框架,那么您添加到 MC 框架的任何代码都会在每一帧执行. 因此,您正在添加一个函数“frame2()”,它将Circle每帧放置在舞台的中心!您应该在设计时将它(将其链接到属性)放入第二帧或构造函数中,或者您可以使用单个帧而Sprite不是MovieClip,而不是使用帧,您可以使用容器精灵,添加和删除他们随意,或采取行动。

另一个主要错误是在 enterframe 侦听器中添加事件侦听器 - 它们会累积,而不是相互覆盖,因此您可以将多个函数指定为特定事件的侦听器,甚至可以多次指定一个函数。后者发生在你身上,所以每一帧keyHit都会添加一个监听函数的另一个实例作为监听器。分配侦听器的正确方法是在构造函数中,或者在任何侦听手动触发事件的函数中(例如MouseEvent.CLICK,现在需要。

编辑:好的。你的代码是:

        addFrameScript(0, frame1);
        addFrameScript(1, frame2);

更正确的方法应该是:

addFrameScript(0,frame1,1,frame2);

原因是,调用将所有时间线代码addFrameScript 替换为您在此处提供的代码。该功能未记录,可能是由于它对舞台和 AS3 环境的影响。addFrameScript()到目前为止,与文档最接近的是这个链接

下一个:您的代码是:

public function circle()
{
    addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}
public function loop(e:Event) : void
{
    addEventListener(KeyboardEvent.KEY_DOWN, keyHit);
    x+=vx;
    y+=vy
}

正确的写法如下:

public function circle()
{
    addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
    if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE,init);
}
private function init(e:Event=null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE,init);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHit);
}
public function loop(e:Event) : void
{
    x+=vx;
    y+=vy
}

监听器应该在构造函数中分配,如果它们是永久的,或者您希望它们在创建对象后立即处于活动状态。侦听器是单独的KeyboardEvent情况,因为为了使它们起作用,您必须将它们分配给stage,这在创建对象时不可用,因此您需要一个中间层 - 该init()函数,仅在对象时调用被添加到阶段。此时stage不再为空,您可以在那里分配一个事件监听器。请注意,如果您想让您的圈子最终消失,您必须在删除处理代码的某个时间点删除您分配给舞台的侦听器。

下一个: 您的代码:

    public function frame2()
    {
    Circle.x = stage.stageWidth / 2;
    Circle.y = stage.stageHeight / 2;
    addChild(Circle);
    }

正确的代码应该是:

public function frame2():void 
{
    if (Circle.parent) return; // we have added Circle to stage already!
    Circle.x = stage.stageWidth / 2;
    Circle.y = stage.stageHeight / 2;
    addChild(Circle);
}

看,每次你的 MC 在第二帧停止时你都会调用它,因此你不断地将Circle' 的坐标重置到舞台中心,所以你看不到它是否移动(它没有,因为你已经分配了键盘监听器不阶段)。

或许还有更多的错误,但修正这些会让你的 MC 一点点滴答作响。

于 2013-10-04T16:34:32.310 回答