当方初心者です。
現在、野球のデータを管理するアプリを作っております。
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")
}
}
}