Part 5 : Firing The Missiles
Now that we have a finalized Player class, we need to go back to to HomeWars.as and add code to support Events coming back from the Player. The first thing we must do is go back to the fSTATE_INIT() function and add a line of code to have the HomeWars class subscribe to the EventFireMissile. The following line of code will do just that:
player.addEventListener("EventFireMissile", this);
Now we need to create the callback function that is executed when the EventFireMissile event is received from Player to HomeWars. The following function creates a new Instance if a Missile object (we will create this soon), set its speed, beginning location, finish condition, and set’s up the event listeners required to move() it, render() it, and remove it once it leaves the screen. After we have created the missile, we add it to an array named missiles with this code: missiles.push(tempClip); We do this so it will be easier to keep track of all the missiles on the screen.
function EventFireMissile() {
var tempClip:MovieClip;
var md:Number = getNextMissileDepth();
tempClip = parentTL.attachMovie("FMissile", "missile" + md, md);
tempClip.setSpeed(10);
tempClip.setFinishedY(0);
tempClip.setLocation(player._x, player._y);
tempClip.addEventListener("EventMissileOffScreen",this);
this.addEventListener("Move",tempClip);
this.addEventListener("Render",tempClip);
missiles.push(tempClip);
}
The function getNextMissileDepth() is used to attain a new depth for each missile that is fired. I’ve found that a function like this, along with a few variables makes it very easy to support obejcts that could have 1 to n number of instances on the screen at the same time. This function requires a MISSILE_MIN_DEPTH (the lowest depth a missile can be assigned), MISSILE_MAX_DEPTH (the highest depth a missile cab be assigned) and missileCount (a running total of all the missiles that have been fired). When missileCount reaches MISSILE_MAX_DEPTH, we reset it to 0. Why? Well In Flash, a MovieClip will replace any other MovieClip that is assigned the same depth. This why we made MISSILE_MIN_DEPTH = 2000 and MISSILE_MAX_DEPTH = 3000. This will give us more than ample room to to fire multiple missiles without the chance that any one missile will be assigned the same depth as a missile that is already on the screen. The code for this function is below:
function getNextMissileDepth():Number {
missileCount++;
if (missileCount+MISSILE_MIN_DEPTH > MISSILE_MAX_DEPTH) {
missileCount = 0;
}
return missileCount+MISSILE_MIN_DEPTH;
}
Now that we have created code to instantiate missile objects, we must create a Missile class. Our Missile.as file will look like this:
import mx.events.EventDispatcher;
class Missile extends MovieClip {
var speed:Number =0;
var nexty:Number;
var finishedY:Number = 0;
function Missile() {
finishedY=0;
EventDispatcher.initialize(this);
}
public function setLocation(x:Number,y:Number) {
this._x = x;
this._y = y;
}
function setSpeed(s:Number) {
speed = s;
}
function setFinishedY(yn:Number){
finishedY=yn;
}
function Move() {
nexty = _y - speed;
}
function Render() {
_y = nexty;
if (_y < finishedY) {
this.dispatchEvent({type:"EventMissileOffScreen", missile:this});
}
}
public function addEventListener(){/*Interface Stub*/}
public function removeEventListener(){/*Interface Stub*/}
public function dispatchEvent(){/*Interface Stub*/}
}
At this point, much of this code should look relatively familiar. The only added feature here is the setFinishedY() function. We use this function to set the y position on the screen that, when reached, will tell us to remove this missile from the screen. If we were making a game that would allow missiles to fire in any direction, this would not work. However, since we know that our player will be at the bottom of the screen, firing UP, we can take a short-cut here and simply test to see if the current _y of the missile is less than finishedY. If so, we dispatch a EventMissileOffScreen event to the HomeWars object.
This line of code is very important for this to work. We’ve seen events like this earlier in the lesson, but do you seem something different here?
this.dispatchEvent({type:"EventMissileOffScreen", missile:this});
Yep. There is a second parameter: missile:this that is passed as part of the the callback to the event. This is how you can pass more data through an event than just a simple message that something has happened. This line of code works because the {} in the function call the dispatchEvent is a short way of saying both new Object()and assigning new properties to that object. In essence, we have created an object, set the event type and a reference to this missile object named missile. We’ll discuss why we do this in just a moment.
Now we must move back to HomeWars.as to finish-up our support for the missiles. Below is the function we will create to handle the EventMissileOffScreen event:
function EventMissileOffScreen(e:Object) {
this.removeEventListener("Move",e.missile);
this.removeEventListener("Render",e.missile);
e.missile.removeMovieClip();
removeMissile(e.missile);
}
The first two lines of code (removeEventListener) in this function clean-up the Event listeners that we assigned to this missile object. We don’t necessarily have to do this, but it is a good practice to clean-up the remnants of objects you are about to destroy. Doing this can also help your code run faster, as the there will not be a bunch of references left for destroyed objects for HomeWars must iterate through when sending messages. This is also where we use the missile parameter that we specified in the Event we broadcast from the Missile object. All parameters passed by an event using dispatchEvent are passed to to that event through the Object parameter e that we have specified in our function definition.
Next we remove the Missile clip from the screen by calling e.missile.removeMovieClip(); ,and then we call a seperate function (removeMissile()) for removing the missile from our missiles array. We will need to remove missiles from the screen at other times (i.e when they hit an enemy) so a seperate function will be useful for us.
function removeMissile(missile:MovieClip) {
var tempClip:MovieClip = null;
for (var i=missiles.length;i >= 0; i--) {
tempClip=missiles[i];
if (tempClip==missile) {
missiles[i].removeMovieClip();
missiles.splice(i,1);
}
}
}
The removeMissile() function above might look a bit odd, but it is a simple but useful tool for games that add and remove objects asynchronously. This function takes the missile parameter, and then iterates through the missiles array to find it and remove with a for() loop. It is a good practice to make any for() loop that is used to delete items from an array count backwards. This is because deleting an item from an array changes the length of the array. When the length of an array changes, the iteration get fouled-up, and will skip items. By counting backwards, you alleviate this problem. For this simple deletion, with only one object, it does not make any difference to our code. However, in the next lesson, when we add enemies and detect collisions, this will be become an essential construct for our collision detection routine.
Read the rest of the series: ‘Anatomy of a Flash Game’
- Anatomy of a Flash Game: Lesson 1 – Setting up the game
- Anatomy of a Flash Game: Lesson 2 – Creating Enemies & The Game Environment
- Anatomy of a Flash Game: Lesson 3 – MochiAds, MochiBot and MochiAds Leaderboards

Wow, just what I’ve been looking for. Nice article.
Just curious–
In section 4, what does the ‘F’ prefix indicate in your Movie Clip names and identifiers?
It’s just a convention. Back when we were building everything with components, one of our developers told us “that was the way to do it”, and I’ve continued to do it. It helps to find the assets that have classes associated with them, but in rteality, any convention you use (or none) should work fine.
You files to download are different then the code in the tutorial. For some reason, my title screen won’t load. I’ve tried putting trace’s
to see where things are being triggered.
I put a trace in the function
function fSTATE_TITLE_SCREEN() to see if it was even getting in there but it is.
Then I decided to put a trace in the TitleScreen.as
Trace did not go through. I checked many times to see if maybe linkage Identifier was incorrect or class was incorrect and they were not. I also checked to see to make sure that I had unchecked export actionscript on frame 1.
So, not sure what the problem is. Any help would be appreciated or if you could post the files that you use the code from this tutorial.
Because I noticed the code posted for the file TitleScreen.as does not include the create Delegate.Create.
Also, the code on the main.fla is different as well.
Well, that won’t suffice. Can you .zip your files and email them to me so I can take a look at them?
Send thjem to: stevefulton@adelphia.net
Also, check this:
1. Put a travce in the constructor of TitleScreen.as to see if it ever gets called.
2. Make sure the class is named TitleScreen in the TitleScreen.as and the contructor is named function TitleScreen()
-Steve
Going to send you my files zipped.
Thank you for taking interest in my problem i appreciate it.
jeff
Nice piece! Learned a few things, disagreed with a few things :o) Have you benched the event dispatcher versus normal method calling?
fyi you can use: for (var i in array) {item=array[i]} to interate backwards through an array , plus it is faster…
I downloaded the files but I can’t get it working in Flash CS3. It firstly complained about missing classes ScoreBoard, Enemy, PowerUp, and EndScreen. It also complained about being unable to find the ComponentBase class. I fixed the first four errors by creating empty stub classes for those but I have no idea how to fix the ComponentBase issue….
I do like the tutorial and I’m looking forward to the remaining installments as even though I’m an experienced programmer I’m finding it quite a challenge to develop an interactive application in Flash as I’m not sure how to tie the MovieClips and the code together.
It sounds likw the wrong set of files was zipped and put up for downloafd. I’ll send the Mochi guys another one today.
Paul,
Thanks!
All others:
Sorry about the files. It looks like the wrong set got posted. I sent Mochi an old .zip I’m not sure how I made that mistake. I’ve sent Mochi a new batch. so hopefully they will be up soon.
Thanks,
-Steve
Hi, and thx for sharing your methods,
My (very personal, I admit) opinion about programming games is that the code should be the simplest possible.
While the techniques you showcase (EventDispatch, implementing UI stuff programmatically) deserve to be known, they are not absolutely required when programming a simple game.
Much of the UI stuff can be done in the timeline almost without code, for example. Regarding game mechanics, standard method calling may be more efficient than event dispatching.
From a learning standpoint, the result may be that some users think it’s quite complex.
Flash has this strange property that implemeting a simple button can be done in about 100 different ways ;-), then it’s always good to share techniques (seems that flashers love doing that)!
olive
Olive,
You are right, there are dozens of ways to do most anything in AS2, and nothing I have presented is absolutely required. However, I have programmed many games, and the methods I showcase are the ones I have developed that that save the most time when maintaining the code, updating, the code, adding new features, and using the code as basis for additional games, all the while maintaining performance.
Hi everyone, the correct files should be posted now. Thanks!
eagerly waiting for next lesson
I just wanted to state that f in front of your state functions is an example of “Apps Hungarian Notation” and the f stands for function. Very good tutorial by the way!! I enjoyed it :)
Justin, I think yo uare correct…which means the prefix is absolutely useless in this context. It should probably be “o” for object. Just goes to prove that you shouldn’t blindly follow a convention just because other developers you know do it, especially if you don’t know the reason for doing it!
…by the way, I just finished the code for the next lesson today, and I’m writing the text now. I hope to have it completeld
shortly.
So, where do I go to download all the sources?
Btw, I am a fifteen year old who, like you at childhood, wanted to make video games. I got Flash CS3 and even Photoshop CS3, but I am just getting started on programming, and I hardly can keep up with this guide. Is this begginer orientated or should I try something easier?
jimsotonna…
jimsotonna dropped by…
free quotes…
Excellent post. Keep it up!…
I am new to Flash programming, and find it difficult to follow this tutorial. Is there a download of the entire project that I could examine?
How do you set the path for objects in library folders? If I don’t put MovieClips in a folder then Flash can find them.
This is not a beginner guide and not an advanced guide…
If you can’t follow this than you should use another tutorial(I started with a few tuts from emanueleferonato.com).
nice guide any way
Realize I’m coming to this somewhat late, but I got to say, Steve – I paid my way through a Master’s Degree in IT, and this tutorial taught me more in substantially less time! Outstanding work, and remarkably generous of you to share your knowledge. I found myself repeatedly hitting a sort of mental block when it came to Flash until reading this tutorial.
I’m extremely grateful to you. I’ve purchased video tutorials on Flash that were less thorough and less approachable. You’re a gentleman and a scholar, sir! =D
I wish you’d start with more basic basic’s. For those of us who have never programmed flash; what do we need? Is it possible to do so without forking over $800 to Adobe?