2010-08-12 4 views
1

В примере кода ActionScript 2 он использует некоторые функции MovieClip.prototype, такие как MovieClip.prototype.setModel;Как получить MovieClip.prototype в ActionScript 3?

Я пытаюсь написать этот пример, используя класс ActionScript 3, но MoviewClip.prototype не существует, откуда я могу его получить? Он существует в ActionScript 3?

--update

Хорошо, как вы спрашиваете, здесь идет, этот код прекрасно работает как ActionScript включен frame1, но я хочу сделать класс 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

ответ

1

Возможно, вы должны расширить MovieClip и добавить новую функциональность в подкласс, это лучший/правильный путь. Прототипы в AS2 являются старыми и использовались, когда язык не поддерживал истинный ООП.

0

Использование прототипов в AS3 не рекомендуется. Но есть способ использовать его, если вы компилируете AS3 с помощью компилятора flex.

Во-первых, вам нужно предоставить несколько параметров компилятора.

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.