by
kirupa | 12 August 2005
Now that you have your Flash animation working from the
previous page, let's
take a look at why it works.
ActionScript Explained
Let's find out what part each line in our above code
plays:
- target_mc
= ["circle0",
"circle1",
"circle2", "circle3",
"circle4",
"circle5"];
I declare an array called target_mc, and its
values are the instance names of the movie clips that we are interesting in
testing for collisions. If you recall, in the FLA you have open, the circles have the instance
names circle0, circle1, etc.
Your movie clip names do not have to
follow the name + number format as my movie clips though. You can give
them as strange a name as you want. As long as your movie clip name
is mentioned in the above array, Flash will read it.
Also, you can use a loop to populate
the target_mc array as movie clips get added to your stage.
One of the FLAs I will provide towards the end of this tutorial
contains a series of circles that are simply loaded from the Library
using the attachMovie command.
- hitTester
= function
() {
I will be placing all of my code inside a function called hitTester.
In the past, I encouraged using functions because it is simply easy
to manage the code. In this case, using a function is absolutely
necessary, for we will be calling our hitTester function numerous
times to run the collision detection code contained within it.
- numCircles
= target_mc.length;
Since our target_mc variable is an array, I can use the length
property to count the number of items in our array. I store the
number of items in our array in a variable called numCircles.
- for (i=0;
i<numCircles;
i++)
{
- circleA
=
target_mc[i];
This is the first of
our two for loops. The loop ranges from 0 to the number of
items stored in your array. For each value of i, the variable
circleA stores a movie clip name from our target_mc array.
- for (j=i+1;
j<numCircles;
j++)
{
- circleB
=
target_mc[j];
This is our second loop. It gets accessed for each value of i in
the first loop, but notice its range. It's range isn't from 0, but
instead, its range starts from i+1. Starting at that value ensures
that we don't revisit movie clips already covered by our first loop.
This is what makes our more efficient collision detection code
better than our, well, less efficient collision detection code.
Similar to how I used circleA in the first loop to store a movie
clip instance name from our array, I use circleB to store a second
movie clip instance name from that array. So, right now, both the
circleA and circleB variables store a movie clip instance.
- temp_A =
eval(circleA);
- temp_B =
eval(circleB);
I store the reference to the circleA and circleB values via the
eval function in the temp_A and temp_B variables. I do that because
I will be using eval(circleA) and eval(circleB) a lot in the next
few lines of code. Storing it as temp_A and temp_B simply saves me
time in having to type extra characters.
- if (temp_A.hitTest(temp_B))
{
- // Your code
- dirChanger(temp_A,
temp_B);
- //
- }
The first line checks if the two movie clips stored in temp_A and
temp_B collide with each other. The ordering of the movie clips in
the hitTest function doesn't matter. If you were to use
temp_B.hitTest(temp_A), you would get the same result. That is why,
if you remember, I didn't mind flagging a lot of redundant collision
checks in our "Less Efficient Method".
The hitTest function returns a boolean value, so we don't need
any conditional such as == in our if statement. If there is a
collision, I simply make a call to a function called dirChanger that
takes in our temp_A and temp_B values to move our circles around.
I won't elaborate on the rest of the code, for that really
deviates this tutorial's goal of explaining collision detection
involving a lot of objects. I have provided several FLAs that
use the same collision detection code but have some minor variations
that you may find useful for your projects.
Just a final word before we wrap up. If you have a question and/or want to be part of a friendly, collaborative community of over 220k other developers like yourself, post on the forums for a quick response!

 |
page 3 of 3 |
|
|