11962


※xcode6.1.1 swift1.1 spriteKitを使用しています。

おみくじアプリをテストで作っているのですが  
タッチするボタンを二つつくって、どちらをタッチしたかによって  
反応をかえたいのですが、うまくいきません。  
タッチイベントでどの選択肢をタッチしたかは作れないのでしょうか？  
ご教授よろしくお願いします。

発生するエラーは、ボタンをクリックするとThread 1:breakpoint 1.1と出ます。

[code]

            if touchNode == btn2Sprite {
    
[/code]

の行で

[code]

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            // タッチされた位置にあるものを調べて
            let location = touch.locationInNode(self)
            let touchNode = self.nodeAtPoint(location)
            // もし、ボタン1なら
            if touchNode == btnSprite {
                // 悪い予感がすると表示してから、おみくじを振る
                myLabel.text = "悪い予感がする"
                shakeOmikuji()
            }
            // もし、ボタン2なら
            if touchNode == btn2Sprite {
                // 大吉の予感と表示してから、おみくじを振る
                myLabel.text = "大吉の予感"
                shakeOmikuji()
            }
        }
    }
    
[/code]

全文

[code]

    //  GameScene.swift
    
    import SpriteKit
    
    class GameScene: SKScene {
        // イラスト用スプライトを用意する
        let mySprite = SKSpriteNode(imageNamed: "omikuji.png")
        // ボタン用スプライトを用意する
        let btnSprite = SKSpriteNode(imageNamed: "button.png")
        let btn2Sprite = SKSpriteNode(imageNamed: "button.png")
        // おみくじ結果用ラベルを用意する
        let myLabel = SKLabelNode(fontNamed: "Verdana-bold")
    
        override func didMoveToView(view: SKView) {
            // 背景色をつける
            self.backgroundColor = SKColor.whiteColor()
            // イラストを表示する
            mySprite.position = CGPoint(x: 375, y: 900)
            addChild(mySprite)
            // ボタンを表示する
            btnSprite.position = CGPoint(x:375, y:200)
            self.addChild(btnSprite)
            // ボタンを表示する
            btn2Sprite.position = CGPoint(x:575, y:200)
            self.addChild(btn2Sprite)
            // おみくじ結果用ラベルを表示する
            myLabel.text = "???"
            myLabel.fontSize = 65
            myLabel.fontColor = SKColor.blackColor()
            myLabel.position = CGPoint(x:375, y:500)
            self.addChild(myLabel)
        }
        // タッチしたときの処理
        override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
            for touch: AnyObject in touches {
                // タッチされた位置にあるものを調べて
                let location = touch.locationInNode(self)
                let touchNode = self.nodeAtPoint(location)
                // もし、ボタンなら
                if touchNode == btnSprite {
                    // ???と表示してから、おみくじを振る
                    myLabel.text = "悪い予感がする"
                    shakeOmikuji()
                }
                // もし、ボタン2なら
                if touchNode == btn2Sprite {
                    // ???と表示してから、おみくじを振る
                    myLabel.text = "大吉の予感"
                    shakeOmikuji()
                }
            }
        }
        // おみくじを振る処理
        func shakeOmikuji() {
            // 【おみくじを振るアクションをつける】
            // おみくじを少し右に傾けるアクション
            let action1 = SKAction.rotateToAngle(-0.3, duration: 0.2)
            // おみくじを少し左に傾けるアクション
            let action2 = SKAction.rotateToAngle( 0.3, duration: 0.2)
            // おみくじをひっくり返すアクション
            let action3 = SKAction.rotateToAngle( 3.14, duration: 0.2)
            // action1,action2,action3を指定した順番に行う
            let actionS = SKAction.sequence(
                [action1, action2, action1, action2, action1, action3])
    
            // おみくじに「左右に振ってひっくり返すアクション」をつけて、最後にkekkaを実行する
            mySprite.runAction(actionS, completion: showOmikuji)
        }
        // 結果を表示する処理
        func showOmikuji() {
            var omikuji = ["大吉","中吉","吉","凶"]
            var r = Int(arc4random_uniform(4))
            myLabel.text = omikuji[r]
        }
    
        override func update(currentTime: CFTimeInterval) {
        }
    }
    
[/code]


CC BY-SA 3.0
2015-07-02T08:24:05.077
11956
2015-07-02T11:04:12.273
2015-07-02T11:04:12.273
8000
10353
question
swift spritekit
touchesBeganについて分からない事があります


nodeAtPoint メソッドよりも containsPoint メソッドを使うほうが適切に見えます。

[code]

            println(location)
            println(btnSprite)
            println(btn2Sprite)
            if btnSprite.containsPoint(location) {
                // もし、ボタン1なら
                // 悪い予感がすると表示してから、おみくじを振る
                myLabel.text = "悪い予感がする"
                shakeOmikuji()
            }else if btn2Sprite.containsPoint(location) {
                // もし、ボタン2なら
                // 大吉の予感と表示してから、おみくじを振る
                myLabel.text = "大吉の予感"
                shakeOmikuji()
            }
    
[/code]

それから「どのようにうまくいかないのか」も一緒に投稿してもらえると回答しやすくなります。


CC BY-SA 3.0
2015-07-02T10:12:16.617
11962
2015-07-02T10:42:35.287
2015-07-02T10:42:35.287
2373
2373
11956
answer

[code]

    import UIKit
    import SpriteKit
    
    class GameScene: SKScene {
        // イラスト用スプライトを用意する
        let mySprite = SKSpriteNode(imageNamed: "omikuji.png")
        // ボタン用スプライトを用意する
        let btnSprite = SKSpriteNode(imageNamed: "button.png")
        let btn2Sprite = SKSpriteNode(imageNamed: "button.png")
        // おみくじ結果用ラベルを用意する
        let myLabel = SKLabelNode(fontNamed: "Verdana-bold")
    
        // 中略
    
        // タッチしたときの処理
        override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
            for touch: AnyObject in touches {
                // タッチされた位置にあるものを調べて
                // let location = touch.locationInNode(self) // ここで赤色マークが出ているはず。
                let location = (touch as! UITouch).locationInNode(self) // touchをダウンキャストする。
                let touchNode = self.nodeAtPoint(location)
                // もし、ボタンなら
                if touchNode == btnSprite {
                    // ???と表示してから、おみくじを振る
                    myLabel.text = "悪い予感がする"
                    shakeOmikuji()
                }
                // もし、ボタン2なら
                if touchNode == btn2Sprite {
                    // ???と表示してから、おみくじを振る
                    myLabel.text = "大吉の予感"
                    shakeOmikuji()
                }
            }
        }
    
        // 後略
    }
    
[/code]

とりあえず一箇所、`touches`を`UITouch`にダウンキャストすれば、エラーが出なくなるはずです。


CC BY-SA 3.0
2015-07-02T10:43:46.633
11963
2015-07-02T10:43:46.633
7362
11956
answer