similar to make a tower defense game in java

prelude to the web site Best Blog Hồng, current best.bloghong.com will introduce you to the article similar to make a tower defense game in java, Let’s be taught extra about it with us. just like make a tower protection recreation in java article under

Replace 6/8/2013: Totally up to date for Cocos2D 2.1-rc1 (preliminary lesson by Pablo Ruiz, replace by Brian Broom).

The tower protection style is among the most sequence in style recreation genres in iOS – and for easy tiny. There’s one thing extremely enjoyable about constructing the last word protection and seeing it obliterate horders of invaders!

On this Tower protection Sport tutorial, you’ll get to construct a tower protection recreation of your personal from scratch, with Cocos2D!

Alongside the way in which, you’ll be taught the next:

  • just like create waves of enemies with configurable spawn instances.
  • just like make these enemies remodel alongside customized waypoints.
  • just like create towers on particular places within the lake operate.
  • just like make towers shoot at enemies.
  • just like visually debug the waypoints and assault ranges of towers.

On the terminate of the Tower protection Sport tutorial, you’ll have a positive framework for any such recreation, which you’ll be capable of open upon so as to add new tower varieties, enemies, and maps!

For this tutorial, you’ll want a fundamental understanding of Cocos2D. suppose you’re utterly new to Cocos2D, it’s best to try among the different Cocos2D tutorials on this web site first.

With out additional ado, let’s take struggle constructing our protection!

A View from the shocked Tower

suppose you’re not conversant in the style, tower protection video games are technique video games the place you buy and place armed towers at strategic factors to be able to cease waves of enemies which might be attempting to achieve your base and destroy it.

Every wave of enemies is often tougher than the final, with stronger opponents who remodel extra rapidly and have larger resisting to your mortars. The sport ends whenever you survive the waves by means of tantrum of the degrees (victory!) or when sufficient enemies attain your base to destroy it (Aaaugh! You’ve been defeated!).

Right here’s a screenshot of comparable the sport will take care of you’re finished:

As you’ll be able to see within the picture, enemies seem from the highest left aspect of the display, and so they comply with the inexperienced path to the participant’s base.

Alongside the street, there are a selection of platforms the place the participant can place a tower. The participant can solely buy and place as many towers as they’ll afford, based mostly on their gold reserves. The towers’ assault vary is drawn as a white circle; suppose an enemy is throughout the tower’s vary, the tower will hearth on the enemy till the enemy is destroyed, or they remodel out of vary of the tower.

Towers ‘R’ Us: Assembling the Sources

To get began rapidly, I’ve created a starter challenge for you. It incorporates an empty Cocos2D challenge and most sequence of the property you’ll use within the tutorial.

subsequently go forward and obtain the starter challenge and extract it to your chosen challenge location.

The starter challenge was created from a brand new challenge from the Cocos2D 2.1 (RC1) fundamental template, which gives you with a working challenge that has a HelloWorldLayer with a label in the midst of the display. You received’t be utilizing this label as you’ll create your personal UI, however this offers you a fundamental starter Cocos2D challenge that you recognize works accurately.

Open the challenge in Xcode, and compile it and run it to ensure that all the pieces is working. The starter challenge has eliminated the precise “Hi there household” technique from the HelloWorldLayer subsequently you’ll solely get a black display suppose the challenge runs accurately. however suppose the challenge does compile and run, you then’re tantrum set!

Check out the challenge construction. Contained in the TowerDefense folder, you’ll discover:

  • The libs folder Containing tantrum the Cocos2D recordsdata
  • The Sources folder Containing tantrum the graphics and sounds

Now, you’ll be able to set ngoc the lake operate and take struggle creating the towers!

Somebody to Tower Over Me: Placement

First, add the background picture for the scene. Open HelloWorldLayer.m and add the next traces of code contained in the “suppose” wholesome situation in init:

// 1 – Initialize bestchoicekitchen.comhEnabled = YES; CGSize winSize = [CCDirector sharedDirector].winSize; // 2 – Set background CCSprite * background = [CCSprite spriteWithFile:@”bg.png”]; [self addChild:background]; [background setPosition:ccp(winSize.width/2,winSize.height/2)];

The primary line in part #1 will enable the layer to humanity contact occasions. The rest of the code in part #2 provides a background sprite to our scene.

With the background in place, you’ll be able to visually determine the place the participant is allowed to position towers. Now it is advisable to set some factors alongside the street the place the participant will be capable of contact and construct a tower. (Hey – you bought a constructing allow for that, buddy?)

To maintain maintain issues manageable, a .plist file might be used to retailer the location factors for the towers subsequently they are often simply modified. bestchoicekitchen.com has been included within the Sources folder, which already has some tower positions in it.

Examine this file; you’lll discover an array of dictionaries which include simply 2 keys: “x” and “y”. Every dictionary entry represents a tower place by its x and y coordinates. Now it is advisable to learn on this file and place the bases for towers on the lake operate!

Open HelloWorldLayer.h and add the next occasion variable (throughout the curly braces after the @interface line):

NSMutableArray *towerBases;

Make the next modifications in HelloWorldLayer.m:

//Add a brand new technique -(void)loadTowerPositions { NSString* plistPath = [[NSBundle mainBundle] pathForResource:@”TowersPosition” ofType:@”plist”]; NSArray * towerPositions = [NSArray arrayWithContentsOfFile:plistPath]; towerBases = [[NSMutableArray alloc] initWithCapacity:10]; for(NSDictionary * towerPos in towerPositions) { CCSprite * towerBase = [CCSprite spriteWithFile:@”open_spot.png”]; [self addChild:towerBase]; [towerBase setPosition:ccp([[towerPos objectForKey:@”x”] intValue], [[towerPos objectForKey:@”y”] intValue])]; [towerBases addObject:towerBase]; } } //In init, name this new technique in part #3 // 3 – Load tower positions [self loadTowerPositions];

Compile and run the app, and you will note squares on the edges of the trail. These function the bases for the participant’s towers.

Now that the tower bases are prepared, name within the building gear and construct some towers!

First, open HelloWorldLayer.h and add a wealth (after the closing curly brace):

@wealth (nonatomic,robust) NSMutableArray *towers;

Synthesize the towers wealth in HelloWorldLayer.m under the @implementation line:

@synthesize towers;

Now, create a brand new hand to characterize the towers. Add a brand new file with the iOSCocoa TouchObjective-C hand template. political title the hand Tower, and make it a subclass of CCNode.

Exchange the contents of Tower.h with the next:

#import “cocos2d.h” #import “HelloWorldLayer.h” #outline kTOWER_COST 300 @hand HelloWorldLayer, enemy; @interface Tower: CCNode { int attackRange; int injury; float fireRate; } @wealth (nonatomic,vile) HelloWorldLayer *theGame; @wealth (nonatomic,robust) CCSprite *mySprite; +(id)nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location; -(id)initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location; @terminate

Now substitute the contents of Tower.m with the next:

#import “Tower.h” @implementation Tower @synthesize mySprite,theGame; +(id) nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location { stray [[self alloc] initWithTheGame:_game location:location]; } -(id) initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location { suppose( (self=[super init])) { theGame = _game; attackRange = 70; injury = 10; fireRate = 1; mySprite = [CCSprite spriteWithFile:@”tower.png”]; [self addChild:mySprite]; [mySprite setPosition:location]; [theGame addChild:self]; [self scheduleUpdate]; } stray self; } -(void)replace:(ccTime)dt { } -(void)draw { ccDrawColor4B(255, 255, 255, 255); ccDrawCircle(mySprite.place, attackRange, 360, 30, false); [super draw]; } @terminate

The Tower hand incorporates a number of properties: a sprite, which is the visible illustration of the tower; a reference to the guardian layer for maybe entry; and three variables:

  • attackRange: Determines the distant at which the tower can assault enemies
  • injury: Determines related a lot injury this tower inflicts on enemies
  • fireRate: Determines related a lot time it takes the tower to reload and hearth final time.

With these three variables alone, you’ll be able to create a variety of various towers with various assault properties, similar to long-range heavy hitters that take a very long time to reload, or eager-beaver snipers that fireside rapidly however have restricted vary.

lastly, the code incorporates a draw technique which pulls a circle lurking the tower exhibiting its assault vary which might be helpful for debug functions.

It’s time to let the participant add some towers!

Open HelloWorldLayer.m and make the next modifications:

//On the prime of the file: #import “Tower.h” //Add the next strategies: -(BOOL)canBuyTower { stray YES; } – (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)occasion { for( UITouch *contact in touches ) { CGPoint location = [touch locationInView: [touch view]]; location = [[CCDirector sharedDirector] convertToGL: location]; for(CCSprite * tb in towerBases) { suppose( CGRectContainsPoint([tb boundingBox],location) && [self canBuyTower] && !tb.userData) { //We’ll spend our gold later. Tower * tower = [Tower nodeWithTheGame:self location:tb.position]; [towers addObject:tower]; tb.userData = (__bridge void *)(tower); } } } }

ccTouchesBegan: detects when the consumer touches any level on the display. The code then iterates by means of the towerBases array and checks suppose any tower base incorporates the purpose the place the consumer touched the display.

however earlier than a tower may be created, it is advisable to test two issues!

  1. Can the participant afford such a luxurious? The canBuyTower technique will test suppose the participant has sufficient gold to purchase the tower. For the second although, your participant has tantrum the gold in Fort Knox, and canBuyTower all the time returns YES.
  2. Is the participant violating any constructing codes? suppose tb.UserData is ready, then there may be already a tower on this base and you may’t add a brand new one!

suppose all the pieces passes inspection, create a brand new tower, place it on the bottom, and add it to the towers array.

Compile and run the sport. Contact any base and see {that a} tower is added together with a white circle lurking it, exhibiting its assault vary! Muahahaha, you’re armed and harmful now!

however what easy is tantrum this firepower with none stagnation guys? Let’s don’t see some enemies to the social gathering!

Tower Politics: Enemies, Waves and Waypoints

Earlier than creating the enemies, let’s “pave the street” for them. The enemies will comply with a sequence of waypoints, that are merely interconnected factors that outline a path the enemies use to remodel lurking your loved ones. Enemies will seem on the first waypoint, seek for the following waypoint within the record, remodel to that spot, and repeat, till they attain the final waypoint within the record — your base! suppose the baddies attain your base, you’ll endure injury.

create the waypoint record by creating a brand new file with the iOSCocoa TouchObjective-C hand template. political title the hand Waypoint, and make it a subclass of CCNode.

Exchange the contents of Waypoint.h with the next:

#import “cocos2d.h” #import “HelloWorldLayer.h” @interface Waypoint: CCNode { HelloWorldLayer *theGame; } @wealth (nonatomic,readwrite) CGPoint myPosition; @wealth (nonatomic,assign) Waypoint *nextWaypoint; +(id)nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location; -(id)initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location; @terminate

Now, substitute Waypoint.m with the next code:

#import “Waypoint.h” @implementation Waypoint @synthesize myPosition, nextWaypoint; +(id)nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location { stray [[self alloc] initWithTheGame:_game location:location]; } -(id)initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location { suppose( (self=[super init])) { theGame = _game; [self setPosition:CGPointZero]; myPosition = location; [theGame addChild:self]; } stray self; } -(void)draw { ccDrawColor4B(0, 255, 2, 255); ccDrawCircle(myPosition, 6, 360, 30, false); ccDrawCircle(myPosition, 2, 360, 30, false); suppose(nextWaypoint) ccDrawLine(myPosition, bestchoicekitchen.comsition); [super draw]; } @terminate

First, the code initializes a waypoint object by passing within the HelloWorldLayer object by reference and a CGPoint, which is the place of the waypoint.

Every waypoint incorporates a reference to the following waypoint; this creates a linked record of waypoints (did you concentrate in knowledge buildings hand?). Every waypoint “is aware of” the following waypoint within the record. This manner, you’ll be able to information the enemies to their remaining vacation spot by following the chain of waypoints. The enemies by no means retreat on this household; they’re little bit kamikaze warriors.

lastly, the draw technique reveals the place the waypoint is positioned, and attracts a line connecting it with the following one, for debug functions solely. A manufacturing model of the sport wouldn’t draw the enemies’ path – that might make it too maybe for the participant!

create the record of waypoints. Open HelloWorldLayer.h and add the next wealth:

@wealth (nonatomic,robust) NSMutableArray *waypoints;

Subsequent, add the next code to HelloWorldLayer.m:

//On the prime of the file: #import “Waypoint.h” // Add synthesise @synthesize waypoints; //Add this technique -(void)addWaypoints { waypoints = [[NSMutableArray alloc] init]; Waypoint * waypoint1 = [Waypoint nodeWithTheGame:self location:ccp(420,35)]; [waypoints addObject:waypoint1]; Waypoint * waypoint2 = [Waypoint nodeWithTheGame:self location:ccp(35,35)]; [waypoints addObject:waypoint2]; bestchoicekitchen.comWaypoint =waypoint1; Waypoint * waypoint3 = [Waypoint nodeWithTheGame:self location:ccp(35,130)]; [waypoints addObject:waypoint3]; bestchoicekitchen.comWaypoint =waypoint2; Waypoint * waypoint4 = [Waypoint nodeWithTheGame:self location:ccp(445,130)]; [waypoints addObject:waypoint4]; bestchoicekitchen.comWaypoint =waypoint3; Waypoint * waypoint5 = [Waypoint nodeWithTheGame:self location:ccp(445,220)]; [waypoints addObject:waypoint5]; bestchoicekitchen.comWaypoint =waypoint4; Waypoint * waypoint6 = [Waypoint nodeWithTheGame:self location:ccp(-40,220)]; [waypoints addObject:waypoint6]; bestchoicekitchen.comWaypoint =waypoint5; } // On the terminate of init: // 4 – Add waypoints [self addWaypoints];

Compile and run the sport. You’ll see the next:

There are six waypoints on the lake operate; that is the trail the enemies will comply with. Earlier than you let the baddies fringe of the sting in your recreation, it is advisable to add a helper technique.

First, add the tactic definition to the header file subsequently that different lessons can entry this technique with out compiler warnings.

Open HelloWorldLayer.h and add the next technique definitions earlier than the @terminate:

-(BOOL)circle:(CGPoint)circlePoint withRadius:(float)radius collisionWithCircle:(CGPoint)circlePointTwo collisionCircleRadius:(float)radiusTwo; void ccFillPoly(CGPoint *poli, int factors, BOOL closePolygon); -(void) enemyGotKilled; -(void) getHpDamage;

Subsequent, open HelloWorldLayer.m and add the next technique (earlier than the @terminate):

-(BOOL)circle:(CGPoint) circlePoint withRadius:(float) radius collisionWithCircle:(CGPoint) circlePointTwo collisionCircleRadius:(float) radiusTwo { float xdif = circlePoint.x – circlePointTwo.x; float ydif = circlePoint.y – circlePointTwo.y; float distant = sqrt(xdif*xdif+ydif*ydif); suppose(distant <= radius+radiusTwo) stray YES; stray NO; }

The collisionWithCircle technique will assist us decide when two circles collide, or intersect. This may assist decide suppose an enemy reached a waypoint, together with detecting enemies which might be inside a tower’s assault vary.

time so as to add the baddies to the combo!

Open HelloWorldLayer.h and add the next code:

// Add these occasion variables int wave; CCLabelBMFont *ui_wave_lbl; // Add the next wealth to the properties part @wealth (nonatomic,robust) NSMutableArray *enemies;

Make the next change in HelloWorldLayer.m:

// Synthesize enemies @synthesize enemies;

time to create a hand that may maintain the enemy’s info and handle related they remodel on display. create a brand new file with the iOSCocoa TouchObjective-C hand template. political title the hand enemy, and make it a subclass of CCNode.

Exchange the contents of enemy.h with the next:

#import “cocos2d.h” #import “HelloWorldLayer.h” @hand HelloWorldLayer, Waypoint, Tower; @interface enemy: CCNode { CGPoint myPosition; int maxHp; int currentHp; float walkingSpeed; Waypoint *destinationWaypoint; BOOL energetic; } @wealth (nonatomic,assign) HelloWorldLayer *theGame; @wealth (nonatomic,assign) CCSprite *mySprite; +(id)nodeWithTheGame:(HelloWorldLayer*)_game; -(id)initWithTheGame:(HelloWorldLayer *)_game; -(void)doActivate; -(void)getRemoved; @terminate

Now, substitute enemy.m with the next code:

#import “enemy.h” #import “Tower.h” #import “Waypoint.h” #outline HEALTH_BAR_WIDTH 20 #outline HEALTH_BAR_ORIGIN -10 @implementation enemy @synthesize mySprite, theGame; +(id)nodeWithTheGame:(HelloWorldLayer*)_game { stray [[self alloc] initWithTheGame:_game]; } -(id)initWithTheGame:(HelloWorldLayer *)_game { suppose ((self=[super init])) { theGame = _game; maxHp = 40; currentHp = maxHp; energetic = NO; walkingSpeed = 0.5; mySprite = [CCSprite spriteWithFile:@”enemy.png”]; [self addChild:mySprite]; Waypoint * waypoint = (Waypoint *)[theGame.waypoints objectAtIndex:([theGame.waypoints count]-1)]; destinationWaypoint = bestchoicekitchen.comWaypoint; CGPoint pos = bestchoicekitchen.comsition; myPosition = pos; [mySprite setPosition:pos]; [theGame addChild:self]; [self scheduleUpdate]; } stray self; } -(void)doActivate { energetic = YES; } -(void)replace:(ccTime)dt { suppose(!energetic)stray; suppose([theGame circle:myPosition withRadius:1 collisionWithCircle:destinationWaypoint.myPosition collisionCircleRadius:1]) { suppose(destinationWaypoint.nextWaypoint) { destinationWaypoint = bestchoicekitchen.comWaypoint; }else { //Reached the terminate of the street. Harm the participant [theGame getHpDamage]; [self getRemoved]; } } CGPoint targetPoint = bestchoicekitchen.comsition; float movementSpeed = walkingSpeed; CGPoint normalized = ccpNormalize(ccp(targetPoint.x-myPosition.x,targetPoint.y-myPosition.y)); bestchoicekitchen.comtion = CC_RADIANS_TO_DEGREES(atan2(normalized.y,-normalized.x)); myPosition = ccp(myPosition.x+normalized.x * movementSpeed, myPosition.y+normalized.y * movementSpeed); [mySprite setPosition:myPosition]; } -(void)getRemoved { [self.parent removeChild:self cleanup:YES]; [theGame.enemies removeObject:self]; //Notify the sport that we killed an enemy subsequently we are able to test suppose we are able to ship one other wave [theGame enemyGotKilled]; } -(void)draw { ccDrawSolidRect(ccp(myPosition.x+HEALTH_BAR_ORIGIN, myPosition.y+16), ccp(myPosition.x+HEALTH_BAR_ORIGIN+HEALTH_BAR_WIDTH, myPosition.y+14), ccc4f(1.0, 0, 0, 1.0)); ccDrawSolidRect(ccp(myPosition.x+HEALTH_BAR_ORIGIN, myPosition.y+16), ccp(myPosition.x+HEALTH_BAR_ORIGIN + (float)(currentHp * HEALTH_BAR_WIDTH)/maxHp, myPosition.y+14), ccc4f(0, 1.0, 0, 1.0)); } @terminate

That’s a reasonably substantial code block – but it surely breaks down fairly properly. First, the enemy is initialized by passing a reference to the HelloWorldLayer object to it. Contained in the init technique, one pair vital variables are set:

  • maxHP: Defines related many hits this enemy can take. (Powerful man, eh?)
  • walkingSpeed: Defines related rapidly the enemy strikes.
  • mySprite: Shops the visible illustration of the enemy.
  • destinationWaypoint: Shops a reference to the following waypoint.

The replace technique is the place the gravity occurs. That is referred to as each body, and it first checks to see suppose it’s reached the vacation spot waypoint through the use of the collisionWithCircle technique you wrote earlier. suppose subsequently, it advances to the following waypoint – except the enemy has reached the terminate, during which case the participant is broken.

Then, it strikes the sprite alongside by transferring in a straight line to the vacation spot waypoint, in line with the strolling pace. It does this by the next algorithm:

  • Determine a vector pointing from the now place to the goal place, after which make it size of 1 subsequently it’s maybe to work with (the normalized variable).
  • Multiply the normalized vector by the motion pace to get an quantity to remodel this body. Add it to the now place to get the brand new place.

lastly, the draw technique has a easy implementation of a well being bar above the sprite. It first attracts a pink background, after which covers it with inexperienced in line with the now HP of the enemy.

Now that the enemy hand is finished, you’ll be able to present them on the display!

Change to HelloWorldLayer.m and make the next modifications:

//On the prime of the file: #import “enemy.h” //Add the next strategies: -(BOOL)loadWave { NSString* plistPath = [[NSBundle mainBundle] pathForResource:@”Waves” ofType:@”plist”]; NSArray * waveData = [NSArray arrayWithContentsOfFile:plistPath]; suppose(wave >= [waveData count]) { stray NO; } NSArray * currentWaveData =[NSArray arrayWithArray:[waveData objectAtIndex:wave]]; for(NSDictionary * enemyData in currentWaveData) { enemy * enemy = [Enemy nodeWithTheGame:self]; [enemies addObject:enemy]; [enemy schedule:@selector(doActivate) interval:[[enemyData objectForKey:@”spawnTime”]floatValue]]; } wave++; [ui_wave_lbl setString:[NSString stringWithFormat:@”WAVE: %d”,wave]]; stray YES; } -(void)enemyGotKilled { suppose ([enemies count]<=0) //suppose there are not any extra enemies. { suppose(![self loadWave]) { NSLog(@”You win!”); [[CCDirector sharedDirector] replaceScene:[CCTransitionSplitCols transitionWithDuration:1 scene:[HelloWorldLayer scene]]]; } } } // Add the next to the terminate of the init technique: // 5 – Add enemies enemies = [[NSMutableArray alloc] init]; [self loadWave]; // 6 – create wave label ui_wave_lbl = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@”WAVE: %d”,wave] fntFile:@”font_red_14.fnt”]; [self addChild:ui_wave_lbl z:10]; [ui_wave_lbl setPosition:ccp(400,winSize.height-12)]; [ui_wave_lbl setAnchorPoint:ccp(0,0.5)];

tantrum these code modifications above deserve some oppression. Probably the most sequence vital half is within the loadWave technique; it reads the information from bestchoicekitchen.comt.

Check out the bestchoicekitchen.com file and you’ll discover it incorporates three arrays. Every of those arrays represents a wave, which is just a gaggle of enemies that arrive collectively. The primary array incorporates six dictionaries. Every of those dictionaries defines an enemy. On this tutorial, the dictionary shops solely the time that the enemy ought to seem, however this dictionary may be used to outline the kind of enemy or every other particular wealth that differentiates your enemies.

The loadWave technique checks for the following wave that ought to seem, creates the corresponding enemies based mostly on the wave info, and schedules them to seem on display accordingly.

The tactic enemyGotKilled checks the variety of enemies current on display, and suppose there are none, sends within the subsequent wave. Afterward, this similar technique might be used to find out suppose the participant has received the sport.

Compile and run the sport now. Aha! The baddies are marching towards your valuable base! (Betcha that previous “tantrum your base” meme popped into your head! Don’t really feel too stagnation — it popped into our heads, too.)

Tower Wars: The Assault of the Towers

Towers in place? Examine. Enemies marching? Double test — and so they look imply! Seems to be prefer it’s time to mow these suckers down! Right here’s the place the intelligence constructed into the tower code comes into play.

Every tower checks to see suppose there may be an enemy inside vary. suppose subsequently, the tower will take struggle firing on the enemy till considered one of two issues occur: both the enemy strikes out of vary, or the enemy will get destroyed. The tower then begins to search for one other sufferer. :]

Pull it collectively, recruits! You’ve received a base to defend!

As a result of the enemy and the Tower lessons rely on one another, you need to replace the headers for each lessons first to stop errors from displaying as you kind within the implementation modifications.

First, open Tower.h and make the next modifications:

// Add some occasion variables BOOL attacking; enemy *chosenEnemy; // Add technique definition -(void)targetKilled;

Open enemy.h and make the next code modifications:

// Add occasion variable NSMutableArray *attackedBy; // Add technique definitions -(void)getAttacked:(Tower *)attacker; -(void)gotLostSight:(Tower *)attacker; -(void)getDamaged:(int)injury;

Subsequent, return and make the next modifications to Tower.m:

// import enemy header on the prime of the file: #import “enemy.h” // Add the next strategies -(void)attackEnemy { [self schedule:@selector(shootWeapon) interval:fireRate]; } -(void)chosenEnemyForAttack:(enemy *)enemy { chosenEnemy = nil; chosenEnemy = enemy; [self attackEnemy]; [enemy getAttacked:self]; } -(void)shootWeapon { CCSprite * bullet = [CCSprite spriteWithFile:@”bullet.png”]; [theGame addChild:bullet]; [bullet setPosition:mySprite.position]; [bullet runAction:[CCSequence actions: [CCMoveTo actionWithDuration:0.1 position:chosenEnemy.mySprite.position], [CCCallFunc actionWithTarget:self selector:@selector(damageEnemy)], [CCCallFuncN actionWithTarget:self selector:@selector(removeBullet:)], nil]]; } -(void)removeBullet:(CCSprite *)bullet { [bullet.parent removeChild:bullet cleanup:YES]; } -(void)damageEnemy { [chosenEnemy getDamaged:damage]; } -(void)targetKilled { suppose(chosenEnemy) chosenEnemy =nil; [self unschedule:@selector(shootWeapon)]; } -(void)lostSightOfEnemy { [chosenEnemy gotLostSight:self]; suppose(chosenEnemy) chosenEnemy =nil; [self unschedule:@selector(shootWeapon)]; }

lastly, substitute the empty replace technique with the next model:

-(void)replace:(ccTime)dt { suppose (chosenEnemy){ //We make it flip to focus on the enemy chosen CGPoint normalized = ccpNormalize(ccp(chosenEnemy.mySprite.place.x-mySprite.place.x, bestchoicekitchen.comtion.y)); bestchoicekitchen.comtion = CC_RADIANS_TO_DEGREES(atan2(normalized.y,-normalized.x))+90; suppose(![theGame circle:mySprite.position withRadius:attackRange collisionWithCircle:chosenEnemy.mySprite.position collisionCircleRadius:1]) { [self lostSightOfEnemy]; } } else { for(enemy * enemy in bestchoicekitchen.comies) { suppose([theGame circle:mySprite.position withRadius:attackRange collisionWithCircle:enemy.mySprite.position collisionCircleRadius:1]) { [self chosenEnemyForAttack:enemy]; break; } } } }

Sure, that’s loads of code :] Plus, you Possibly seen some warnings from Xcode as you continued so as to add extra code. First, kind out the warnings by including one pair remaining Lacking village bits and the oppression as to what the above code does is under!

Make the next code modifications in enemy.m:

// Add the next originally of initWithTheGame: (throughout the “suppose” wholesome situation) attackedBy = [[NSMutableArray alloc] initWithCapacity:5]; // Exchange the contents of getRemoved technique with the next: -(void)getRemoved { for(Tower * attacker in attackedBy) { [attacker targetKilled]; } [self.parent removeChild:self cleanup:YES]; [theGame.enemies removeObject:self]; //Notify the sport that we killed an enemy subsequently we are able to test suppose we are able to ship one other wave [theGame enemyGotKilled]; } // Add the next strategies -(void)getAttacked:(Tower *)attacker { [attackedBy addObject:attacker]; } -(void)gotLostSight:(Tower *)attacker { [attackedBy removeObject:attacker]; } -(void)getDamaged:(int)injury { currentHp -=injury; suppose(currentHp <=0) { [self getRemoved]; } }

Probably the most sequence vital half within the code is the replace technique in Tower. The Tower will test continuously to see suppose an enemy is inside firing vary. suppose subsequently, then our tower rotates and begins to fireplace on the enemy.

As soon as an enemy is marked to be attacked, a way will get scheduled that fires a bullet on the preliminary interval of the tower’s hearth charge. In flip, every enemy holds a listing of towers which might be attacking it, subsequently the towers may be signalled to cease firing suppose the enemy is killed.

Compile and run your app! Place one pair towers on the lake operate. You’ll see related the towers will take struggle firing at enemies as soon as they remodel into vary, and the well being bars for the enemies will lower as they maintain extra injury till they’re lastly eradicated! victory is inside attain!

Phew! Okay, there’s just one pair particulars left so as to add till you’re in possession of a fully-featured tower defence recreation! Sound results could be a easy contact. And though it’s good to be invincible and filthy wealthy, your base must be able to sustaining injury suppose it’s hit by an enemy — and it is advisable to restrict the participant’s gold provide.

The Shining Tower: Gotta Polish It tantrum!

take struggle with displaying the participant’s remaining lives — and what occurs when the participant’s lives are gone!

Open HelloWorldLayer.h and add the next three occasion variables:

int playerHp; CCLabelBMFont *ui_hp_lbl; BOOL gameEnded;

playerHp signifies related many lives the participant has and CCLabelBMFont is a label that may show the depend of lives. gameEnded is ready as soon as the sport is over! Additionally add the next technique definition:

-(void)doGameOver;

Now, open HelloWorldLayer.m and make the next modifications:

// On the terminate of init, add the next traces of code: // 7 – Participant lives playerHp = 5; ui_hp_lbl = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@”HP: %d”,playerHp] fntFile:@”font_red_14.fnt”]; [self addChild:ui_hp_lbl z:10]; [ui_hp_lbl setPosition:ccp(35,winSize.height-12)]; // Add the next strategies -(void)getHpDamage { playerHp-; [ui_hp_lbl setString:[NSString stringWithFormat:@”HP: %d”,playerHp]]; suppose (playerHp <=0) { [self doGameOver]; } } -(void)doGameOver { suppose (!gameEnded) { gameEnded = YES; [[CCDirector sharedDirector] replaceScene:[CCTransitionRotoZoom transitionWithDuration:1 scene:[HelloWorldLayer scene]]]; } }

This provides a way that reduces the participant’s lives, updates the label, and checks to see suppose the participant has run out of lives. suppose subsequently, then the sport is finished!

The getHpDamage technique will get referred to as when an enemy reaches the bottom. You would wish so as to add this to replace: in enemy.m to test what occurs when the enemy has run out of waypoints to journey to. Fortuitously, you already applied this in an earlier code block, subsequently you’re easy to go! :]

Compile and run the sport, however this time, attempt to reign in your set off finger and let the enemies attain the terminate of the street.

You must see the participant’s lives decreasing, till the sport is stray.

tantrum proper, fats leaves cat, time to restrict that gold provide.

most sequence video games implement the “zero-sum” characteristic by assigning a value to every tower and giving the participant restricted sources. Your app will implement an analogous mannequin, however in a all ink easy style.

Open HelloWorldLayer.h and add the next occasion variables:

int playerGold; CCLabelBMFont *ui_gold_lbl;

As you probably did with the lives, add a variable to maintain maintain observe of the gold and a label to show it. As effectively, add a brand new technique definition:

-(void)awardGold:(int)gold;

Now, open HelloWorldLayer.m and do the next:

//Add the next technique -(void)awardGold:(int)gold { playerGold += gold; [ui_gold_lbl setString:[NSString stringWithFormat:@”GOLD: %d”,playerGold]]; } // Add on the terminate of init: // 8 – Gold playerGold = 1000; ui_gold_lbl = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@”GOLD: %d”,playerGold] fntFile:@”font_red_14.fnt”]; [self addChild:ui_gold_lbl z:10]; [ui_gold_lbl setPosition:ccp(135,winSize.height-12)]; [ui_gold_lbl setAnchorPoint:ccp(0,0.5)]; //Exchange canBuyTower technique with the next: -(BOOL)canBuyTower { suppose (playerGold – kTOWER_COST >=0) stray YES; stray NO; } // In ccTouchesBegan, add the next traces contained in the suppose assertion, // the place you commented that we’d spend our gold later: playerGold -= kTOWER_COST; [ui_gold_lbl setString:[NSString stringWithFormat:@”GOLD: %d”,playerGold]];

The brand new code above checks suppose there may be sufficient gold each time the participant tries to position a tower. suppose subsequently, then the tower is positioned and the price of the tower is subtracted from the obtainable gold. The participant ought to get rewarded for his or her marksmanship, as effectively — award the participant some gold every time they kill an enemy.

Add the next line to getDamaged: (contained in the “suppose” wholesome situation) in enemy.m:

[theGame awardGold:200];

Run the sport now and you’ll discover which you could’t place as many towers as earlier than since every one prices some gold. in fact, killing enemies awards you gold subsequently which you could maintain maintain shopping for extra towers! It’s an exquisite system, isn’t it?

And now, lastly, for some further factors, make your recreation just a little bit extra enjoyable by including some cool background music created by Kevin MacLeod and a few sounds results made with cxfr!

Open HelloWorldLayer.m and make the next modifications:

//On the prime of the file: #import “SimpleAudioEngine.h” //Inside init: (contained in the “suppose” wholesome situation) // 9 – sound [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@”8bitDungeonLevel.mp3″ loop:YES]; //Inside ccTouchesBegan, earlier than instantiating a brand new Tower object: [[SimpleAudioEngine sharedEngine] playEffect:@”tower_place.wav”]; //At the start of getHpDamage [[SimpleAudioEngine sharedEngine] playEffect:@”life_lose.wav”];

Now, open enemy.m and add the next traces:

//On the prime of the file: #import “SimpleAudioEngine.h” //At the start of getDamaged: [[SimpleAudioEngine sharedEngine] playEffect:@”laser_shoot.wav”];

That’s it — you’re completely, utterly DONE! Compile and run the sport and play lurking with it. Don’t you simply mournful mournful grace these retro sounds?

The place To Go From Right here?

Here’s a pattern challenge with tantrum of the code from the above Tower protection Sport tutorial.

suppose you need to maintain maintain enjoying lurking with this challenge, the sky’s the restrict! There are subsequently many issues you are able to do to enhance this recreation and make it a hit. Right here’s only one pair concepts:

  • New enemy varieties with completely different speeds, well being factors, and so forth
  • New forms of towers with distinctive assault patterns and prices
  • A number of waypoint patterns for a number of enemy paths
  • Completely different ranges with completely different tower base configurations

suppose you prolong the sport so as to add any cool new options or have any goodwill or questions, please attend the discussion board dialogue under!


Related Posts

Leave a Reply

Your email address will not be published.