2016-05-07 12 views
0

私のXcodeプロジェクトで、私はSKShapeNodeは、私が作成した世界のボーダー(画面の端)に当たったときに呼び出される関数を作成しようとしています。 SKShapeNodeは画面の端に当たって重力のために右に回転しますが、接触が行われるとdidBeginContact関数は呼び出されません。ここに私のコードSpriteKitベースカテゴリビットマスクが機能しないが正しく

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

struct PhysicsCategory { 

    static let redBall: UInt32 = 0x1 << 1 
    static let blueBall: UInt32 = 0x1 << 2 
    static let worldBorder: UInt32 = 0x1 << 3 

} 

let slimeBall = SKSpriteNode(imageNamed: "slimeBall") 
let lilyPete = SKSpriteNode(imageNamed:"golden") 



override func didMoveToView(view: SKView) { 

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
    self.physicsWorld.gravity = CGVectorMake(1, 5) 
    self.physicsBody?.categoryBitMask = PhysicsCategory.worldBorder 
    self.physicsBody!.node?.name = "world" 


    self.backgroundColor = UIColor.darkGrayColor() 

    let playerCircle = SKShapeNode(circleOfRadius: 15) 
    playerCircle.name = "blueCircle" 
    playerCircle.fillColor = UIColor.blueColor() 
    playerCircle.strokeColor = UIColor.blackColor() 
    playerCircle.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2) 
    playerCircle.physicsBody?.categoryBitMask = PhysicsCategory.redBall 
    playerCircle.physicsBody?.contactTestBitMask = PhysicsCategory.worldBorder | PhysicsCategory.redBall 
    playerCircle.physicsBody?.collisionBitMask = PhysicsCategory.blueBall | PhysicsCategory.worldBorder 

    addChild(playerCircle) 

    let enemyCircle = SKShapeNode(circleOfRadius: 50) 
    enemyCircle.name = "redCircle" 
    enemyCircle.fillColor = UIColor.redColor() 
    enemyCircle.strokeColor = UIColor.blackColor() 
    enemyCircle.physicsBody = SKPhysicsBody(circleOfRadius: 50) 
    enemyCircle.position = CGPointMake(self.frame.size.width/3, self.frame.size.height/2) 
    enemyCircle.physicsBody?.affectedByGravity = true 
    enemyCircle.physicsBody?.dynamic = true 
    enemyCircle.physicsBody!.mass = 0.05 
    enemyCircle.physicsBody?.categoryBitMask = PhysicsCategory.blueBall 
    enemyCircle.physicsBody?.contactTestBitMask = PhysicsCategory.worldBorder | PhysicsCategory.blueBall 
    enemyCircle.physicsBody?.collisionBitMask = PhysicsCategory.worldBorder | PhysicsCategory.blueBall 

    addChild(enemyCircle) 
    enemyCircle.physicsBody?.applyForce(CGVectorMake(-2, -3)) 



    } 


func didBeginContact(contact: SKPhysicsContact) { 

    let firstBody = contact.bodyA 
    let secondBody = contact.bodyB 

    if(contact.bodyA.node?.name == "redCircle") && (contact.bodyB.node?.name == "world") || (contact.bodyA.node?.name == "world") && (contact.bodyB.node?.name == "redCircle"){ 

     print("Contact Made") 


    } 






} 


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 


    let touch = touches.first! as UITouch 
    let touchLocation = touch.locationInNode(self) 




} 
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 


    let touch = touches.first! as UITouch 
    let touchLocation = touch.locationInNode(self) 

} 


} 

答えて

0

あなたの赤い円がblueBallのカテゴリビットマスクを持っているだけworldBorderblueBall他と相互に作用する接触ビットマスクを持っています。あなたの青い円にはredBallのカテゴリビットマスクがあり、worldBorderと他のblueBallにしか連絡しません。

実際にredBallに赤い円のカテゴリを設定し、青い円のカテゴリを実際にblueBallに設定すると、すべての衝突が有効になるはずです。これらの2つをスワップして、どのように設定する必要があるかについて言及していないので、すべてが他のすべてのものと衝突していることを確認するように、ビットマスクを再度実行することをお勧めします。

しかし、あなたのdidBeginContact方法の1個の簡単なメモは、あなたのif文のチェック(IMO)が適切に折り返されません。実際、あなたはまったくいない。私のようなあなたの小切手を包むお勧めします。

if ((contact.bodyA.node?.name == "redCircle") && (contact.bodyB.node?.name == "world")) || ((contact.bodyA.node?.name == "world") && (contact.bodyB.node?.name == "redCircle")) { 

これは、あなたの&&だけその括弧のペアのすべてをチェックし、それ自体で存在することを可能にするであろう、他の側にすべてに||の片側のすべてをチェックします。 DidMoveToViewで

0

あなたは、そうでない場合は連絡方法が起動することはありません

physicsWorld.contactDelegate = self 

を呼び出す必要があります。

はさらにプレーヤーのサークルのために、あなたはそれぞれの衝突のための2つのチェックを行う必要はありませんので、ごDidBeginContact方法はこれに変化よりも

playerCircle.physicsBody = SKPhysicsBody(...) 

のようにそれを物理学の体を与えていません。また、PhysicsCategoryを使用して名前の代わりにそれらを識別します。

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if (firstBody.categoryBitMask == PhysicsCategory.redBall) && (secondBody.categoryBitMask == PhysicsCategory.worldBorder) { 

     // red ball hit world border, do something 
    } 

    if (firstBody.categoryBitMask == PhysicsCategory.blueBall) && (secondBody.categoryBitMask == PhysicsCategory.worldBorder) { 

     // blue ball hit world border, do something 
    } 
} 

また、ヒントとして、いくつかの物理学ではあなたは強制的にアンラップします!

self.physicsBody!.node?.name = "world" 
enemyCircle.physicsBody!.mass = 0.05. 

physicsBodyが見つからないとクラッシュする可能性があります。

その常に使用することをお勧め?できるだけ多くの場合、あなたがすでにやっていることができます。

また、それ以外のあなたには、いくつかの予期しない結果を得ることができるので、彼らにphysicsBodyを与える前に、あなたのスプライトの位置を与えることを試みます。

enemyCircle.position = CGPointMake(self.frame.size.width/3, self.frame.size.height/2) 
enemyCircle.physicsBody = SKPhysicsBody(circleOfRadius: 50) 
enemyCircle.physicsBody.categoryBitMask = ... 
... 

が、これは

を役に立てば幸い
関連する問題