66914


kabe(Node)を動かしたいです。  
kabeはdidmove内には存在せず、決められた条件が達成（"barrier"をタッチ）された際に出現します。

出現したkame(Node)は、既に配置されているspaceship（Node）と一緒に動く様にしたいです。  
spaceship（Node）の動きはtouchesMovedで制御しています。

どうやら、touchesMovedのコードが悪い様で、kabe(Node)の出現は問題なくするのですが、出現後、kabe(Node)が動いてくれません。

↓kabe(Node)が存在しない場合はspaceship.run(actionA)を、存在する場合はspaceship.run(actionA)とkabe!.run(actionB)を作動させたいです。  
else以降のコードがkabe(Node)出現後も動作しません。

[code]

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    
        let location = touches.first!.location(in: self)
    
       if  kabe?.parent == nil {
       let actionA = SKAction.move(to: CGPoint(x: location.x, y:location.y + 20), duration: 0.1)
       　　spaceship.run(actionA) 
    
       } else {
    
       let actionA = SKAction.move(to: CGPoint(x: location.x, y:location.y + 20), duration: 0.1) 
       let actionB = SKAction.move(to:CGPoint(x: location.x, y: location.y + 100), duration: 0.1)
          spaceship.run(actionA)
          kabe!.run(actionB)
         }
     }
    
[/code]

↓kabeの宣言

[code]

    func addKabe() {
            let kabe = SKSpriteNode(imageNamed: "kabe")
            kabe.position = CGPoint(x: spaceship.position.x, y: spaceship.position.y + 100)
            kabe.size = CGSize(width: 50, height: 50)
            addChild(kabe)
    
    }
    
[/code]

↓"barrier"を押した際にkabe(Node)を出現

[code]

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first 
        let locatin = touch!.location(in: self)
    
        if self.atPoint(locatin).name == "barrier" {
                addKabe()
        }     
    }
    
[/code]

情報不足がございましたらご報告ください。  
宜しくお願い致します。


CC BY-SA 4.0
2020-05-23T08:13:40.107
66912
2020-05-23T09:08:01.007
39881
question
swift xcode spritekit
Swift SpriteKit Nodeを操作したい（touchesMoved）


あなたのコードを見ると、`addKabe()`メソッドの中で **ローカル変数** `kabe`を宣言しています。

[code]

            let kabe = SKSpriteNode(imageNamed: "kabe")
    
[/code]

しかし、あなたは`addKabe()`内では、それをどこにも保存していません。

対して、`touchesMoved(_:with:)`メソッドの中では、`kabe`と言う変数を参照していますが、その変数はどこにも宣言されていません。

おそらく、現在のSKSceneクラス内にインスタンスプロパティとして宣言されているのでしょう。

[code]

         var kabe: SKSpriteNode?
    
[/code]

(提示したコードの中で使っている変数については、可能な限りどう宣言しているのかも示してください。)

このように、 **インスタンスプロパティとして宣言された`kabe`と、ローカル変数の`kabe`とは全く別物** です。

解決するには、ローカル変数の`kabe`に保持されているスプライトNodeをインスタンスプロパティの`kabe`にも代入してやると良いでしょう。

[code]

        func addKabe() {
            self.kabe?.removeFromParent() //<- 古い`kabe`が残っていたら消す
            let kabe = SKSpriteNode(imageNamed: "kabe")
            kabe.position = CGPoint(x: spaceship.position.x, y: spaceship.position.y + 100)
            kabe.size = CGSize(width: 50, height: 50)
            addChild(kabe)
            self.kabe = kabe //<- ローカル変数の`kabe`のNodeをインスタンスプロパティの`kabe`に代入
        }
    
[/code]

* * *

`let kabe =
...`と言う構文は新しい変数を宣言するものであること、ローカル変数とインスタンスプロパティの違いなど、言語の基本の部分をしっかり把握するようにしてください。


CC BY-SA 4.0
2020-05-23T09:08:01.007
66914
2020-05-23T09:08:01.007
13972
66912
answer