How to Create a Tower Defense Game in AS2 – Part 6
Part 6: Expanding on the Game
Welcome to the 6th part of the tutorial, Expanding on the Game! Well, what do I mean by “Expanding”? Well, by expanding, I mean that we’re going to create more enemies and more levels. Sounds pretty cool, doesn’t it?
Open up “source.fla” and find the makeEnemies function. We’re going to have some major renovations to this functions. Just replace the function with this new code:
function makeEnemies():Void{//this function will add enemies to the field if(enemyTime < enemyLimit){//if it isn't time to make them yet enemyTime ++;//then keep on waiting } else {//otherwise var theCode:Number = enemyArray[currentLvl-1][currentEnemy];//get the code from the array if(theCode != 0 && theCode != null){//if it's not set at 0 //then create a new enemy and add it to the enemy holder enemyHolder.createEmptyMovieClip('enemy'+currentEnemy,enemyHolder.getNextHighestDepth()); //now we're going to draw the enemy. It'll just be a tiny red circle enemyHolder['enemy'+currentEnemy].beginFill(0xFF0000);//coloring them red gray enemyHolder['enemy'+currentEnemy].moveTo(0, 2.5);//move the entire shape a certain way //create 4 curves so that it'll look like a circle enemyHolder['enemy'+currentEnemy].curveTo(0,10,5,10); enemyHolder['enemy'+currentEnemy].curveTo(10,10,10,5); enemyHolder['enemy'+currentEnemy].curveTo(10,0,5,0); enemyHolder['enemy'+currentEnemy].curveTo(0,0,0,5); enemyHolder['enemy'+currentEnemy].endFill();//end the fill //add a few variables to the enemy enemyHolder['enemy'+currentEnemy].enLevel = theCode;//setting its level to be what # it is enemyHolder['enemy'+currentEnemy].maxSpeed = 3;//how fast it can possibly go enemyHolder['enemy'+currentEnemy].xSpeed = 0; enemyHolder['enemy'+currentEnemy].ySpeed = 0; enemyHolder['enemy'+currentEnemy].health = 5*theCode; //checking what the start direction is if(_root.startDir == 'UP'){//if it's starting up enemyHolder['enemy'+currentEnemy]._y = 300;//set the y value off the field enemyHolder['enemy'+currentEnemy]._x = _root.startCoord;//make the x value where it should be enemyHolder['enemy'+currentEnemy].xSpeed = 0;//make it not move horizontally enemyHolder['enemy'+currentEnemy].ySpeed = -enemyHolder['enemy'+currentEnemy].maxSpeed;//make it move upwards } else if(_root.startDir == 'RIGHT'){//and so on for other directions enemyHolder['enemy'+currentEnemy]._x = -25; enemyHolder['enemy'+currentEnemy]._y = _root.startCoord; enemyHolder['enemy'+currentEnemy].xSpeed = enemyHolder['enemy'+currentEnemy].maxSpeed; enemyHolder['enemy'+currentEnemy].ySpeed = 0; } else if(_root.startDir == 'DOWN'){ enemyHolder['enemy'+currentEnemy]._y = -25; enemyHolder['enemy'+currentEnemy]._x = _root.startCoord; enemyHolder['enemy'+currentEnemy].xSpeed = 0; enemyHolder['enemy'+currentEnemy].ySpeed = enemyHolder['enemy'+currentEnemy].maxSpeed; } else if(_root.startDir == 'LEFT'){ enemyHolder['enemy'+currentEnemy]._x = 550; enemyHolder['enemy'+currentEnemy]._y = _root.startCoord; enemyHolder['enemy'+currentEnemy].xSpeed = -enemyHolder['enemy'+currentEnemy].maxSpeed; enemyHolder['enemy'+currentEnemy].ySpeed = 0; } enemyHolder['enemy'+currentEnemy]._x += 5;//fixing the x value enemyHolder['enemy'+currentEnemy]._y += 5;//fixing up the y value enemyHolder['enemy'+currentEnemy].onEnterFrame = function(){//give it some functions this._x += this.xSpeed; this._y += this.ySpeed; //checking what direction it goes when finishing the path if(_root.finDir == 'UP'){//if it finishes at the top if(this._y <= -25){//if the y value is too high _root.lives --;//take away a life _root.money -= 5*this.enLevel;//don't let the player gain any money this.removeMovieClip();//take it away from the stage } } else if(_root.finDir == 'RIGHT'){//and so on for other directions if(this._x >= 550){ _root.lives --; _root.money -= 5*this.enLevel; this.removeMovieClip(); } } else if(_root.finDir == 'DOWN'){ if(this._y >= 300){ _root.lives --; _root.money -= 5*this.enLevel; this.removeMovieClip(); } } else if(_root.startDir == 'LEFT'){ if(this._x <= 0){ _root.lives --; _root.money -= 5*this.enLevel; this.removeMovieClip(); } } if(this.health <= 0){ _root.enemiesLeft --; _root.money += 5*this.enLevel; this.removeMovieClip(); } } } currentEnemy ++;//move on to the next enemy enemyTime = 0;//and reset the time } }
There aren’t very many renovations that we’ve made, but they will make our code much more flexible. It allows us to create different enemy levels by setting the enLevel to be equal to the code that is placed into the enemy array. The enLevel in turn lets us dynamically change the amount of health the enemy has and the amount of money that it gives you when you kill it. Right now the health and money it gives you is 5 times the enemy level.
Now, we can make more levels with better enemies! You can customize your own levels, or use the ones I created by setting these values in the enemyArray:
enemyArray = [//defining the array [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],//1's will just represent an enemy to be created [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],//another row means another level [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3], [100], [5,6,7,6,5,6,7,6,5,6,7,6,5,6,7,6,5,6,7,6,5,6,7,6,5,6,7,6,5], [250,250,250] ];
Of course, I’d suggest creating your own levels, as mine aren’t what you would call the best. Anyways, this wraps up the second to last part of this tutorial. Join us next time when finish up this little game!