20630


SpriteKitを使って、野球のアプリを作っています。  
打球が飛んだ地点に、打球の軌跡をSKShapeNodeを使って表示する際、ゴロ・ライナー・フライを線で表示し、  
ゴロ→ 直線  
ライナー→ゆるい曲線  
フライ→ 大きい曲線  
捕球した野手の選択と、その結果を色で表示（アウトは赤・ヒットは緑・その他は黄色）しようと思っています。  
それをUISegmentedControlで、任意に変更できるようにしたいのですが、現在のところ、結果の色分けまではできたのですが、軌跡の選択と捕球野手の選択のためのUISegmentedControlの部分で困っています。  
同じViewに複数のUISegmentedControlがある場合に、どのようにコードを書いたら良いのか？が理解できていません。  
現在までのコードを下記に表記しましたので、どなたか解る方がいらっしゃったらご教授いただけないでしょうか？  
尚、下記のコードをビルドして実行すると、

[code]

    <Error>: void CGPathAddCurveToPoint(CGMutablePathRef _Nullable, const CGAffineTransform * _Nullable, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat): no current point.
    
[/code]

とエラーが出ます。

[code]

    import SpriteKit
    
    class GameScene: SKScene {
    
        var myImage : SKSpriteNode!
    
        override func didMoveToView(view: SKView) {
    
    
            //画面サイズを取得
            let Label = SKLabelNode(text: "\(self.size)")
            Label.position = CGPointMake(self.size.width/2.0,self.size.height/2.0)
    
            // GameSceneの背景色を青色にする.
            self.backgroundColor = UIColor.blueColor()
    
    
            // ラベル　打球種
            let dakyuushu = SKLabelNode(fontNamed:"Chalkduster")
            dakyuushu.text = "打球種"
            dakyuushu.fontSize = 15
            dakyuushu.position = CGPoint(x:(size.width / 10.0) * 1 , y:(size.height / 35) * 11.1)
            dakyuushu.fontColor = UIColor.whiteColor()
            self.addChild(dakyuushu)
            //選択肢
            let myArray1: NSArray = ["  ゴロ  ", "  ライナー  ", "  フライ  " ]
            // SegmentedControlを作成する.
            let dakyuushu1: UISegmentedControl = UISegmentedControl(items: myArray1 as [AnyObject])
            dakyuushu1.center = CGPoint(x:(size.width / 10.0) * 5.8 , y:(size.height / 35) * 23.5)
            dakyuushu1.tintColor = UIColor.yellowColor()
            // イベントを追加する.
            dakyuushu1.addTarget(self, action: "segconChanged1:", forControlEvents: UIControlEvents.ValueChanged)
            // Viewに追加する.
            self.view!.addSubview(dakyuushu1)
    
    
            // ラベル　捕球野手
            let hokyuu = SKLabelNode(fontNamed:"Chalkduster")
            hokyuu.text = "捕球野手"
            hokyuu.fontSize = 15
            hokyuu.position = CGPoint(x:(size.width / 10.0) * 1 , y:(size.height / 35) * 9)
            hokyuu.fontColor = UIColor.whiteColor()
            self.addChild(hokyuu)
            //選択肢
            let myArray2: NSArray = ["投 ", "捕 ", "一 ", "二 ", "三 ", "遊 ", "左 ", "中 ", "右 ", "無 " ]
            // SegmentedControlを作成する.
            let hokyuu2: UISegmentedControl = UISegmentedControl(items: myArray2 as [AnyObject])
            hokyuu2.center = CGPoint(x:(size.width / 10.0) * 5 , y:(size.height / 35) * 27.3)
            hokyuu2.tintColor = UIColor.yellowColor()
            // イベントを追加する.
            hokyuu2.addTarget(self, action: "segconChanged2:", forControlEvents: UIControlEvents.ValueChanged)
            // Viewに追加する.
            self.view!.addSubview(hokyuu2)
    
    
            // ラベル　結果
            let kekka = SKLabelNode()
            kekka.text = "結果"
            kekka.fontSize = 15
            kekka.position = CGPoint(x:(size.width / 10.0) * 1 , y:(size.height / 35) * 5.5)
            kekka.fontColor = UIColor.whiteColor()
            self.addChild(kekka)
            //選択肢
            let myArray: NSArray = ["Out ", "1BH ", "2BH ", "3BH ","HR ", "ERR ", "Fc " ]
            // SegmentedControlを作成する.
            let kekka1: UISegmentedControl = UISegmentedControl(items: myArray as [AnyObject])
            kekka1.center = CGPoint(x:(size.width / 10.0) * 5 , y:(size.height / 35) * 31)
            kekka1.tintColor = UIColor.yellowColor()
            // イベントを追加する.
            kekka1.addTarget(self, action: "segconChanged:", forControlEvents: UIControlEvents.ValueChanged)
            // Viewに追加する.
            self.view!.addSubview(kekka1)
        }
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            for touch: AnyObject in touches {
    
                // タッチされた場所の座標を取得.
                let location = touch.locationInNode(self)
                //画面の中心
                let midX = CGRectGetMidX(self.frame)
                let midY = CGRectGetMidY(self.frame)
    
                // ボール位置・軌跡のエリア条件
                let area2 = (location.x - midX) / (location.y - (midY - (midY / 5.0)))
                if location.y > midY - (midY / 5.0) {
                    if area2 >= -1  && area2 <= 1 {
                        //　打球到達エリア判定
                        let area1 = ((location.x - midX) / (location.y - midY))
                        if location.y - midY <= 0 && location.x - midX <= 0 {
                            print("left")
                        } else if location.y - midY < 0 && location.x - midX > 0 {
                            print("right")
                        } else if area1 < -0.3 {
                            print("left")
                        } else if area1 >= -0.3 && area1 <= 0.3 {
                            print("center")
                        } else if area1 > 0.3 {
                            print("right")
                        }
    
    
                        // 始点を記憶するインスタンス変数
                        var position = CGPointZero
                        // 始点を記憶
                        position = self.convertPointFromView((touches.first?.locationInView(view))!)
                        // CGPathを生成
                        let path = CGPathCreateMutable()
                        // 描画のペンを始点に移動
                        CGPathMoveToPoint(path, nil, position.x, position.y)
                        // カーブを描く
                        CGPathAddCurveToPoint(path, nil, position.x , position.y , midX, midY, midX, midY)
                        // "curve"という名前のノードがあったら消去する
                        if let theNode = self.childNodeWithName("curve") {
                            theNode.removeFromParent()
                        }
                        // pathからSKShapeNodeを生成。
                        let shapeNode = SKShapeNode(path: path)
                        // ノードに名前を付ける
                        shapeNode.name = "curve"
                        //軌跡を描画
                        self.addChild(shapeNode)
                    }
                }
            }
        }
    
        //打球種　SegmentedControlの値が変わったときに呼び出される.
        func segconChanged1(sender: UISegmentedControl){
            // CGPathを生成
            let path = CGPathCreateMutable()
            //画面の中心
            let midX = CGRectGetMidX(self.frame)
            let midY = CGRectGetMidY(self.frame)
            // shapeNodeを取得
            guard let shapeNode = childNodeWithName("curve") as? SKShapeNode else {
                return
            }
            switch sender.selectedSegmentIndex {
            case 0:
                CGPathAddCurveToPoint(path, nil, position.x , position.y , midX, midY, midX, midY)
            case 1:
                CGPathAddCurveToPoint(path, nil, (position.x + midX) / 2.0 , position.y , midX, midY, midX, midY)
            case 2:
                CGPathAddCurveToPoint(path, nil, (position.x + midX) / 2.0 , (position.y + (midY / 1.5)), midX, midY, midX, midY)
            default:
                print("Error")
            }
            // 線の太さを指定
            shapeNode.lineWidth = 1.0
    
        }
    
        //結果　SegmentedControlの値が変わったときに呼び出される.
            func segconChanged(segcon: UISegmentedControl){
                // shapeNodeを取得
                guard let shapeNode = childNodeWithName("curve") as? SKShapeNode else {
                    return
                }
                switch segcon.selectedSegmentIndex {
                case 0:
                    shapeNode.strokeColor = UIColor.redColor()
                case (1...4):
                    shapeNode.strokeColor = UIColor.greenColor()
                case (5...6):
                    shapeNode.strokeColor = UIColor.yellowColor()
                default:
                    print("Error")
                }
                // 線の太さを指定
                shapeNode.lineWidth = 1.0
    
        }
    }
    
[/code]


CC BY-SA 3.0
2016-01-05T08:43:59.450
20627
2016-01-05T12:05:14.960
2016-01-05T12:05:14.960
7459
13156
question
swift xcode
同じ画面(SKScene)にUISegmentedControlを３つ配置する場合


CGPathAddCurveToPoint()のエラーが出る原因は、その前に、CGPathMoveToPoint()で始点を指定していないのが原因です。

詳しくは、CGPathのリファレンスを参照してください。

CGPath Reference  
<https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGPath/index.html>

* * *

UISegmentedControlに関係する部分は、方針としては、今の実装でいいのではないでしょうか？
hokyuu2.addTarget()で指定しているはずのsegconChanged2()が実装されてないため、2個目のUISegmentedControlをタップするとエラーで落ちますが、そこに必要な処理を実装するだけで問題ないかと思われます。


CC BY-SA 3.0
2016-01-05T11:45:10.880
20630
2016-01-05T11:45:10.880
7459
20627
answer