2014-06-28 100 views
0

你好開發夥伴,雪碧套件忽略有時聯繫

我是新來的雪碧套件,剛開始實施物理到我的遊戲。我只有兩個需要接觸的精靈。一個是主角,一個是蝴蝶「螢火蟲」,另一個是能量球,在接觸時給予主角健康。

但是我的遊戲中發生了一些奇怪的事情,儘管我實現了我所有的物理線路工作,有時候,在某些我不明白的條件下,能量球會穿過主角並忽略聯繫人和聯繫人實施的效果應該發生。然後,我必須積極尋找能量球,以便它發生,並嘗試觸摸它不同的時間才能成功。

我希望接觸總是會發生,不管能量是否偶然碰到我,或者我主動尋找它。當這兩個精靈以任何方式接觸時都應該發生接觸。我試了一切,最後決定尋求幫助。

這裏是我的委託:

@interface CloudScene() <SKPhysicsContactDelegate> 

請注意,我在固定的問題,希望增加這些屬性,但問題是在他們之前:

@property(assign, nonatomic) uint32_t contactTestBitMask; 
@property(nonatomic) BOOL usesPreciseCollisionDetection; 

static const uint32_t bflyCategory = 0x1 << 0; 
static const uint32_t energyCategory = 0x1 << 1; 

initWithSize方法:

self.physicsWorld.gravity = CGVectorMake(0, 0); 
self.physicsWorld.contactDelegate = self; 

兩者的物理(通知碰撞被設置爲0之前和問題仍然存在,我只增加他們在希望的彈跳效果至少會不會讓球筆直地穿過bfly字符,但沒有工作):

_bfly.name = @"bflyNode"; 
    _bfly.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_bfly.frame.size]; 
    _bfly.physicsBody.categoryBitMask = bflyCategory; 
    _bfly.physicsBody.contactTestBitMask = energyCategory; 
    _bfly.physicsBody.collisionBitMask = bflyCategory | energyCategory; 
    _bfly.physicsBody.usesPreciseCollisionDetection = YES; 
    _bfly.physicsBody.dynamic = YES; 
    _bfly.physicsBody.affectedByGravity = NO; 
    _bfly.physicsBody.mass = 1; 


energyball.name = @"energyballNode"; 
energyball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:energyball.frame.size]; 
energyball.physicsBody.categoryBitMask = energyCategory; 
energyball.physicsBody.contactTestBitMask = bflyCategory; 
energyball.physicsBody.collisionBitMask = energyCategory | bflyCategory; 
energyball.physicsBody.usesPreciseCollisionDetection = YES; 
energyball.physicsBody.dynamic = YES; 
energyball.physicsBody.affectedByGravity = NO; 
energyball.physicsBody.mass = 1; 

最後這裏是我的didBeginContact方法:提前

-(void)didBeginContact:(SKPhysicsContact *)contact{ 

SKPhysicsBody *bfly; 
SKPhysicsBody *energyball; 

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    bfly = contact.bodyA; 
    energyball = contact.bodyB; 
} 
else 
{ 
    bfly = contact.bodyB; 
    energyball = contact.bodyA; 
} 

if ((bfly.categoryBitMask & bflyCategory) != 0) 
{ 

    SKNode * energyball = (contact.bodyA.categoryBitMask & bflyCategory) ? contact.bodyB.node : contact.bodyA.node; 
    SKAction*energySound = [SKAction playSoundFileNamed:@"Energybell.m4a" waitForCompletion:NO]; 
    [energyball runAction:energySound]; 
    energyball.hidden = YES; 
    [self addChild:[self FenergyNode:@"energy"]]; 
    [self adjustScoreBy:2]; 
    [scoreLabel setText: [NSString stringWithFormat:@"Score: %d", [GameState sharedInstance].score]]; 
    _bflyHP =MAX(0, _bflyHP+100); 
    [energyball runAction:[SKAction removeFromParent]]; 


} 

} 

謝謝!

回答

0

我想你搬起石頭砸自己的腳這一行:

SKNode * energyball = (contact.bodyA.categoryBitMask & bflyCategory) ? 
              contact.bodyB.node : contact.bodyA.node; 

如果我正確理解你的代碼,能量球categoryBitMask永遠不會設置爲bflyCategory。因此你總是選擇bodyA的節點。由於A和B可以隨時改變,依靠energyBall總是身體A在某個時刻很容易失敗。

此外,您之前已選擇SKPhysicsBody* energyBall,您應該使用它。這也應該帶來一個編譯器警告,如「x shadows局部變量y」,因爲它們使用相同的標識符(變量名)。

嘗試更換上面的行:

SKNode* ball = energyball.node; 

和變化的SKNode* energyball任何用來ball

0

即使修復代碼後問題仍然存在。但我現在更深入地研究它,並可以解釋接觸如何失敗。

看來只有當主角(bfly)離開它時,能量球纔會檢測到接觸。一切都變得完美了。

但是,如果我朝它走,接觸是完全忽略。

就好像能量球正在選擇框架的特定部分,或運動成爲一個有效的球體。

我的目標是讓這兩個精靈接觸,無論我朝着什麼方向前進,或者接觸什麼角度的精靈。

我的猜測是,這個問題可能在於以下幾行代碼:

_bfly.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_bfly.frame.size]; 

energyball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:energyball.frame.size]; 

或許我應該與其他類型的物理機構的實驗嗎?或者問題可能在另一個區域?

不管怎麼說,這是我的新代碼:

@interface CloudScene() <SKPhysicsContactDelegate> 

@property(assign, nonatomic) uint32_t contactTestBitMask; 
@property(nonatomic) BOOL usesPreciseCollisionDetection; 

static const uint32_t bflyCategory = 0x1 << 1; 
static const uint32_t energyCategory = 0x1 << 2; 

- (ID)initWithSize: 「...」:

self.physicsWorld.gravity = CGVectorMake(0, 0); 
    self.physicsWorld.contactDelegate = self; 

    _bfly.name = @"bflyNode"; 
    _bfly.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_bfly.frame.size]; 
    _bfly.physicsBody.categoryBitMask = bflyCategory; 
    _bfly.physicsBody.contactTestBitMask = energyCategory; 
    _bfly.physicsBody.collisionBitMask = 0; 
    _bfly.physicsBody.usesPreciseCollisionDetection = YES; 
    _bfly.physicsBody.dynamic = YES; 
    _bfly.physicsBody.affectedByGravity = NO; 

energyball.name = @"energyballNode"; 
energyball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:energyball.frame.size]; 
energyball.physicsBody.categoryBitMask = energyCategory; 
energyball.physicsBody.contactTestBitMask = bflyCategory; 
energyball.physicsBody.collisionBitMask = 0; 
energyball.physicsBody.usesPreciseCollisionDetection = YES; 
energyball.physicsBody.dynamic = YES; 
energyball.physicsBody.affectedByGravity = NO; 

,最後我的新didBeginContact方法:

-(void)didBeginContact:(SKPhysicsContact *)contact{ 

SKPhysicsBody *bfly; 
SKPhysicsBody *energyball; 

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    bfly = contact.bodyA; 
    energyball = contact.bodyB; 
} 
else 
{ 
    bfly = contact.bodyB; 
    energyball = contact.bodyA; 
} 



if ((bfly.categoryBitMask & bflyCategory) != 0 && 
    (energyball.categoryBitMask & energyCategory) != 0) 
{ 
    //EDITED HERE 

SKNode* ball = energyball.node; 
SKAction*energySound = [SKAction playSoundFileNamed:@"Energybell.m4a" waitForCompletion:NO]; 
[ball runAction:energySound]; 
[self addChild:[self FenergyNode:@"energy"]]; 
[self adjustScoreBy:2]; 
[scoreLabel setText: [NSString stringWithFormat:@"Score: %d", [GameState sharedInstance].score]]; 
_bflyHP =MAX(0, _bflyHP+100); 
[ball runAction:[SKAction removeFromParent]]; 


} 

} 

希望有人可以找到解決這個問題的解決方案,因爲我一直在努力與我的代碼8天withou現在取得任何結果。

我試圖在評論中寫這篇文章,但是這個網站使它們太短,所以我無法解釋我的情況的深度。

再次提前致謝。