2010-08-12 58 views
1

在ActionScript 2代码示例中,它使用一些MovieClip.prototype的函数,如MovieClip.prototype.setModel;如何在ActionScript 3中获取MovieClip.prototype?

我想使用ActionScript 3类写这个例子,但MoviewClip.prototype不存在,我可以从哪里得到它?它存在于ActionScript 3中吗?

--update

好吧,你都在问,这里有云,此代码的工作只是罚款为ActionScript包括在帧1,但我想打一个ActionScript 3的类与此相同的代码:

//package 
//{ 
// public class asteroids extends MovieClip 
// { 

     var MW = 8;      // Scaling factor for models (which were originally drawn on graph paper) 
     var SW = Stage.width;   // Stage coords 
     var SH = Stage.height; 
     var kDegToRad = Math.PI/180; // Useful constant for drawing circles & such 
     var kDamp = 0.99;    // Damping in ship acceleration 

     // The models 
     // 
     // Rocket fuselage 
     var fuseModel = [{mx:0, my:-5.5, x:0, y:-4, pen:.5, clr:0x000033, alpha:50}, 
      {cx:-1,cy:-3,x:-1,y:-1, pen:2, clr:0x000033, alpha:50}, 
      {x:-.75,y:4}, 
      {cx:0, cy:4.5, x:.75,y:4}, // from -.75,4 
      {x:1,y:-1}, 
      {cx:1,cy:-3,x:0,y:-4}]; 

     // Rocket fins 
     var finModel = [ {mx:-1,my:-1,cx:-3,cy:4,x:-2,y:6,bf:0x0000FF,bfa:80}, 
      {cx:-1,cy:4.5,x:-.75,y:4}, 
      {x:-1,y:-1}, 
      {mx:.75,my:4,cx:1,cy:4.5,x:2,y:6}, 
      {cx:3,cy:4,x:1,y:-1}, 
      {x:.75,y:4,ef:1} 
     ]; 

     // Routine to scale model to arbitrary size 
     function scaleModel(m,s) 
     { 
      for (var i = 0; i < m.length; ++i) 
      { 
       var pt = m[i]; 
       if (pt.mx != undefined) 
       { 
        pt.mx *= s; 
        pt.my *= s; 
       } 
       if (pt.cx != undefined) 
       { 
        pt.cx *= s; 
        pt.cy *= s; 
       } 
       pt.x *= s; 
       pt.y *= s; 
      } 
     } 

     // Draw a model 
     // 
     function drawModel(m) 
     { 
      for (var i = 0; i < m.length; ++i) 
      { 
       var pt = m[i]; 
       if (pt.bf != undefined) 
        this.beginFill(pt.bf, pt.bfa); 
       if (pt.pen != undefined) 
        this.lineStyle(pt.pen,pt.clr,pt.alpha); 
       if (pt.mx != undefined) 
        this.moveTo(pt.mx,pt.my); 
       if (pt.cx != undefined) 
        this.curveTo(pt.cx,pt.cy,pt.x,pt.y); 
       else if (pt.x != undefined) 
        this.lineTo(pt.x,pt.y); 
       if (pt.ef != undefined) 
        this.endFill(); 
      } 
     } 


     // Ship Movement and most game-play stuff happens here 
     function ShipMove() 
     { 

      // Steering & Thrust 
      if (Key.isDown(Key.LEFT)) 
       this._rotation -= 5; 
      else if (Key.isDown(Key.RIGHT)) 
       this._rotation += 5; 
      if (Key.isDown(Key.CONTROL) || Key.isDown(Key.UP)) 
      { 
       this.vx += Math.sin(this._rotation*kDegToRad); 
       this.vy -= Math.cos(this._rotation*kDegToRad); 
      } 
      else if (Key.isDown(Key.DOWN)) 
      { 
       this.vx *= .9; 
       this.vy *= .9; 
      } 
      // Basic movement with acceleration and damping 
      this._x += this.vx; 
      this._y += this.vy; 

      // Wrap around edges of stage 
      if (this._x < -this._width) 
       this._x += SW+this._width*2; 
      else if (this._x > SW+this._width) 
       this._x -= SW+this._width*2; 
      if (this._y < -this._height) 
       this._y += SH+this._height*2; 
      else if (this._y > SH+this._height) 
       this._y -= SH+this._height*2; 

     } 


     // Initialize new ship 
     function NewShip() 
     { 
      ship_mc._x = SW/2; 
      ship_mc._y = SH/2; 
      ship_mc.onEnterFrame = shipMove; 
     } 

     // Assign a sprite model to a movieclip & draw it 
     // 
     MovieClip.prototype.setModel = function(m) 
     { 
      this.model = m; 
      this.drawModel(m); 
     } 

     MovieClip.prototype.drawModel = drawModel; 

     scaleModel(fuseModel, MW*.8); // Using a slightly smaller rocket than original drawing 
     scaleModel(finModel, MW*.8); 

     // One Time Initialziation 
     // 
     _root.createEmptyMovieClip("ship_mc", 2); 
     ship_mc.createEmptyMovieClip("fuselage", 1); 
     ship_mc.fuselage.setModel(fuseModel); 
     ship_mc.createEmptyMovieClip("fins", 2); 
     ship_mc.fins.setModel(finModel); 

     NewShip(); 

// } 
//} 
+1

你能描述一下你想做什么吗?在AS3的内核中有一种类似原型的东西,但它通常不是一个非常有用的东西。通常你想要子类化MovieClip并装饰或重写内容,但是如果你评论你的目标,我们可以更具体。 – fenomas 2010-08-12 14:28:08

回答

1

您应该扩展MovieClip并将新功能添加到子类,这是最佳/正确的方法。 AS2中的原型是旧的,当语言不支持真正的OOP时使用原型。

0

不鼓励在AS3中使用原型。 但是如果你用flex编译器编译AS3,有一种方法可以使用它。

首先,您需要给出几个编译器选项。

PrototypeExtension-config.xml中

<flex-config> 
    <compiler> 
     <as3>false</as3> 
     <es>true</es> 
     <strict>false</strict> 
    </compiler> 
</flex-config> 

PrototypeExtension.as

package { 
    import flash.display.Sprite; 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.geom.Point; 
    import flash.utils.getTimer; 

    public class PrototypeExtension extends Sprite { 
     public function PrototypeExtension() { 
      stage.align = "tl"; 
      stage.scaleMode = "noScale"; 
      MovieClip.prototype.move = function (x:int, y:int):void { 
       this.x = x; this.y = y; 
      }; 
      MovieClip.prototype.tween = function (to:Point, duration:int):void { 
       var start:int = getTimer(); 
       var from:Point = new Point(this.x, this.y); 
       var thisInstance:MovieClip = this; 
       this.addEventListener(Event.ENTER_FRAME, function tweener(e:Event):void { 
        var time:int = getTimer() - start; 

        if (time > duration) { 
         thisInstance.move(to.x, to.y); 
         thisInstance.removeEventListener(Event.ENTER_FRAME, tweener); 
        } 
        var t:Number = time/duration; 
        t = t * (2 - t); 
        var u:Number = 1 - t; 
        thisInstance.move(u * from.x + t * to.x, u * from.y + t *to.y); 
       }); 

      } 
      var mc:MovieClip = new MovieClip; 
      mc.graphics.beginFill(0); 
      mc.graphics.drawRect(0, 0, 100, 100); 
      mc.graphics.endFill(); 
      mc.tween(new Point(400, 300), 1000); 
      addChild(mc); 
     } 
    } 
} 

通过

mxmlc的PrototypeExtension.as

你可以看到原型扩展是如何在AS3启用。