我正在尋找在我的spriteKit遊戲中爲我的英雄收集物品的最佳方式,並嘗試了幾種方法來做到這一點,我的結論是最好的方法是有物理項目身體可以檢測到碰撞,但不會與我的英雄相撞。可以做到嗎?停用物理碰撞而不停用其檢測碰撞的能力?聽起來有點矛盾,我知道......因爲,另一種方法是隻創建一個沒有物理體的SKSpriteNode,那麼就不會有碰撞,但是「檢測」碰撞的方式是手工製造的,而且更加困難,因爲我需要在我的英雄中設置一個座標系檢測,當他將在這些特定座標中(在物品上)時,我會使物品消失。任何想法如何做到這兩種方式更容易?是否可以在spriteKit中停用物理體中的碰撞?
回答
檢出collisionBitMask,categoryBitMask和contactTestBitMask在SKPhysicsBody
類。
本質上,具有相同collisionBitMask
值的物理實體將相互「傳遞」。
- 更正:如果該類別和碰撞位比賽,他們會相互影響。如果他們做不匹配,那兩個會不是相互作用。如果碰撞位,和類別位,是都零,當然該項目將兩手空空互動。
然後,設置categoryBitMask
和contactTestBitMask
價值創造上的接觸的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;
}
這個答案需要更好的說明,這個例子中的兩個對象之所以會相互傳遞,是因爲'collisionBitMask = 0'意思是「不要碰撞任何東西」。如果出於某種原因,您希望2個相同類型的對象與所有對象相互碰撞,請確保collisionBitMask不包含用於categoryBitMask的標誌 – Knight0fDragon
你可以通過設置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的呼叫,在那裏你可以刪除你的物品節點,添加健康等。
希望這有助於!
簡短的回答:
yourHero.physicsBody.collisionBitMask = 0;
的collisionBitMask
的默認值是0xFFFFFFFF(設置所有位),這就是爲什麼該節點與其他
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;
- 1. 碰撞在iOS7中正常SpriteKit物理
- 2. 物理體碰撞檢測
- 3. SpriteKit中的「碰撞映射」
- 4. Phaser P2 body.collideWorldBounds停止物體碰撞
- 5. 無物理碰撞
- 6. 我可以讓物理體碰撞而不會互相推?
- 7. 忽略Box2d中的物體碰撞(iphone)
- 8. 3種不同的碰撞體? Swift3 + Spritekit
- 9. SpriteKit碰撞檢測
- 10. 處理 - 如何在碰撞後移除陣列中的物體
- 11. 物體碰撞系統?
- 12. LUA碰撞,多個物體
- 13. 與角度物體碰撞
- 14. 與兩個物體碰撞
- 15. 與多個物體碰撞
- 16. 我可以在SpriteKit中減慢或停止物理嗎?
- 17. SpriteKIt - 動態物體與牆壁碰撞並走槽
- 18. 執行SpriteKit物理碰撞/接觸觸摸結束
- 19. SpriteKit中的精靈之間的碰撞
- 20. 矩形物理和碰撞
- 21. Box2D物理碰撞情景
- 22. Phaser - 街機碰撞物理
- 23. 的XCode Spritekit,碰撞與PNG
- 24. 如何在Unity中以高速碰撞物體
- 25. 兩個物體不會在Farseer物理碰撞3.3.2
- 26. SpriteKit遊戲中的對象iOS 7.1更新後停止碰撞
- 27. Andengine碰撞 - 檢測碰撞和刪除物體時的例外
- 28. 物理引擎 - 確定碰撞後物體的速度
- 29. 在Xcode中縮放物理實體Spritekit
- 30. 統一:球員死在物體碰撞
那是什麼是 – santhu
類別位掩碼,如果你沒有看過他們,頁轉到頁**精靈套件PG 96 **閱讀。「碰撞和聯絡的例子:火箭在太空」 – santhu
這是令人難以置信的愚蠢但蘋果似乎並沒有放入任何東西來簡單地禁用physicsBody上的物理。這意味着,所有遊戲開發的基本技巧,使用你克隆的「模型」,都無法在iOS中完成。尼斯。 – Fattie