In Chapter 12 we created a custom Ball class and used it to instantiate individual Ball objects. When it came time to display the ball objects, we were faced with several options. A separate Room class might contain balls and be responsible for drawing them on screen with the Drawing API. Or, a Ball object might have a property, mc, that contains a movie clip used to represent the ball. In some cases, it's redundant to have one object that represents a thing (such as a ball) and a separate movie clip object that displays it on screen. Movie clips, themselves, are already objects, so it often makes sense to use a movie clip to both describe an object and display that object on screen. In Flash MX, we can do so by creating a subclass based on the MovieClip class, thus creating a specialized type of object that provides built-in screen display.
|
To see how MovieClip subclasses are created, we'll implement our Ball class from Chapter 12 as a MovieClip subclass. In our example, each ball instance will be a movie clip responsible for moving itself around the screen. Read through the code in Example 14-1. We'll discuss it in the sections that follow. Generally, the code uses the OOP techniques we studied in Chapter 12, but with a few twists required by the MovieClip subclassing architecture. All of the example code in this chapter can be downloaded from the online Code Depot.
// = = = = = = = = = = = = = = = = = = = = = = = = = = // Create namespace in which to store classes // = = = = = = = = = = = = = = = = = = = = = = = = = = if (_global.org = = undefined) { _global.org = new Object( ); } if (_global.org.moock = = undefined) { _global.org.moock = new Object( ); } // = = = = = = = = = = = = = = = = = = = = = = = = = = // Create the Ball class // = = = = = = = = = = = = = = = = = = = = = = = = = = /* * Ball Class. Extends MovieClip. * Version: 1.0.0 * Desc: A movie clip subclass for depicting balls. * Requires a Library symbol named ballSymbol. * * Constructor Params: * radius -The ball's size (half its diameter) * ballColor -The ball's color * x -The ball's initial x position * y -The ball's initial y position * velocity -The ball's movement vector: {x:0, y:0} * * Methods: * setSize( ) -Make the ball clip's size match the supplied radius * setPosition( ) -Place the ball clip at an (x,y) coordinate * setColor( ) -Apply an RGB color value to the ball clip * move( ) -Apply the ball's velocity vector to its current position * * Event Handlers: * onEnterFrame( ) -Invokes move( ) every frame. */ /* * Ball Class Constructor (parameters are passed by attachMovie( )'s initObj) */ org.moock.Ball = function ( ) { // Create instance properties this.velocity = this.params.velocity; // Initialize instance this.setPosition(this.params.x, this.params.y); this.setColor(this.params.ballColor); this.setSize(this.params.radius); this.onEnterFrame = this.move; // Remove constructor params object from the instance delete this.params; } /* * Set MovieClip as Ball's superclass */ org.moock.Ball.prototype = new MovieClip( ); /* * Associate the Library's ballSymbol with the Ball class */ Object.registerClass("ballSymbol", org.moock.Ball); /* * Instance Methods */ /* * Method: Ball.setSize( ) * Desc: Sets the ball clip's size * * Params: * newRadius -The ball's new radius */ org.moock.Ball.prototype.setSize = function (newRadius) { this._width = this._height = (newRadius * 2); }; /* * Method: Ball.setPosition( ) * Desc: Sets the ball clip's position to the point (x, y) * * Params: * x -The new horizontal position * y -The new vertical position */ org.moock.Ball.prototype.setPosition = function (x, y) { this._x = x; this._y = y; }; /* * Method: Ball.setColor( ) * Desc: Changes the ball clip's color * * Params: * newColor -The numeric RGB color to apply to the ball clip * */ org.moock.Ball.prototype.setColor = function (newColor) { var col = new Color(this); col.setRGB(newColor); }; /* * Method: Ball.move( ) * Desc: Moves the ball according to its velocity vector * * Params: None * */ org.moock.Ball.prototype.move = function ( ) { this._x += this.velocity.x; this._y += this.velocity.y; } // = = = = = = = = = = = = = = = = = = = = = = = = = = // START APPLICATION // = = = = = = = = = = = = = = = = = = = = = = = = = = main( ); // Function: main( ) // Desc: Application entry point function main ( ) { // Create an object whose properties will be used // as the Ball constructor's parameters var ballParams = new Object( ); ballParams.radius = 10; ballParams.ballColor = 0xFF0000; ballParams.x = 250; ballParams.y = 250; ballParams.velocity = {x:12, y:4}; // Assign the ballParams object to a single property // of initObj, which we'll pass to attachMovie( ). // Properties of initObj are copied to each ball instance at attach-time. var initObj = new Object( ); initObj.params = ballParams; // Create a ball this.attachMovie("ballSymbol", "redBall", 1, initObj); }