2012-05-31 54 views
0

我是cocos2d和im的初学者,面临检测我的硬币碰撞的问题。 有时候它有时候不起作用。Cocos2D - 检测碰撞

所以基本上,即时通讯创建一个游戏,用户(船)必须避开障碍物并在途中收集硬币。障碍物的碰撞效果很好,但不适用于硬币。 我在想也许创造很多硬币的循环是问题,但我不知道。

任何人都可以帮忙吗?

我的代码:

- (void)update:(ccTime)dt{ 
double curTime = CACurrentMediaTime(); 
if (curTime > _nextBridgeSpawn) { 

    float randSecs = [self randomValueBetween:3.0 andValue:5.0]; 
    _nextBridgeSpawn = randSecs + curTime; 

    float randX = [self randomValueBetween:50 andValue:500]; 
    float randDuration = [self randomValueBetween:8.0 andValue:10.0]; 

    CCSprite *bridge = [_bridge objectAtIndex:_nextBridge]; 

    _nextBridge++; 

    if (_nextBridge >= _bridge.count) _nextBridge = 0; 

    [bridge stopAllActions]; 
    bridge.position = ccp(winSize.width/2, winSize.height); 
    bridge.visible = YES; 

    [bridge runAction:[CCSequence actions: 
         [CCMoveBy actionWithDuration:randDuration position:ccp(0, -winSize.height)], 
         [CCCallFuncN actionWithTarget:self selector:@selector(setInvisible:)], 
         nil]]; 

这就是我宣布我的硬币(从更新方法续)

int randCoin = [self randomValueBetween:0 andValue:5]; 
    _coin = [[CCArray alloc] initWithCapacity:randCoin]; 
    for(int i = 0; i < randCoin; ++i) { 
     coin = [CCSprite spriteWithFile:@"coin.png"]; 
     coin.visible = NO; 
     [self addChild:coin]; 
     [_coin addObject:coin]; 
    } 

    float randCoinX = [self randomValueBetween:winSize.width/5 andValue:winSize.width - (border.contentSize.width *2)]; 
    float randCoinY = [self randomValueBetween:100 andValue:700]; 
    float randCoinPlace = [self randomValueBetween:30 andValue:60]; 
    for (int i = 0; i < _coin.count; ++i) { 
     CCSprite *coin2 = [_coin objectAtIndex:i]; 
     coin2.position = ccp(randCoinX, (bridge.position.y + randCoinY) + (randCoinPlace *i)); 
     coin2.visible = YES; 
     [coin2 runAction:[CCSequence actions: 
          [CCMoveBy actionWithDuration:randDuration position:ccp(0, -winSize.height-2000)], 
          [CCCallFuncN actionWithTarget:self selector:@selector(setInvisible:)], 
          nil]]; 
    } 

} 

这是检查碰撞(也在更新方法)

for (CCSprite *bridge in _bridge) {   
    if (!bridge.visible) continue; 

if (CGRectIntersectsRect(ship.boundingBox, bridge.boundingBox)){ 
      bridge.visible = NO; 
      [ship runAction:[CCBlink actionWithDuration:1.0 blinks:5]];   

     } 
    } 
} 

//this is the collision for coins which only work at times 
    for (CCSprite *coin2 in _coin) { 

     if (!coin2.visible) continue; 

     if (CGRectIntersectsRect(ship.boundingBox, coin2.boundingBox)) { 
      NSLog(@"Coin collected"); 
      coin2.visible = NO; 
     } 

    } 

}

谢谢。

回答

0

手机在最后一段代码是什么?你在那里检查它是否与boundingBox相交硬币,但我无法在其他地方看到它。另一种情况是,只有当你的对象有相同的父对象时,boundingBox才能工作,因为它返回“本地”矩形,并与它的父对象相关

另一个要点是,如果对象的移动速度过快,他们会在嘀嗒声时间内互相抛出对方。我的意思是,一个更新将在碰撞之前被调用,所以它不会检测到它,下一个将在碰撞完成后被调用,所以它也不会检测到它。

+0

喜,对不起这是一个错字。它实际上ship.boundingBox – Grace

0

为什么你只是不检查距离?

float dist = ccpDistance(ship.position, coin2.position); 
float allowedDist = ship.contentSize.width*0.5 + coin2.contentSize.width*0.5; 
if (dist<allowedDist){ 
    NSLog(@"Collision detected"); 
} 

如果你的精灵不在同一个图层上,这些图层应该至少有相同的位置。

+0

嗨,感谢您的答复。我已经试过你的方法,我得到了与usi相同的结果边界框。它可以感知一些与一些硬币的碰撞,但有些不起作用。我在想,问题在于我用来创造硬币的方法。 – Grace

0

我已经通过在init中创建一个计时器解决了我的问题,并每10秒调用一次来创建我的硬币。

我的代码:

-(void) createCoins:(ccTime)delta{ 

CGSize winSize = [CCDirector sharedDirector].winSize; 

int randCoin = [self randomValueBetween:0 andValue:10]; 
_coin = [[CCArray alloc] initWithCapacity:randCoin]; 
for(int i = 0; i < randCoin; i++) { 
    coin = [CCSprite spriteWithFile:@"coin30p.png"]; 
    coin.visible = NO; 
    [self addChild:coin]; 
    [_coin addObject:coin]; 
} 
float randCoinX = [self randomValueBetween:winSize.width/5 andValue:winSize.width - (border.contentSize.width *2)]; 
float randCoinY = [self randomValueBetween:100 andValue:700]; 
float randCoinPlace = [self randomValueBetween:30 andValue:60]; 
for (int i = 0; i < _coin.count; i++) { 
    CCSprite *coin2 = [_coin objectAtIndex:i]; 
    coin2.position = ccp(randCoinX, (winSize.height + randCoinY) + (randCoinPlace *i)); 
    coin2.visible = YES; 

    [coin2 runAction:[CCSequence actions: 
         [CCMoveBy actionWithDuration:8 position:ccp(0, -winSize.height-2000)], 
         [CCCallFuncN actionWithTarget:self selector:@selector(setInvisible:)], 
         nil]]; 
} 

}

的更新方法

for (CCSprite *coins in _coin){ 
    if (!coins.visible) continue; 
    if (CGRectIntersectsRect(phone.boundingBox, coins.boundingBox)) { 
     NSLog(@"Coin collected"); 
     coins.visible = NO; 
    } 

} 

谢谢大家的帮助(: