0

您好,我正在製作一個cocos2d側滾動器。我試圖測試兩個精靈之間的碰撞。我檢查了一下,我爲這些精靈製作的禮物是他們應該做的,但是它說,無論他們是否真的這樣做,這兩個禮物都會相交。下面是代碼:Cocos2d:測試碰撞,說這兩個精靈總是相交

-(void)checkForRedEnemyCollisions{ 
    CGRect playerRect = CGRectMake(player.position.x -  (player.playerSprite.contentSize.width/2), 
            player.position.y -  (player.playerSprite.contentSize.height/2), 
            player.playerSprite.contentSize.width, 
            player.playerSprite.contentSize.height); 

    CGRect redEnemyRect = CGRectMake(redEnemy.position.x -  (redEnemy.bulletSprite.contentSize.width/2) , 
            redEnemy.position.y -  (redEnemy.bulletSprite.contentSize.height /2), 
            redEnemy.bulletSprite.contentSize.width, 
            redEnemy.bulletSprite.contentSize.height); 
    if (CGRectIntersectsRect(playerRect, redEnemyRect)) { 
     CCLOG(@"collision"); 
    } 
} 

這裏是更多的代碼:

-(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); 
} 
+3

你應該比較player.boundingBox和redEnemy.boundingBox – LearnCocos2D

回答

0

確保您所創建的邊界矩形的世界座標。

嘗試將點轉換爲如下的世界座標;

CGPoint playerWorldPosition = [player ConvertToWorldSpace:player.position]; 
CGRect playerRect = CGRectMake(playerWorldPosition.x - (player.playerSprite.contentSize.width/2), 
           playerWorldPosition.y - (player.playerSprite.contentSize.height/2), 
           player.playerSprite.contentSize.width, 
           player.playerSprite.contentSize.height); 

對redEnemy也做同樣的事情。這將確保您將它們在世界空間中進行比較,而不是在層次結構中的其他空間中進行比較。

如果您在播放器或redEnemies上使用錨點而不是默認值(0.0,0.0)。使用ConvertToWorldSpaceAR函數而不是ConvertToWorldSpace。

+0

你好@Yucel卡拉曼利,它仍然在說有一次碰撞是否存在實際上是否存在碰撞。 – PoKoBros

+0

@PoKoBros如果這不起作用,那麼我不能告訴問題在於給定的代碼信息。從你的代碼我不認爲球員是從CClayer派生。我得出這個結論是因爲你有一個playerSprite是玩家的成員。這讓我認爲playerSprite是一個CCSprite,它是玩家層的孩子。同樣爲redEnemy。如果是這樣的話。你如何在場景中移動你的玩家精靈?你是否在移動玩家位置?或者你在遊戲更新呼叫中移動玩家位置?你可以在你的問題上添加播放器類的實現代碼。 – Nusakan

+0

當然我改變了代碼。新代碼位於底部。我發佈的原始代碼位於GameLoop類中。新代碼位於另一個名爲Player的類中。我以同樣的方式製作了我的redEnemy。 – PoKoBros