2017-08-21 18 views
0

SpriteKitゲームで衝突を検出するのが難しくなりました。私はミサイルと敵とボートの衝突を検出したいだけです。衝突を検出していません

は私が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接触:私は

toview didMoveで "physicsWorld.contactDelegate =自己" を追加した

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() 
    } 

} 
  • 私はまた、関連するすべてのスプライトノードに物理学を追加しました:

    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) 
    
    
    } 
    

答えて

3

はまず、自分のカテゴリの一部が間違っている:

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

これは効果的BoatEnemyの両方であるとしてWall定義します。それらは次のように変更してください:

(カテゴリは常に2〜1,2,4,8,16などの一意の冪でなければなりません)。

残りはOKですので、それを試して、動作しているかどうかお知らせください。

は編集:

OK - これは、とりわけ、体が接触を誘発しないだろう、ということを意味します - ちょうどあなたの物理学の体のすべてが彼らのisDynamicプロパティがfalseに設定されていることに気づきました。だからミサイルに敵やボートのいずれかとの接触を生成させたい場合は、ミサイルを動的にするか、敵とボートの両方が動的でなければなりません(連絡先に含まれる2つのオブジェクトのうち1つだけが動的にする必要があります)。

+0

私は、ビットマスクがSprite-Kitでどのように動作するかについて、ドキュメンテーションサイトに長いポストを持っていますが、文書がすぐに削除されるため、リンクを投稿できません。 –

+0

私はそれを変更しましたが、それでも動作しません。私は他のすべてのカテゴリでも衝突を検出しようとしましたが、どちらも動作しません:/ – Flinigan

+0

OK - あなたの物理体のすべてが 'isDynamic'プロパティをfalseに設定していることに気がつきました.-これは、身体は接触を誘発しません。 「ミサイル」に「敵」または「ボート」のいずれかとの接触を生成させたい場合は、ミサイル攻撃またはダイナミック攻撃、または両方の敵とボートが必要です(連絡先に関与する2つのオブジェクトのうち1つだけが動的にする必要があります) .. –

関連する問題