1

我想弄清楚如何做到这一点,我有一个精灵称为'球员'和精灵'岩' 我试图检测之间的冲突两个精灵.....但没有发生碰撞!简单的碰撞检测在cocos2d box2d..nothing发生在碰撞

继承人我做了什么:下面

-(void)addRock { 

rock = [CCSprite spriteWithFile:@"rock.png" 
            rect:CGRectMake(0, 0, 27, 40)]; 

// Determine where to spawn the target along the X axis 
CGSize winSize = [[CCDirector sharedDirector] winSize]; 
int minX = rock.contentSize.width/2; 
int maxX = winSize.width - rock.contentSize.width/2; 
int rangeX = maxX - minX; 
int actualX = (arc4random() % rangeX) + minX; 
// Create the target slightly off-screen along the right edge, 
// and along a random position along the X axis as calculated above 
rock.position = ccp(actualX, 500); 
rock.tag = 1; 
[rockArray addObject:rock]; 
[self addChild:rock]; 

播放器代码:

-(id) init{ 
if((self=[super initWithColor:ccc4(255, 255, 255, 255)])) { 
    CGSize winSize = [[CCDirector sharedDirector] winSize]; 
    player = [CCSprite spriteWithFile:@"Player.png" 
              rect:CGRectMake(0, 0, 27, 40)]; 
    player.position = ccp(winSize.width/2, winSize.height/4+15); //position of where the player is placed 
    player.tag = 2; 
    [playerArray addObject:player]; 
    [self addChild:player]; 

精灵移动完成:

-(void)spriteMoveFinished:(id)sender { 


CCSprite *sprite = (CCSprite *)sender; 
[self removeChild:sprite cleanup:YES]; 

if (sprite.tag == 1) { // rock 
    [rockArray removeObject:sprite]; 
} else if (sprite.tag == 2) { // players 
    [playerArray removeObject:sprite]; 

的init(数组初始化):

rockArray = [[NSMutableArray alloc]init]; 
    playerArray = [[NSMutableArray alloc]init]; 
    [self schedule:@selector(update:)]; 

更新方法

- (void)update:(ccTime)dt { 


    NSMutableArray *rocksToDelete = [[NSMutableArray alloc] init]; 
    for (rock in rockArray) { 
     CGRect rockRect = CGRectMake(
             rock.position.x - (rock.contentSize.width/2), 
             rock.position.y - (rock.contentSize.height/2), 
             rock.contentSize.width, 
             rock.contentSize.height); 


    NSMutableArray *playersToDelete = [[NSMutableArray alloc] init]; 
    for (player in playerArray) { 
     CGRect pRect = CGRectMake(

             player.position.x - (player.contentSize.width/2), 
             player.position.y -(player.contentSize.height/2), 
             player.contentSize.width, 
             player.contentSize.height); 

     if (CGRectIntersectsRect(rockRect, pRect)) { 
      [rocksToDelete addObject:rock]; 
     } 

     for (rock in rocksToDelete) { 
      [rockArray removeObject:rock]; 
      [self removeChild:rock cleanup:YES];          
     } 

     if (rocksToDelete.count > 0) { 
      [playersToDelete addObject:player]; 
     } 
     [rocksToDelete release]; 

     for (player in playersToDelete) { 
      [playerArray removeObject:player]; 
      [self removeChild:player cleanup:YES]; 
     } 
     [playersToDelete release]; 

我一直在努力整夜排序我的问题。我似乎可以使碰撞检测工作。如果是这样,有人可以给我看一个简短的代码吗?

回答

0

很好,检查两个精灵之间的碰撞,你必须每帧调用一个方法(或者你经常选择)来检查是否发生了碰撞。 添加以下代码init方法:

[self scheduleUpdate]; 

...这将调用下面的方法(你必须添加到您的类的实现),每帧:

-(void)update:(ccTime)delta { 
    if (CGRectIntersectsRect(player.boundingBox, rock.boundingBox)) { 
     //Do Stuff 
    } 
} 

对于以前的代码您必须将Player和Rock sprite声明为成员变量,以便在整个课程中使用它们。

如果你在场景中有多个岩石精灵你想检查碰撞,你将不得不使用一个数组。简单的例子:

1声明在你类接口的数组:

NSMutableArray *rockArray; 

2 init方法

rockArray = [NSMutableArray array]; 

3分配内存为它在 “addRock” 方法中添加创建的岩石精灵到阵列,然后作为一个孩子到现场

-(void) addRock { 
    CCSprite *rock = [CCSprite spriteWithFile:@"rock.png" 
            rect:CGRectMake(0, 0, 27, 40)]; 
    //... 

    [rockArray addObject:rock]; 
    [self addChild:[rockArray lastObject]]; 
} 

4在“更新”方法你现在lo OP通过数组和检查&玩家

for (CCSprite *_rock in rockArray) { 
    if (CGRectIntersectsRect(player.boundingBox, rock.boundingBox)) { 
      //Do Stuff e.g remove that rock from the scene 
      [self removeChild:_rock cleanup:YES]; 
     } 
} 

希望这有助于;-)随意问任何问题,岩石之间的碰撞

+0

当我宣布CCSprite *播放器和CCSprite *岩石,我得到一个警告.m文件说'本地声明的'播放器'隐藏实例变量'和岩石相同 – sahil 2012-02-11 18:32:56

+0

我声明CCSprite *播放器和CCSprite *岩石在.h文件中 – sahil 2012-02-11 18:37:52

+0

如果在.h文件(接口)中声明变量可以通过实现(.m文件)中的名称来访问这些var,例如player = [CCSprite spriteWith ...]。 – 2012-02-11 18:46:53