没有检测到碰撞

时间:2017-08-21 14:52:40

标签: swift sprite-kit

我在SpriteKit Game中检测到碰撞时遇到了一些困难。我只想检测导弹与敌人和船只之间的碰撞。

我有ColliderType:

struct ColliderType {
static let Boat: UInt32 = 1
static let Enemy: UInt32 = 2
static let Wall: UInt32 = 3
static let Bullet: UInt32 = 4

}

class GameplayScene: SKScene, SKPhysicsContactDelegate {

var player = SKSpriteNode()
var enemy = SKSpriteNode()
var boat = SKSpriteNode()
var missile = SKSpriteNode()

didBegin联系人:

func didBegin(_ contact: SKPhysicsContact) {

    var firstBody = SKPhysicsBody()
    var secondBody = SKPhysicsBody()

    if contact.bodyA.node?.name == "Missile" {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if firstBody.node?.name == "Missile" && secondBody.node?.name == 
"Enemy" {
        incrementScore()
        secondBody.node?.removeFromParent()
    } else if firstBody.node?.name == "Missile" && 
secondBody.node?.name == "Boat" {
        incrementScore()
    }

}
  • 我添加了" physicsWorld.contactDelegate = self"在didMove toview

我还在所有相关的spritenodes中添加了物理实体:

func fireMissile() {
    let missile = SKSpriteNode(color: .yellow, size: CGSize(width: 20, 
    height: 5))
    missile.name = "Missile"
    missile.position = CGPoint(x: player.position.x + 28, y: 
    player.position.y + 10)
    missile.zPosition = 2
    missile.physicsBody = SKPhysicsBody(rectangleOf: missile.size)
    missile.physicsBody?.isDynamic = false
    missile.physicsBody?.categoryBitMask = ColliderType.Bullet
    missile.physicsBody?.collisionBitMask = ColliderType.Enemy | 
    ColliderType.Boat
    missile.physicsBody?.contactTestBitMask = ColliderType.Enemy | 
    ColliderType.Boat


    self.addChild(missile)

}


func createEnemies() {
    let enemy = SKSpriteNode(imageNamed: "Enemy1")
    enemy.name = "Enemy"
    enemy.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.height 
/ 2)
    enemy.physicsBody?.categoryBitMask = ColliderType.Enemy
    enemy.physicsBody?.affectedByGravity = false
    enemy.physicsBody?.isDynamic = false
    enemy.zPosition = 3

    enemy.position.y = self.frame.height + 100
    enemy.position.x = CGFloat.randomBetweenNumbers(firstNum: -347.5, 
    secondNum: -85)


    self.addChild(enemy)

}


func createBoat() {
    let boat = SKSpriteNode(imageNamed: "Boat")
    boat.name = "Boat"
    boat.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    boat.physicsBody = SKPhysicsBody(circleOfRadius: boat.size.height / 
    2)
    boat.physicsBody?.categoryBitMask = ColliderType.Boat
    boat.physicsBody?.affectedByGravity = false
    boat.physicsBody?.isDynamic = false
    boat.zPosition = 3

    boat.position.y = self.frame.height + 100
    boat.position.x = CGFloat.randomBetweenNumbers(firstNum: 0, 
    secondNum: 0)


    self.addChild(boat)


}

1 个答案:

答案 0 :(得分:3)

首先,你的一些类别是错误的:

static let Wall: UInt32 = 3
static let Bullet: UInt32 = 4

这有效地将Wall定义为BoatEnemy。将它们更改为:

static let Wall: UInt32 = 4
static let Bullet: UInt32 = 8

(类别应始终是2 - 1,2,4,8,1等的唯一权力)。

其余的看起来没问题,所以请尝试一下,让我们知道它是否有效。

编辑:

好的 - 只是注意到你的所有物理实体都将其isDynamic属性设置为false - 这意味着除了其他之外,主体不会触发联系人。因此,如果你想让导弹与敌人或船只产生接触,那么导弹应该是动态的,或者敌人和船只应该是动态的(接触中涉及的2个物体中只有1个需要动态)。