2015-05-22 31 views
1

我想做一個簡單的SpriteKit遊戲。屏幕上有兩個精靈。其中之一是射擊激光槍。當激光穿過屏幕時,應該錯過。 子彈和精靈不相互接觸,但接觸檢測功能呼叫。我不知道是怎麼回事?我使用SkAction func從上層精靈射擊。所有的精靈和激光槍都有不同的UInt32分類掩碼值。爲什麼sprites彼此接觸,雖然他們不碰撞?

感謝您的幫助。

var sprite = SKSpriteNode(imageNamed: "Spaceship") 
var sprite02 = SKSpriteNode(imageNamed: "Spaceship") 
var actionMove = SkAction.scaleYTo(12, duration: 0.5) 


    sprite.position = CGPoint(x: self.frame.width/2, y: self.frame.height * 3/4) 
    sprite.yScale = 0.2 
    sprite.xScale = 0.2 

    sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size) 
    sprite.physicsBody!.dynamic = true 
    sprite.physicsBody!.affectedByGravity = false 
    sprite.physicsBody!.categoryBitMask = BodyType.ship02.rawValue 
    sprite.physicsBody!.contactTestBitMask = BodyType.laser.rawValue 
    sprite.physicsBody!.collisionBitMask = 0 

    self.addChild(sprite) 

    sprite02.position = CGPoint(x: self.frame.width/2, y: self.frame.height * 1/4) 
    sprite02.yScale = 0.2 
    sprite02.xScale = 0.2 

    sprite02.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size) 
    sprite02.physicsBody!.dynamic = true 
    sprite02.physicsBody!.affectedByGravity = false 
    sprite02.physicsBody!.categoryBitMask = BodyType.ship01.rawValue 
    sprite02.physicsBody!.contactTestBitMask = BodyType.laser.rawValue 
    sprite02.physicsBody!.collisionBitMask = 0 

    self.addChild(sprite02) 

我正在檢查像這樣的接觸檢測。

func didBeginContact(contact: SKPhysicsContact) { 

    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    println(contactMask) 
} 

    // Laser gun properties 
    func laserNode(positionNode: CGPoint, rotationNode: CGFloat, name: String) -> SKSpriteNode { 

    var laser = SKSpriteNode() 


    laser.color = UIColor.greenColor() 
    laser.position = positionNode 
    laser.anchorPoint = CGPoint(x: 0.0, y: 0.0) 
    laser.size = CGSize(width: 3, height: 50) 
    laser.zPosition = -1 
    laser.zRotation = rotationNode 
    laser.name = name 

    laser.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: laser.size.width * 2, height: laser.size.height*2)) 
    laser.physicsBody!.dynamic = true 
    laser.physicsBody!.affectedByGravity = false 
    laser.physicsBody!.categoryBitMask = BodyType.laser.rawValue 
    laser.physicsBody!.contactTestBitMask = BodyType.ship01.rawValue | BodyType.ship02.rawValue | BodyType.ship03.rawValue | BodyType.ship04.rawValue 
    laser.physicsBody!.collisionBitMask = 0 


    laser.runAction(actionMove) 
    laserArray.append(laser) 


    self.addChild(laser) 

    return laser 
} 

回答

1

所以我有完全相同的問題。我不完全知道確切的問題是什麼,但我通過將精靈的hitbox更改爲圓形而不是矩形來修復它。 嘗試改變你對精靈物理體的聲明來代替。

sprite.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size) 

sprite02.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size) 

laser.physicsBody = SKPhysicsBody(circleOfRadius: CGSize(width: laser.size.width * 2, height: laser.size.height*2)) 

我認爲問題在於如何將矩形的hitbox放置在精靈周圍,但如果將其更改爲圓形,它應該可以工作。

+0

我嘗試這個但不工作。存在一些問題。感謝您的評論。 –

+2

在你的'didMoveToView()'函數中打開'view.showsPhysics = true'來查看你的物理邊界存在的位置 –

+0

我的猜測是你的界限是錯誤的,而不是你計算檢測的方式 –

相關問題