I am making a cocos2d side scroller and I am currently putting collision detection in. I have an enemy that shoots at the player. I want to have the bullets disappear when they hit the player. The enemy itself disappears when it touches the player but for some reason the bullet collision detection does not work. Here is the code for the enemy, bullets, and collision detection.
@implementation RedEnemy
@synthesize redEnemySprite,redEnemyBulletSprite;
+(id)createRedEnemy{
return [[[self alloc]init]autorelease];
}
-(id)init{
if ((self = [super init])) {
CGSize size = [[CCDirector sharedDirector]winSize];
screenWidth = size.width;
screenHeight = size.height;
//Make the redEnemy
redEnemySprite = [CCSprite spriteWithFile:@"redenemy.png"];
redEnemySprite.position = ccp(screenWidth + 100, screenHeight/2);
[self addChild:redEnemySprite];
//Set the speed of the redEnemy and bullet moving
speed = 15;
//Set the redEnemyFlameCounter
redEnemyFlameCounter = 1;
//Create the array
bulletArray = [[NSMutableArray alloc]init];
//Call the method that moves the redEnemy
[self moveTheRedEnemy];
//Start the redEnemyFlame
[self schedule:@selector(redEnemyFlame:)interval:1.0f/7.0f];
//Shoot the bullets
[self schedule:@selector(shootTheBullets:)interval:1.0f/1.0f];
//Check to see if redEnemy is off screen
[self schedule:@selector(isRedEnemyOffScreen:)interval:1.0f/60.0f];
//Test for bulletcollisions
player = [Player createPlayer];
[self addChild:player];
[self schedule:@selector(testForRedEnemyBulletCollisions:)interval:1.0f/60.0f];
}
return self;
}
-(void)redEnemyFlame:(ccTime)delta{
redEnemyFlameCounter ++;
if (redEnemyFlameCounter % 2){
[redEnemySprite setTexture:[[CCSprite spriteWithFile:@"redenemy2.png"]texture]];
}else{
[redEnemySprite setTexture:[[CCSprite spriteWithFile:@"redenemy.png"]texture]];
}
}
-(void)moveTheRedEnemy{
ccBezierConfig redEnemyPath;
redEnemyPath.controlPoint_1 = ccp(screenWidth - 200, screenHeight + 750);
redEnemyPath.controlPoint_2 = ccp(screenWidth - 400, -1000);
//redEnemyPath.endPosition = ccp(screenWidth/3.4, screenHeight/2);
redEnemyPath.endPosition = ccp(-300, screenHeight + 150);
CCBezierTo* redEnemyBezierPath = [CCBezierTo actionWithDuration:speed bezier:redEnemyPath];
[redEnemySprite runAction:redEnemyBezierPath];
}
-(void)shootTheBullets:(ccTime)delta{
//Create redEnemyBullets
redEnemyBulletSprite = [CCSprite spriteWithFile:@"thebullet.png"];
redEnemyBulletSprite.position = ccp(redEnemySprite.position.x, redEnemySprite.position.y);
[self addChild:redEnemyBulletSprite];
[bulletArray addObject:redEnemyBulletSprite];
//CCMoveTo* bulletMove = [CCMoveTo actionWithDuration:5.0 position:ccp(player.playerSprite.position.x, player.playerSprite.position.y)];
CCMoveTo* bulletMove = [CCMoveTo actionWithDuration:5.0 position:ccp(-500, redEnemyBulletSprite.position.y)];
[redEnemyBulletSprite runAction:bulletMove];
}
-(void)isRedEnemyOffScreen:(ccTime)delta{
if (redEnemySprite.position.x < -100) {
[self unschedule:@selector(isRedEnemyOffScreen:)];
[self unschedule:@selector(redEnemyFlame:)];
[self unschedule:@selector(shootTheBullets:)];
}
}
-(void)testForRedEnemyBulletCollisions:(ccTime)delta{
if (CGRectIntersectsRect(redEnemyBulletSprite.boundingBox, player.playerSprite.boundingBox)){
wasPlayerHitByRedEnemyBullet = YES;
}
if (wasPlayerHitByRedEnemyBullet) {
redEnemyBulletSprite.visible = NO;
}
}
-(void)dealloc{
[super dealloc];
}
@end
The player is created in a different class. Here is the code.
@implementation Player
@synthesize playerSprite;
+(id)createPlayer{
return [[[self alloc]init]autorelease];
}
-(id)init{
if((self = [super init])){
CGSize size = [[CCDirector sharedDirector]winSize];
screenWidth = size.width;
screenHeight = size.height;
gravity = 2;
playerSprite = [CCSprite spriteWithFile:@"thefinalcharacter.png"];
playerSprite.scale = 1.5;
playerSprite.position = ccp(screenWidth/3.4, screenHeight/2);
[self addChild:playerSprite z:-3];
[self schedule: @selector(flight:)interval:1.0f/7.0f];
}
return self;
}
-(void)flight:(ccTime)delta{
flightCounter ++;
if (flightCounter % 2){
[playerSprite setTexture:[[CCSprite spriteWithFile:@"thefinalcharacter.png"]texture]];
}else{
[playerSprite setTexture:[[CCSprite spriteWithFile:@"thefinalcharacter2.png"]texture]];
}
//[self schedule:@selector(updatePosition:)interval:1.0f/30.0f];
}
-(void)updatePosition:(ccTime)delta{
if(playerSprite.position.y < 35){
gravity = 0;
}else if(playerSprite.position.y > screenHeight - 150) {
playerSprite.position = ccp(playerSprite.position.x, playerSprite.position.y - 100);
}else{
gravity = 2;
}
playerSprite.position = ccp(playerSprite.position.x, playerSprite.position.y - gravity);
}
-(void)dealloc{
[super dealloc];
}
@end