2016-10-18 12 views
1

私はキャンドルを上に置いたシンプルなゲームを作成しました(奇妙な説明は私の質問に役立ちます)。そして、試合はウィックに接触した時点でポイントを獲得します。しかし、それが何か他のもの(ろうそくの「ワックス」部分のようなもの)と接触すると、ゲームは終わりです。プレイヤーは画面をタップして試合をコントロールします。次のようにdidBeginContact内の個々のノードのテクスチャを変更する

私のろうそくは、芯と色の一部で、作成された(私はランダムなテクスチャのシリーズのように、無関係な部分を削除した):

func makeCandles() { 

    //Node properties and randomisation 
    let candle = SKNode() 
    let randomCandle = Int(arc4random_uniform(UInt32(candleTexture.count))) 
    let randomTexture = candleTexture[randomCandle] as SKTexture 
    let random = arc4random_uniform(17) 
    candle.position = CGPoint(x: self.frame.size.width, y: CGFloat(random * 12) - 120) 

    //Candle 
    let chosenCandle = SKSpriteNode(texture: randomTexture) 
    chosenCandle.position = CGPoint(x: 0, y: self.frame.size.height/2) 
    chosenCandle.physicsBody = SKPhysicsBody(rectangleOfSize: chosenCandle.size) 
    chosenCandle.physicsBody?.dynamic = false 
    chosenCandle.physicsBody?.categoryBitMask = self.candleCategory 
    chosenCandle.physicsBody?.contactTestBitMask = self.matchCategory 
    chosenCandle.physicsBody?.collisionBitMask = 0 
    chosenCandle.physicsBody?.restitution = 0 
    candle.addChild(chosenCandle) 

    //Wick 
    let wickArea = SKSpriteNode(texture: wickTexture) 
    wickArea.name = "wickNode" 
    wickArea.position = CGPoint(x: 0, y: self.frame.size.height/1.3) 
    wickArea.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: wickArea.size.width/4, height: wickArea.size.height)) 
    wickArea.physicsBody?.dynamic = false 
    wickArea.physicsBody?.categoryBitMask = self.wickCategory 
    wickArea.physicsBody?.contactTestBitMask = self.matchCategory 
    wickArea.physicsBody?.collisionBitMask = 0 
    wickArea.zPosition = 11 
    wickArea.physicsBody?.restitution = 0 
    candle.addChild(wickArea) 

    //Add the node and zPosition 
    self.partsMoving.addChild(candle) 
    chosenCandle.zPosition = 12 
} 

キャンドルは、その後runBlockに作成されます。

let createCandles = SKAction.runBlock({() in self.makeCandles()}) 
    let briefPause = SKAction.waitForDuration(averageDelay, withRange: randomDelay) 
    let createAndPause = SKAction.sequence([createCandles, briefPause]) 
    let createAndPauseForever = SKAction.repeatActionForever(createAndPause) 
    self.runAction(createAndPauseForever) 

これはdidBeginContactに呼び出されたテクスチャを変更する私の関数である。

func updateFlame() { 

    if let newNode: SKNode = self.childNodeWithName("//wickNode") { 
     let updateTexture = SKAction.setTexture(flameTexture, resize: true) 
     newNode.runAction(updateTexture) 

    } 

} 

これは私のdidBeginContact機能である:

func didBeginContact(contact: SKPhysicsContact) { 

    if contact.bodyA.categoryBitMask == wickCategory || contact.bodyB.categoryBitMask == wickCategory { 
     score += 1 
     scoreLabel.text = "\(score)" 
     updateFlame() 

    } else { 
     runGameOverScene() 
    } 

私の問題は、それが唯一の炎への最初のノードを変更し、他のものを変更しないということです。接触が検出されたのは2番目または3番目の芯であっても、最初に作成された芯のみが変更されます(最初の芯が画面に表示されます)。試合がウィックと接触するたびにスコアが更新されるため、各ノードで接触が検出されていることが分かります。

マッチに個別に接触する各ノードのテクスチャを変更しないようにするのは間違っていますか?他のすべてはうまく動いていますが、この部分は私に1週間拍手をかけてくれました。これは私が得た最も近いものです。

+0

コードのこの部分: "// wickNode" ::ダブル//とは何ですか? – Confused

+0

doubleを使用しない場合、//何も返されず、テクスチャは同じままです。私はこれを見つけ、下の答えを読んで:http://stackoverflow.com/questions/22874625/sknode-failing-to-find-childnodewithname。これは、少なくともノードの1つを変更させました。 – jlp28

+0

希望のノードへの参照を得る他の方法はありますか? "名前"のものを使用しないで? – Confused

答えて

1

多くの試行錯誤の末、私は最終的に、接触が発生したときに各ノードにテクスチャを変更させる方法を見つけました!これは、その部分のために私のコードです:

func didBeginContact(contact: SKPhysicsContact) { 

    let collision : UInt32 = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask) 

    if collision == (matchCategory | candleCategory | cakeCategory) { 
     runGameOverScene() 
    } 

    if (contact.bodyA.categoryBitMask == wickCategory) { 
     let newWick = contact.bodyA.node 
     let updateTexture = SKAction.setTexture(flameTexture, resize: true) 
     newWick!.runAction(updateTexture) 

    } else if (contact.bodyB.categoryBitMask == wickCategory) { 
     let newWick = contact.bodyB.node 
     let updateTexture = SKAction.setTexture(flameTexture, resize: true) 
     newWick!.runAction(updateTexture) 
    } 

} 

私はこの質問のロジックを追った(私はテクスチャを設定したかったにも関わらず、それを削除していない)、それは完全に働いた:removeFromParent() Doesn't Work in SpriteKitを。

+0

この質問をご覧ください。接触機能を書く方法について、少し洗練された解決策があります。 http://stackoverflow.com/questions/40578790/didbegincontact-not-being-called-swift/40588132#40588132 – crashoverride777

関連する問題