代码之家  ›  专栏  ›  技术社区  ›  Student

如何在ActionScript3中获取movieclip.prototype?

  •  1
  • Student  · 技术社区  · 16 年前

    在ActionScript2代码示例中,它使用了一些movieclip.prototype的函数,如movieclip.prototype.setModel;

    我试图使用ActionScript3类编写这个示例,但是moviewClip.Prototype不存在,我可以从哪里获得它?它是否存在于ActionScript 3中?

    ——更新

    好的,正如您所问的,这里是这样的,这段代码和框架1中的actionscript一样工作正常,但是我想用这段代码创建一个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();
    
    //  }
    //}
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   dotminic    16 年前

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

        2
  •  0
  •   9re    16 年前

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

    首先,您需要提供一些编译器选项。

    原型扩展-config.xml

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

    原型扩展.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);
            }
        }
    }
    

    通过

    MXML原型扩展.as

    您可以看到如何在AS3中启用原型扩展。