私はキャンドルを上に置いたシンプルなゲームを作成しました(奇妙な説明は私の質問に役立ちます)。そして、試合はウィックに接触した時点でポイントを獲得します。しかし、それが何か他のもの(ろうそくの「ワックス」部分のようなもの)と接触すると、ゲームは終わりです。プレイヤーは画面をタップして試合をコントロールします。次のように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週間拍手をかけてくれました。これは私が得た最も近いものです。
コードのこの部分: "// wickNode" ::ダブル//とは何ですか? – Confused
doubleを使用しない場合、//何も返されず、テクスチャは同じままです。私はこれを見つけ、下の答えを読んで:http://stackoverflow.com/questions/22874625/sknode-failing-to-find-childnodewithname。これは、少なくともノードの1つを変更させました。 – jlp28
希望のノードへの参照を得る他の方法はありますか? "名前"のものを使用しないで? – Confused