SKSceneでUISegmentedControlを使用して、描画する線の種類を変更できるようにしたいです。
野球のアプリを作っている初心者です。
下記コードで、
①タップした場所にボールを移動
②Segmented controlで
ゴロ
ライナー
フライ
から一種類を選択すると、画面の中心(ホームベース)からボールまで、
直線
緩い曲線
大きい曲線
を描画したいのですが、
下記コードでは、ビルドできてもSegmentedcontrolを選択すると、クラッシュしてしまいます。
思い当たることはやってみたのですが、解決する方法が見つかりません。
解る方、ご指導ください。
以前、似たような質問をしたことがありますが、明確な回答がいただけなかったので、問題の部分だけを抜き出してみました。
よろしくお願いします。
import SpriteKit
class GameScene: SKScene {
var myImage : SKSpriteNode!
override func didMoveToView(view: SKView) {
//背景画像。SKSPriteNodeで画像を読み込む。
let backGround = SKSpriteNode(imageNamed:"背景.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:" ボール.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 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")
}
// タッチされた場所に画像を移動
myImage.position = location
}
}
}
//打球種 SegmentedControlの値が変わったときに呼び出される.
func segconChanged1(segcon: UISegmentedControl){
//画面の中心
let midX = CGRectGetMidX(self.frame)
let midY = CGRectGetMidY(self.frame)
// 始点を記憶するインスタンス変数
var position = CGPointZero
// 始点を記憶
position = self.convertPointFromView((touches.first?.locationInView(view))!)
// CGPathを生成
let path = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, position.x, position.y)
// shapeNodeを取得
guard let shapeNode = childNodeWithName("curve") as? SKShapeNode else {
return
}
switch segcon.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
}
}
}