0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

同一のView内の別の{}で、変数(Int型)を共有する方法はありますか?

Posted at

当方初心者です。
現在、野球のデータを管理するアプリを作っております。
SKScene(GameScene)を使って、バッターが打った打球の、
到達位置
打球の軌道
を表現しようとしています。

下記がそのコードなのですが、
最初に背景とボールを描画し、タッチイベントで打球が到達した場所をタップすると、そこへボールが移動、後にUISegmentedControlで、その打球が、
ゴロ
ライナー
フライ
を選択肢し、
ゴロ  → 直線
ライナー→ 緩い曲線
フライ → 大きい曲線
で表現をしたいです。

ボールがタップした場所まで移動することができるのですが、
変数(この場合はposition)が{}の中でしか使用できないため、
後半の、
func segconChanged1(sender: UISegmentedControl){
以下の部分で、変数positionの数値が0になってしまいます。
{}の外、この場合別の{}の中、でpositionの数値が使用できれば解決しそうです。

どなたか解る方がいらっしゃれば教えていただけないでしょうか?
他サイトで質問をしたことがあるのですが、
詳しくは教えていただけなく困っております。

よろしくお願いします。

以下GameScene.swift

import SpriteKit
class GameScene: SKScene {

var myImage : SKSpriteNode!
var chiten1x = CGFloat()
var chiten1y = CGFloat()    
override func didMoveToView(view: SKView) {
    //背景画像。SKSPriteNodeで画像を読み込む。
    let backGround = SKSpriteNode(imageNamed:"stadium414736.png")
    //画面サイズを取得
    let Label = SKLabelNode(text: "\(self.size)")
    Label.position = CGPointMake(self.size.width/2.0,self.size.height/2.0)
    //背景を画面の中央に配置する
    backGround.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
    //画像のサイズを画面に合わせる
    backGround.size = self.size
    //画像を最下層に設置
    backGround.zPosition = -CGFloat.infinity
    // シーンに追加.
    self.addChild(backGround)
    // GameSceneの背景色を青色にする.
    self.backgroundColor = UIColor.blueColor()
    // ボール画像を生成.
    myImage = SKSpriteNode(imageNamed:"ball04.png")
    // ボール画像の描画場所を指定.
    myImage.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
    // シーンに追加.
    self.addChild(myImage)
    
    // ラベル 打球種
    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)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch: AnyObject in touches {
        
        // タッチされた場所の座標を取得.
        let position = touch.locationInNode(self)
        //画面の中心
        let midX = CGRectGetMidX(self.frame)
        let midY = CGRectGetMidY(self.frame)
        // ボール位置・軌跡のエリア条件
        let area2 = (position.x - midX) / (position.y - (midY - (midY / 5.0)))
        if position.y > midY - (midY / 5.0) {
            if area2 >= -1  && area2 <= 1 {
                // 打球到達エリア判定
                let area1 = ((position.x - midX) / (position.y - midY))
                if position.y - midY <= 0 && position.x - midX <= 0 {
                    print("left")
                } else if position.y - midY < 0 && position.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, chiten1x , chiten1y , midX, midY, midX, midY)
            // "curve"という名前のノードがあったら消去する
            if let theNode = self.childNodeWithName("curve") {
                theNode.removeFromParent()
            }
            // pathからSKShapeNodeを生成。
            let shapeNode = SKShapeNode(path: path)
            // ノードに名前を付ける
            shapeNode.name = "curve"
            // 線の太さを指定
            shapeNode.lineWidth = 1.0
            //軌跡を描画
            self.addChild(shapeNode)
            // タッチされた場所に画像を移動
            myImage.position = position
        }
    }
}

//打球種 SegmentedControlの値が変わったときに呼び出される.
func segconChanged1(sender: UISegmentedControl){

    //画面の中心
    let midX = CGRectGetMidX(self.frame)
    let midY = CGRectGetMidY(self.frame)
    
    switch sender.selectedSegmentIndex {
    case 0:
        chiten1x = position.x
        chiten1y = position.y
    case 1:
        chiten1x = (position.x + midX) / 2.0
        chiten1y = position.y
    case 2:
        chiten1x = (position.x + midX) / 2.0
        chiten1y = (position.y + (midY / 1.5))
    default:
        print("Error")
    }
}

}

0
0
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?