How to Create a Platform Game in AS3 – Part 5
Part 5: Adding Enemies
The next step in making our exciting platform game is to add some enemies! In order to do this, we’re first going to have to make an Enemy class. We can do this by creating an external ActionScript file and naming it Enemy.as. Then, place the following code into the file. It’ll be similar to the “Block.as” file that we made earlier.
package{
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.DisplayObject;
import flash.events.*;
//sprites are just movieclips without any frames in them
public class Enemy extends Sprite{
//_root will signify the root of the document
private var _root:Object;
//how quickly the enemy can move
private var speed:Number;
//-1 is left, 1 is right
private var direction:int;
public function Enemy(){
//this code will only be run once
addEventListener(Event.ADDED, beginClass);
//this code will constantly be run
addEventListener(Event.ENTER_FRAME, eFrame);
}
private function beginClass(event:Event):void{
//defining the root of the document
_root = MovieClip(root);
//defining the movement variables of the enemy
speed = 5;
direction = 1;
//drawing the enemy (it'll be a red circle)
this.graphics.beginFill(0xFF0000,1);
this.graphics.drawCircle(12.5,12.5,12.5);
}
private function eFrame(event:Event):void{
}
}
}
All this code does is add the enemy to the stage and make it into a red ball. Before we actually add the enterFrame programming to it, I want to first add some code to the main timeline. This code will just add the enemy to stage and also some markers which will tell the enemy when to turn around. Add the following to the for loop in the createLvl() function:
if (lvlArray[i] == 5){
//adding an enemy
newPlacement = new Enemy();
enemyHolder.addChild(newPlacement);
} else if (lvlArray[i] == 6){
//adding an invisible marker for the enemy to turn around
newPlacement = new Shape();
newPlacement.graphics.beginFill(0x000000,0);
newPlacement.graphics.drawRect(0,0,25,25);
invisMarkerHolder.addChild(newPlacement);
}
Of course, we’re going to have to add both an invisMarkerHolder and an enemyHolder. Hopefully, you can do this on your own. Just do the exact same thing we did with the other holders except with that name. Next, change the level array to this:
var lvlArray1:Array = new Array(
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,4,0,0,0,X,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
);
We can now add some real programming to the Enemy. Add the following code to the eFrame() function in Enemy.as:
private function eFrame(event:Event):void{
//MOVING THE ENEMY
this.x += speed * direction;
//checking if touching any invisible markers
for(var i:int=0;i<_root.invisMarkerHolder.numChildren;i++){
//the process is very similar to the main guy's testing with other elements
var targetMarker:DisplayObject = _root.invisMarkerHolder.getChildAt(i);
if(hitTestObject(targetMarker)){
direction *= -1;
this.x += speed * direction;
}
}
//TOUCHING THE MAIN CHARACTER
if(this.hitTestObject(_root.mcMain)){
//if it touches the main guy while he's jumping
//and the guy is falling down, not jumping up
if(_root.mainJumping && _root.jumpSpeed > 0){
//kill this guy
this.parent.removeChild(this);
//and remove listners
this.removeEventListener(Event.ENTER_FRAME, eFrame);
} else {
//otherwise, kill the main character
//we don't have any death frame yet, so we'll make it later
//and we'll add a trace statement
trace('OH NO! You died!');
}
}
}
Test it out. You should see a red circle moving around the platform above where you start off. If you touch it, a trace statement should be called. If you jump on it, the enemy should disappear. Pretty nifty, eh? The next thing we have to do is to make a function that will reset the game whenever the main guy dies. Add this code to the main timeline:
//resets the level
function resetLvl():void{
for(var i:int=0;i 0){
for(var i2:int = 0;i2
Now, we have to run this function whenever the main guy runs off of the stage or touches the enemy. I'm going to leave it up to you to figure that out. Of course, there are always the source files if you need them.
Well, that's basically it for enemy creation. Join us next time when we actually make this thing into a game!