How to get MovieClip.prototype in ActionScript 3?
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 ActionScript 3 class, but the MoviewClip.prototype does not exists, where can I get it from? Does it exist in ActionScript 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)开发者_JS百科
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();
// }
//}
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.
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.
精彩评论