У меня есть 4 физических тела, которые хорошо обнаруживают столкновения. Однако есть два физических тела, которые не будут обнаруживать, когда они сталкиваются друг с другом. Однако они обнаруживают, когда сталкиваются с другими физическими телами. У меня есть контактные маски для всех, поэтому я не понимаю, почему возникает проблема. Вот код: Вот где я насторить физик тела:столкновение физики spritekit не обнаружено
struct PhysicsCategory{
static let None : UInt32 = 0
static let All : UInt32 = UInt32.max
static let player : UInt32 = 0b1
static let bounce : UInt32 = 0b10
static let blueball : UInt32 = 0b100
static let redball : UInt32 = 0b1000
static let coin : UInt32 = 0b10000
}
Вот код, где я использовал для создания тела физики игрока, который является одной из проблем физико тел:
player.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: player.size.width-40, height: player.size.height-40))
player.physicsBody?.isDynamic = true
player.physicsBody?.categoryBitMask = PhysicsCategory.player
player.physicsBody?.contactTestBitMask = PhysicsCategory.blueball
player.physicsBody?.contactTestBitMask = PhysicsCategory.redball
player.physicsBody?.collisionBitMask = PhysicsCategory.None
Вот FUNC для обнаружения столкновений:
func didBegin(_ contact: SKPhysicsContact) {
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if ((firstBody.categoryBitMask & PhysicsCategory.player != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.redball != 0)) {
RedballDidCollideWithPlayer(player: firstBody.node as! SKSpriteNode, redball: secondBody.node as! SKSpriteNode)
}
if ((firstBody.categoryBitMask & PhysicsCategory.player != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.blueball != 0)) {
BlueballDidCollideWithPlayer(player: firstBody.node as! SKSpriteNode, blueball: secondBody.node as! SKSpriteNode)
}
if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.redball != 0)){
RedballDidCollideWithBounce(bounce: firstBody.node as! SKSpriteNode, redball: secondBody.node as! SKSpriteNode)
}
if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.blueball != 0)) {
BlueballDidCollideWithBounce(bounce: firstBody.node as! SKSpriteNode, blueball: secondBody.node as! SKSpriteNode)
}
if ((firstBody.categoryBitMask & PhysicsCategory.bounce != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.coin != 0)) {
coinDidCollideWithplayer(player: firstBody.node as! SKSpriteNode, coin: secondBody.node as! SKSpriteNode)
}
if ((firstBody.categoryBitMask & PhysicsCategory.player != 0) &&
(secondBody.categoryBitMask & PhysicsCategory.coin != 0)) {
coinDidCollideWithplayer(player: firstBody.node as! SKSpriteNode, coin: secondBody.node as! SKSpriteNode)
}
}
Вот код, который я использовал для настройки blueball. Это другой физический корпус, имеющий проблемы:
let blueball = SKSpriteNode(imageNamed: "blueball")
blueball.position = enemyb.position
blueball.physicsBody = SKPhysicsBody(circleOfRadius: blueball.size.width/2)
blueball.physicsBody?.isDynamic = true
blueball.physicsBody?.categoryBitMask = PhysicsCategory.blueball
blueball.physicsBody?.contactTestBitMask = PhysicsCategory.player
blueball.physicsBody?.contactTestBitMask = PhysicsCategory.bounce
blueball.physicsBody?.collisionBitMask = PhysicsCategory.None
blueball.physicsBody?.usesPreciseCollisionDetection = true
addChild(blueball)
let actionMove = SKAction.move(to: player.position, duration: 2)
Любые идеи здесь были бы полезны. Я пытался найти проблему в течение нескольких дней без везения.
комментарий эту строку кода и попробовать еще раз, 'player.physicsBody .isDynamic = true' – Mina
@Mina сделал это. Ничего не меняет. –
прокомментируйте это как для узлов, игроков, так и для синего, я думаю, проблема связана с isDynamic свойством. – Mina