23.1 Stage One
In the first stage of the application,
begin
with the most fundamental and
central task of the application. In an application that involves
bouncing circles, the most natural place to begin is to create a
single circle that bounces within the boundaries of a rectangle. Here
are the steps to complete this stage of the application:
Create a new Flash document named stage1.fla and
open it. Add the following code to the first frame of the default layer of the
main timeline: // Include DrawingMethods.as from Chapter 4 for its custom drawing methods.
#include "DrawingMethods.as"
// Include MovieClip.as from Chapter 7 for its getNewDepth( ) method.
#include "MovieClip.as"
// Create the circle movie clip and draw a circle of radius 10 within it.
_root.createEmptyMovieClip("circle", _root.getNewDepth( ));
with (circle) {
lineStyle(0, 0x000000, 0);
beginFill(0, 100);
drawCircle(10);
endFill( );
}
// Create a movie clip for the box and draw a rectangular outline within it.
_root.createEmptyMovieClip("border", _root.getNewDepth( ));
with (border) {
lineStyle(0, 0, 100);
// Draw a 200 x 200 rectangle.
drawRectangle(200, 200);
_x += 100;
_y += 100;
}
// Create some properties for the circle that define the area within which its
// movement should be constrained.
circle.minX = 0;
circle.minY = 0;
circle.maxX = 200;
circle.maxY = 200;
// Initialize the circle at a random coordinate within the acceptable range.
circle._x = Math.random( ) * circle.maxX;
circle._y = Math.random( ) * circle.maxY;
// Set the velocity of the circle to six pixels per frame.
circle.vel = 6;
// Set a property that determines the direction or angle of the initial movement
// of the circle. The value needs to be in radians, so generate a random value
// between 0 and 2p (which is 360 in degrees).
circle.dir = Math.random( ) * Math.PI * 2;
// Define an onEnterFrame( ) method for the circle so that it continually updates
// its position.
circle.onEnterFrame = function ( ) {
// Calculate the new x and y coordinates for the circle.
// Using basic trigonometric formulas, we can derive the x
// and y components of a vector, a line that has both direction
// (an angle) and velocity. See Recipe 5.12 and Recipe 5.14.
this._x += Math.cos(this.dir) * this.vel;
this._y += Math.sin(this.dir) * this.vel;
// If the circle is touching the rectangle or is outside its boundaries, change
// the direction of the circle.
if ((this._x + this._width/2) >= this.maxX) {
this._x = this.maxX - this._width/2 - 1;
this.dir += 2 * (Math.PI/2 - this.dir);
}
else if ((this._x - this._width/2)<= this.minX) {
this._x = this.minX + this._width/2 + 1;
this.dir += 2 * (Math.PI/2 - this.dir);
}
if ((this._y + this._height/2) >= this.maxY) {
this._y = this.maxY - this._height/2 - 1;
this.dir -= 2*this.dir;
}
else if ((this._y - this._height/2) <= this.minY) {
this._y = this.minY + this._height/2 + 1;
this.dir -= 2*this.dir;
}
};
That is all there is to stage one of the application. If you save and
test your movie, you should see a single circle that bounces around
within the boundaries of a rectangle. The majority of the code in
this stage is nothing new or complicated. Some of the mathematics
involved in the calculations might be new to you, but the
ActionScript syntax is familiar. The only portion of the
code that really needs some further
explanation is a snippet from the onEnterFrame(
) method. Within this method you want to update the
position of the circle according to the direction and velocity for
the circle. There are two basic trigonometric formulas that you can
employ here to find the new x and y coordinates based on the
information you do know (the direction/angle and the velocity).
Trigonometry says that the x coordinate can be found by multiplying
the cosine of the angle by the velocity, and the y coordinate can be
found by multiplying the sine of the angle by the velocity. Now, if
the circle was only going to move along a straight line forever, then
this would be all that is needed. However, you want the circle to
bounce when it hits the sides of the rectangle. Therefore, you need
to use a series of if statements. In each case,
you must calculate whether the edge of the circle is touching or
outside of the rectangle. You can find the edge of the circle by
adding or subtracting the radius from the center of the circle (the
radius is half of either the width or the height). When the circle
needs to bounce, you must do two things. First, set the circle so
that it is within the boundaries of the rectangle by at least one
pixel. Otherwise, the circle can get trapped along the side of the
rectangle. The other thing you should do is assign the circle a new
direction. The new direction is determined either by adding twice the
difference between p/2 and the current direction (in the
case of the circle bouncing off the left or right walls) or by
subtracting twice the current direction (in the case of the circle
bouncing off the top or bottom walls), as shown in the preceding
onEnterFrame( ) handler.
|