2016-08-22 21 views
0

に新しいiPhoneを実行すると、これは「didBeginContact」方式でのコードの場合:迅速なエラーシミュレータ

 if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask 
    { 

     if contact.bodyA.node!.name == "0" && contact.bodyB.node!.name == "1000003"{ 

      contact.bodyB.node!.removeFromParent() 
     } 
     if contact.bodyA.node!.name == "0" && contact.bodyB.node!.name == "1000004"{ 

      contact.bodyB.node!.removeFromParent() 
     } 

    } 

    else 

    { 
     if contact.bodyB.node!.name == "0" && contact.bodyA.node!.name == "1000003"{ 

      contact.bodyA.node!.removeFromParent() 
     } 
     if contact.bodyB.node!.name == "0" && contact.bodyA.node!.name == "1000004"{ 

      contact.bodyA.node!.removeFromParent() 
     } 
    } 

それは「iPhone 4S」と「iPhone 5」のシミュレーションで動作し、上位バージョンで失敗このエラーメッセージで:

0123:

が、これは、それが赤いマークラインである「致命的なエラーが (lldb)任意の値をアンラップしながら、予想外にゼロを見つけました」

知っていい: 名「1000004」を持つオブジェクトは、私が「GameScene」クラスで作成しSKSpriteNodeです:このオブジェクトのlet TestPixel = SKSpriteNode(imageNamed: "6")

プロパティは、「touchesBegan」方法です。

  TestPixel.name = "1000004" 
      TestPixel.anchorPoint = CGPointMake(0.5, 0.5) 
      TestPixel.userInteractionEnabled = false 
      TestPixel.zPosition = 1000003 
      TestPixel.size = CGSizeMake(1, 1) 
      TestPixel.position = CGPointMake(positionInScene.x, positionInScene.y) 
      TestPixel.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "6"), size: TestPixel.size) 
      TestPixel.physicsBody?.categoryBitMask = ClickOnCategory 
      TestPixel.physicsBody?.contactTestBitMask = BuildingsCategory 
      TestPixel.physicsBody?.affectedByGravity = false 
      TestPixel.physicsBody?.dynamic = true 
      TestPixel.physicsBody?.collisionBitMask = 0 
      addChild(TestPixel) 

エラーこのSpriteNode(名称:「1000004」)は場合に発生する:私は「didMoveToView」方法で作成した別のSpriteNodeを打つ、ここでのコードは次のとおりです。

func addBG(){ 

     let background = SKSpriteNode(imageNamed: "0") 
     background.name = "0" 
     background.anchorPoint = CGPointMake(0.5, 0.5) 
     background.zPosition = 1 
     background.position = CGPointMake(CGRectGetMinX(self.frame)+self.frame.width/4,CGRectGetMaxY(self.frame)-self.frame.height/4) 
     background.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "0"), size: background.size) 
     background.physicsBody?.categoryBitMask = BuildingsCategory 
     background.physicsBody?.affectedByGravity = false 
     background.physicsBody?.dynamic = true 
     background.physicsBody?.collisionBitMask = 0 
     self.addChild(background) 

    } 

    addBG() 
ここ はそのためのコードです

と "didMoveToView" もある中:

physicsWorld.contactDelegate = self 

categoryBitMask "GameScene" クラスは、次のように設定されている中3210

class GameScene: SKScene, SKPhysicsContactDelegate{ 

let BuildingsCategory : UInt32 = 0x1 << 1 
let ClickOnCategory : UInt32 = 0x1 << 2 

私はそれが「iPhone 4S」& &「iPhone 5」とシミュレータで動作言ったように、[OK]そうではなく、より高いバージョンでは...任意のアイデアなぜですか? おかげ

答えて

1

はい、私はあなたを伝えることができる理由:

if contact.bodyA.node!.name == "0" && contact.bodyB.node!.name == "1000003"{ 
    contact.bodyB.node!.removeFromParent() <----PROBLEM 
} 
if contact.bodyA.node!.name == "0" && contact.bodyB.node!.name == "1000004"{ 
    contact.bodyB.node!.removeFromParent() 
} 

何を、あなたは親からの削除を行いますif文あなたの第一に、ヒットしているされて起こっている、あなたは後に再度アクセスしようとしています。親からノードを削除した場合、ノードをメモリ内に維持していますか?おそらく何もないので、最初の行ではノードを除外します。あなたのコードは、別のif条件に続いていて、今ではnilをアンラップしようとしています。これは、ifの代わりにELSE IFを使用する場所です。

スプライトキットで行うことを強くお勧めします。コンタクトフェーズでノードを削除しないでください。複数の連絡先が発生している可能性があります。これらの連絡先をすべて処理する必要がある場合もありますので、ノードを有効にしておくことをお勧めします。

代わりに、ノードを削除したいときはいつでも、それらをキュー(配列またはセット)に配置し、didFinishUpdateメソッドでキューをループしてすべてのノードを削除します。

もう1つのトリックですが、カテゴリBitMaskにビット31を予約して、スプライトが生きているか死んでいるかを判断してからdidContactメソッドでガードを配置します。

E.G.

func didBeginContact(contact: SKPhysicsContact!) 
{ 
    guard let bodies = (a:contact.bodyA,b:contact.bodyB) where a.categoryBitMask < 1 << 31 && b.categoryBitMask < 1 << 31 
    else 
    { 
     return 
    } 
    // do other work here 
} 

セフト3。0

func didBeginContact(contact: SKPhysicsContact!) 
{ 
    guard let bodies = (a:contact.bodyA,b:contact.bodyB, a.categoryBitMask < 1 << 31 && b.categoryBitMask < 1 << 31 
    else 
    { 
     return 
    } 
    // do other work here 
} 
+0

ありがとうございました!うん、 "else if" ..それも心に浮かんだけど、なぜ私はそれを試していないのか分からない。あなたのやり方を試し、didBeginContactメソッドのノードを削除しないでください。私はまだiPhoneのバージョンが低ければ問題なく動作するのだろうかと疑問に思っています。 – frankibanki

+0

コリジョンボディのオーダーは厳しくないので、下のバージョンでは、 – Knight0fDragon