2014-01-21 95 views
10

我正在尋找在我的spriteKit遊戲中爲我的英雄收集物品的最佳方式,並嘗試了幾種方法來做到這一點,我的結論是最好的方法是有物理項目身體可以檢測到碰撞,但不會與我的英雄相撞。可以做到嗎?停用物理碰撞而不停用其檢測碰撞的能力?聽起來有點矛盾,我知道......因爲,另一種方法是隻創建一個沒有物理體的SKSpriteNode,那麼就不會有碰撞,但是「檢測」碰撞的方式是手工製造的,而且更加困難,因爲我需要在我的英雄中設置一個座標系檢測,當他將在這些特定座標中(在物品上)時,我會使物品消失。任何想法如何做到這兩種方式更容易?是否可以在spriteKit中停用物理體中的碰撞?

+0

那是什麼是 – santhu

+0

類別位掩碼,如果你沒有看過他們,頁轉到頁**精靈套件PG 96 **閱讀。「碰撞和聯絡的例子:火箭在太空」 – santhu

+0

這是令人難以置信的愚蠢但蘋果似乎並沒有放入任何東西來簡單地禁用physicsBody上的物理。這意味着,所有遊戲開發的基本技巧,使用你克隆的「模型」,都無法在iOS中完成。尼斯。 – Fattie

回答

16

檢出collisionBitMask,categoryBitMaskcontactTestBitMaskSKPhysicsBody類。

本質上,具有相同collisionBitMask值的物理實體將相互「傳遞」。

  • 更正:如果該類別和碰撞位比賽,他們會相互影響。如果他們做不匹配,那兩個會不是相互作用。如果碰撞位,和類別位,是,當然該項目將兩手空空互動。

然後,設置categoryBitMaskcontactTestBitMask價值創造上的接觸的SKPhysicsContact對象。最後,你的班級應該採用SKPhysicsContactDelegate協議。使用- didBeginContact:方法來檢測並處理對象SKPhysicsContact

static const uint8_t heroCategory = 1; 
static const uint8_t foodCategory = 2; 
-- 
food.physicsBody.categoryBitMask = foodCategory; 
food.physicsBody.contactTestBitMask = heroCategory; 
food.physicsBody.collisionBitMask = 0; 
-- 
hero.physicsBody.categoryBitMask = heroCategory; 
hero.physicsBody.contactTestBitMask = foodCategory; 
hero.physicsBody.collisionBitMask = 0; 
-- 
-(void)didBeginContact:(SKPhysicsContact *)contact { 
    SKPhysicsBody *firstBody = contact.bodyA; 
    SKPhysicsBody *secondBody = contact.bodyB; 
} 
+0

這個答案需要更好的說明,這個例子中的兩個對象之所以會相互傳遞,是因爲'collisionBitMask = 0'意思是「不要碰撞任何東西」。如果出於某種原因,您希望2個相同類型的對象與所有對象相互碰撞,請確保collisionBitMask不包含用於categoryBitMask的標誌 – Knight0fDragon

3

你可以通過設置categoryBitMask和玩家的contactBitMasks和項目的對象,但要確保你不設置collisionBitMask爲要麼彼此交互做到這一點(見下文)

static const int playerCategory = 1; 
static const int worldCategory = 2; 
static const int objectCategory = 4;  

.... 

SKSpriteNode *player, *item; 

.... 

player.physicsBody.categoryBitMask = playerCategory; 
player.physicsBody.collisionBitMask = worldCategory; 
player.physicsBody.contactTestBitMask = worldCategory; 

.... 

item.physicsBody.categoryBitMask = objectCategory; 
item.physicsBody.contactTestBitMask = playerCategory | worldCategory; 
item.physicsBody.collisionBitMask = worldCategory; 

通過這種方式,物理機構將獲取玩家與世界物體,物品和世界物體之間的碰撞,但不會在玩家與物品之間發生碰撞。它會觸發didBeginContact的呼叫,在那裏你可以刪除你的物品節點,添加健康等。

希望這有助於!

8

簡短的回答:

yourHero.physicsBody.collisionBitMask = 0; 

collisionBitMask的默認值是0xFFFFFFFF(設置所有位),這就是爲什麼該節點與其他

3

contactTestBitMask用於觸發didBeginContact碰撞。 collisionBitMask用於激活節點上的物理。

// add a physics body 
ship.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ship.size.width/2]; 

// set the category for ship 
ship.physicsBody.categoryBitMask = shipCategory; 

// detect collisions with asteroids and edges 
ship.physicsBody.contactTestBitMask = asteroidCategory | edgeCategory; 

// physically collide with asteroids 
ship.physicsBody.collisionBitMask = asteroidCategory;