views:

79

answers:

2

In a ActionScript 2 code sample it uses some MovieClip.prototype's functions, as MovieClip.prototype.setModel;

I'm trying to write this example using an ActionScrip 3 class, but the MoviewClip.prototype does not exists, where can I get it from? Does it exists in ActionScrip 3?

--update

Ok, as you are asking, here goes, this code works just fine as an actionscript included on frame1, but I want to make a ActionScript 3 class with this same code:

//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  A: 

You should probably extend MovieClip and add the new functionality to the subclass, it's the best/proper way to go. Prototypes in AS2 are old, and were used when the language didn't support true OOP.

__dominic
A: 

Hi! Using prototypes in AS3 is discouraged. But there is a way to use it if you are compiling AS3 with the flex compiler.

First, you need to give a few compiler options.

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);
        }
    }
}

by

mxmlc PrototypeExtension.as

You can see how prototype extension is enabled in AS3.

9re