2012-05-07 182 views
0

我有多个精灵放置在背景精灵这样的:的cocos2d精灵碰撞

//my background 
CCSprite *bg = [CCSprite spriteWithFile:@"imageName.png"]; 

[self addchild:bg]; 

然后添加我的项目到BG

//this is how i add my items 
CCSprite *items = [CCSprite spriteWithFile:@"itemName.png"]; 

[bg addchild:items]; 

哦,不要忘了我的车精灵

//my car 
CCSprite *car = [CCSprite spriteWithFile:@"car.png"]; 
[self addchild:car]; 

我使用一个循环将多个精灵添加到bg上。

现在的问题是我该如何检测汽车是否与我放在bg上的多个子图相撞?

我试过使用CGRectIntersectsRect,它不起作用。

我试过使用毕达哥拉斯定理方法,并再次无法正常工作。

有一种方法涉及将项目精灵添加到NSMutableArray中,它也不起作用。

任何人都可以提出一种方法,我可以尝试吗?

附加代码:

-(void) initializeCarAndItems 
{ 
    car = [CCSprite spriteWithFile:@"android.png"]; 
    car.position = ccp(screenSize.width/2, screenSize.height * 0.30); 
    [self addChild:car z:1]; 
    carRect = [car boundingBox]; 
} 

-(void) initializeMap 
{ 
    bg1 = [CCSprite spriteWithFile:@"racingBG.png"]; 
    bg1.anchorPoint = ccp(0, 0); 
    bg1.position = ccp(0, 0); 

    [self addChild:bg1 z:-1]; 

    bg2 = [CCSprite spriteWithFile:@"racingBG2.png"]; 
    bg2.anchorPoint = ccp(0,0); 
    bg2.position = ccp(0, bg1.boundingBox.size.height - 1); 

    [self addChild:bg2 z:-1]; 

    convertedWidth = (int)bg1.boundingBox.size.width; 
    convertedHeight = (int)bg1.boundingBox.size.height; 

    for (y = 0; y < 15; y++) 
    { 
     positionX = arc4random()%convertedWidth; 
     positionY = arc4random()%convertedHeight; 

     items = [CCSprite spriteWithFile:@"item.png"]; 
     items.position = ccp(positionX, positionY + 300); 
     [bg1 addChild:items z:100]; 
     [itemsArray addObject:items]; 
    } 

    for (y = 0; y < 15; y++) 
    { 
     positionX = arc4random()%convertedWidth; 
     positionY = arc4random()%convertedHeight; 

     items = [CCSprite spriteWithFile:@"item.png"]; 
     items.position = ccp(positionX, positionY); 
     [bg2 addChild:items z:100]; 
     [itemsArray addObject:items]; 
    } 
} 

-(void) accelerate 
{ 
    bg1.position = ccp(0, bg1.position.y - accelerateNumber); 
    bg2.position = ccp(0, bg2.position.y - accelerateNumber); 

    if (bg1.position.y < -bg1.boundingBox.size.height) 
    { 
     questionCount++; 
     bg1.position = ccp(0, bg2.position.y + bg2.boundingBox.size.height - 1); 
     [self question]; 

     [bg1 removeAllChildrenWithCleanup:YES]; 
     for (y = 0; y < 15; y++) 
     { 
      positionY = arc4random()%convertedHeight; 
      positionX = arc4random()%convertedWidth; 

      items.position = ccp(positionX, positionY); 
      items = [CCSprite spriteWithFile:@"item.png"]; 
      [bg1 addChild:items z:100]; 
      [itemsArray addObject:items]; 
     } 
    } 
    else if (bg2.position.y < -bg2.boundingBox.size.height) 
    { 
     questionCount++; 
     bg2.position = ccp(0, bg1.position.y + bg1.boundingBox.size.height - 1); 
     [self question]; 

     [bg2 removeAllChildrenWithCleanup:YES]; 
     for (y = 0; y < 15; y++) 
     { 
      positionY = arc4random()%convertedHeight; 
      positionX = arc4random()%convertedWidth; 

      items.position = ccp(positionX, positionY); 
      items = [CCSprite spriteWithFile:@"item.png"]; 
      [bg2 addChild:items z:100]; 
      [itemsArray addObject:items]; 
     } 
    } 
} 

-(void) update:(ccTime)deltaTime 
{ 
    [self ifEdgeOfScreen]; 
    [self accelerate]; 

    for (CCSprite *itemFromArray in itemsArray) 
    { 
     CGRect itemRect = [itemFromArray boundingBox]; 
     if (CGRectIntersectsRect(carRect, itemRect)) 
     { 
      NSLog(@"Collision!"); 
     } 
    } 

    if (leftButton.active == TRUE) 
    { 
     [self moveLeftRight:1]; 
    } 
    else if (rightButton.active == TRUE) 
    { 
     [self moveLeftRight:2]; 
    } 
} 

UPDATE:

它的固定:)

-(void) update:(ccTime)deltaTime 
{ 
    car = [car boundingbox]; 

    [self ifEdgeOfScreen]; 
    [self accelerate]; 



    for (CCSprite *itemFromArray in itemsArray) 
    { 
     if (CGRectIntersectsRect(carRect, [itemFromArray boundingbox])) 
     { 
      NSLog(@"Collision!"); 
     } 
    } 

    if (leftButton.active == TRUE) 
    { 
     [self moveLeftRight:1]; 
    } 
    else if (rightButton.active == TRUE) 
    { 
     [self moveLeftRight:2]; 
    } 
} 
+0

你能写路口也代码?你如何访问对象?因为它会显示你如何处理碰撞... :) –

+0

嘿Nikhil Aneja!我在问题中添加了更多代码:)提前致谢! – Yongzheng

回答

0

我发现的代码这么多的问题....

  1. 当你拨打removeAllChildren ..确保你也从数组中移除了对象..从父母移除精灵不会将它从数组中移除。

  2. 在更新方法中更新汽车矩形。因此,在您更新方法

    - (空)更新:(ccTime)的DeltaTime {

    [self ifEdgeOfScreen]; 
    
        [self accelerate]; 
    
        carRect = [car boundingBox]; 
    ........... 
    } 
    

希望这有助于.. :)

+0

Heya Nikhil Aneja。我已经解决了这个问题:d我只是改变了这一点: 为(CCSprite * itemFromArray在itemsArray) { 的CGRect itemRect = [itemFromArray boundingBox的]。 (CGRectIntersectsRect(carRect,itemRect)) NSLog(@“Collision!“); } } 此 为(CCSprite * itemFromArray在itemsArray) { 如果(CGRectIntersectsRect(carRect,[itemFromArray boundingBox的])) { 的NSLog(@” 碰撞“);! } } ,当然我加入carRect = [汽车外接矩形框] :)感谢您的帮助! – Yongzheng