2014-08-30 71 views
1

我有一個玩家在我的遊戲中,它有兩個狀態飛行,下降。他們每個人都有一個形象:player_flying,player_falling相應。我也在用身體來檢測碰撞。當我使用一種紋理時,它完全正常運作。但是當我試圖在不同的條件下使用不同的紋理時,它會在日誌中顯示我的錯誤。我想會這樣:SpriteKit PhysicsBody:無法創建物理實體

if (self.player.physicsBody.velocity.dy > 30) { 
    self.player.texture = [SKTexture textureWithImageNamed:@"player_flying"]; 
    self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture 
                 size:self.player.size];   
} 
else 
{ 
    self.player.texture = [SKTexture textureWithImageNamed:@"player_falling"]; 
    self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture 
                 size:self.player.size]; 
} 

的錯誤是:

2014年8月30日12:55:47.515 kalabaska [1569:50535] PhysicsBody:無法創建物理體。

+0

檢查兩個圖像是否已經加載,即self.player.texture不能是零 – LearnCocos2D 2014-08-30 07:47:14

+0

它不是零,事實上它甚至改變遊戲中的紋理,但不會改變物理體,並且它看起來是靜態的在屏幕上的圖像。 – 2014-08-30 08:28:12

+0

上述代碼是否在更新方法中實現? – 0x141E 2014-08-31 06:17:22

回答

2

感謝0x141E,我發現我的質地有它周圍的一些白色的狗屎,我已經刪除了它之後,一切都開始工作。現在我想知道如何隱藏表示我的物體的紋理。

1

您不應該以更新速率更改播放器的紋理和物理體(每秒最多60次)。只有在需要時才應更改它們。下面是如何做到這一點的例子:

if (self.player.physicsBody.velocity.dy > 30) { 
    // Change texture/body only if not already flying 
    if (!isFlying) { 
     self.player.texture = [SKTexture textureWithImageNamed:@"player_flying"]; 
     self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture 
                 size:self.player.size]; 
     isFlying = YES; 
    }  
} 
else 
{ 
    // Change texture/body only if not already falling 
    if (isFlying) { 
     self.player.texture = [SKTexture textureWithImageNamed:@"player_falling"]; 
     self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture 
                 size:self.player.size]; 
     isFlying = NO; 
    } 
} 
+0

仍然不起作用(同樣的錯誤 – 2014-09-01 03:48:14

+0

也許你的圖像太複雜,無法用來創建一個physicsBody,你可以使用一個基於CGPath的物理體嗎? – 0x141E 2014-09-01 04:34:22

+0

有沒有辦法讓它變得簡單?創建CGPath是通過強制紋理的點? – 2014-09-01 05:30:53