2014-11-22 11 views
2

У меня возникла проблема со следующим кодом комплекта спрайтов. Я пытаюсь определить, когда летающий мяч сталкивается с линией. Однако ничего не происходит, когда они сталкиваются. Однако, когда мяч попадает на край сцены, следующий распечатывается:swift: столкновения с комплектом спрайтов и битовая маска не обнаружены

контакт 1 bitmask1: 4294967295 bitmask2: 4294967295

Проблема 1: Почему не линейные и шаровые столкновения обнаружения? Проблема 2: Почему обе битовой маски одинаковы при столкновении с краем? Я не могу работать с телами, если не знаю, что есть.

struct PhysicsCategory { 
    static let None  : UInt32 = 0 
    static let All  : UInt32 = UInt32.max 
    static let Ball  : UInt32 = 0b1  // 1 
    static let Line  : UInt32 = 0b10  // 2 
    static let Shape  : UInt32 = 0b100  // 3 or 4? 
} 
override func didMoveToView(view: SKView) { 
    /* Setup your scene here */  
    physicsWorld.contactDelegate = self 

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: view.frame); 
    self.physicsWorld.gravity = CGVectorMake(0.0, 0.0); 

    let ball = SKShapeNode(circleOfRadius: 5) 
    ball.fillColor = UIColor.whiteColor() 
    ball.strokeColor = UIColor.whiteColor() 
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.size.width/2) 
    ball.physicsBody?.velocity = CGVector(dx: 200.0, dy: 200.0) 
    ball.position = CGPoint(x: view.bounds.width/2, y:view.bounds.height/2) 
    ball.physicsBody?.friction = 0.0; 
    ball.physicsBody?.restitution = 1.0; 
    ball.physicsBody?.linearDamping = 0.0; 
    ball.physicsBody?.allowsRotation = false 
    ball.physicsBody?.applyImpulse(CGVector(dx:CGFloat(100), dy:CGFloat(100))); 
    ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball 
    ball.physicsBody?.dynamic = true 
    ball.physicsBody?.contactTestBitMask = PhysicsCategory.Line 
    ball.physicsBody?.collisionBitMask = PhysicsCategory.Line 
    self.addChild(ball) 
} 

переопределение функ touchesMoved (штрихами: NSSet, withEvent событие: UIEvent) { /* Вызывается, когда прикосновение начинается */

touch = touches.anyObject() as UITouch! 

    var linePhysicsBody = SKPhysicsBody() 
    linePhysicsBody.categoryBitMask = PhysicsCategory.Line 
    linePhysicsBody.contactTestBitMask = PhysicsCategory.Ball 
    linePhysicsBody.collisionBitMask = PhysicsCategory.Ball 
    linePhysicsBody.dynamic = false 
    linePhysicsBody.usesPreciseCollisionDetection = true 

    lineNode = SKShapeNode() 
    lineNode.physicsBody = linePhysicsBody 
    lineNode.name = "drawingLine" 
    lineNode.path = linePath 
    lineNode.lineWidth = 5.0 
    lineNode.strokeColor = UIColor.redColor() 
    lineNode.glowWidth = 1.0 

    self.addChild(lineNode) 
} 

func didBeginContact(contact: SKPhysicsContact) { 

    println("contact \(++tempCounter)") 
    println("bitmask1: \(contact.bodyA.categoryBitMask)") 
    println("bitmask2: \(contact.bodyA.categoryBitMask)") 
} 

ответ

1

Для задачи 1:

вашей линии физики тела имеет размер 0. Вам нужно создать хотя бы небольшой прямоугольник, представляющий линию. Otherwize нет столкновения.

Для задачи 2:

func didBeginContact(contact: SKPhysicsContact) { 

    println("contact \(++tempCounter)") 
    println("bitmask1: \(contact.bodyA.categoryBitMask)") 
    println("bitmask2: \(contact.bodyA.categoryBitMask)") 
} 

Там опечатка. Вы должны использовать bodyB для bitmask2

+0

сейчас я чувствую себя глупо ... Спасибо большое! – user3673836

+0

Нет проблем. Это происходит с каждым разработчиком ;-) – Stefan

Смежные вопросы