• 締切済み

swiftのsprite kitで質問です(1)

当方、swift初心者です。 sprite kitで野球のアプリを作っています。 バッターが打った打球の軌跡をSKShapeNodeを使って、 ゴロ  → 直線 ライナー→ ゆるい曲線 フライ → 強い曲線 を表示したいと思っています。 下記は、一番最初にボールを画面の中心に表示しておき、 打球の到達地点をタップするとそこにボールが移動 打球種のUISegmentedControlをタップすると、直線・ゆるい曲線・強い曲線を表示 結果のUISegmentedControlをタップすると、その軌跡の色が、赤・緑・黄に変わる というものです。 結果のUISegmentedControlは出来上がったのですが、打球種のUISegmentedControlが表示できません。 どなたか詳しい方がいらっしゃれば、ご教授いただけないでしょうか? import SpriteKit class GameScene: SKScene { var myImage : SKSpriteNode! override func didMoveToView(view: SKView) { //背景画像 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) 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) self.view!.addSubview(dakyuushu1) // ラベル 結果 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) self.view!.addSubview(kekka1) } 長文なので、続きます。

  • Swift
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

SpriteKitは本格的に使ったことないんですが、新規のGameプロジェクト作成で 自動的に作られたサンプルコードに質問のコードをコピペして実行してみたら、 UISegmentedControlの表示位置が画面をはみ出しているだけのようだったので、 SKSceneのサイズを調整したらちゃんと表示されました。 http://d.hatena.ne.jp/yasuhallabo/20140615/1402840178 に書かれているように、SKScene作成処理で scene.size = skView.frame.size; を追加して画面サイズにSKSceneのサイズを合わせるとよいと思います。

関連するQ&A

  • swiftのsprite kitで質問です(2)

    続きです。 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 var position = CGPointZero position = self.convertPointFromView((touches.first?.locationInView(view))!) let path = CGPathCreateMutable() CGPathMoveToPoint(path, nil, position.x, position.y) //CGPathAddCurveToPoint(path, nil, position.x , position.y , midX, midY, midX, midY) if let theNode = self.childNodeWithName("curve") { theNode.removeFromParent() } let shapeNode = SKShapeNode(path: path) shapeNode.name = "curve" self.addChild(shapeNode) } } } } //打球種 SegmentedControlの値が変わったときに呼び出される. func segconChanged1(segcon: UISegmentedControl){ let path = CGPathCreateMutable() CGPathMoveToPoint(path, nil, position.x, position.y) let midX = CGRectGetMidX(self.frame) let midY = CGRectGetMidY(self.frame) 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 } //結果 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 } } 以上、よろしくお願いします。

  • Swiftについて教えてください

    AVFoundationでカメラの起動し、その上にSCNViewを重ねようとしています。シングルビューアプリケーションを選択し、UIViewを一つおきそのクラスをSCNViewにして、下記のようにしたのですがSCNViewが表示されません。 http://dev.classmethod.jp/smartphone/ios-camera-intro/ http://tokyo.supersoftware.co.jp/code/1388 http://www.musicalgeometry.com/?p=1273 など調べてみたのですが、解決にいたりませんでした。 SCNViewをオーバーレイさせたいのですが、どのようにすればいいでか?教えてください。 カメラの起動部分は以下のサイトを参考にさせていただきました。 https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/3-avfoundation/002-kamerano-qi-dongto-hua-xiangno-bao-cun カメラを起動し//--------------------------------------------------------------------------ではさまれた部分を追加しました。 import UIKit import AVFoundation import QuartzCore import SceneKit class ViewController: UIViewController { //-------------------------------------------------------------------------- // @IBOutlet weak var OverlayView: SCNView! // var cameraNode:SCNNode! //-------------------------------------------------------------------------- // セッション. var mySession : AVCaptureSession! // デバイス. var myDevice : AVCaptureDevice! // 画像のアウトプット. var myImageOutput : AVCaptureStillImageOutput! override func viewDidLoad() { super.viewDidLoad() //-------------------------------------------------------------------------- // let scene = SCNScene() // var ballObj = SCNNode() ballObj.geometry = SCNSphere(radius: 5) ballObj.position = SCNVector3(x: 0, y: 50, z: -30) scene.rootNode.addChildNode(ballObj) // let scnView = OverlayView as SCNView scnView.scene = scene //背景を透明に scnView.backgroundColor = UIColor(white:1, alpha:0) //カメラ cameraNode = SCNNode() cameraNode.camera = SCNCamera() cameraNode.position = SCNVector3(x: 0, y: 0, z: 0) scene.rootNode.addChildNode(cameraNode) //ライト let lightNode = SCNNode() lightNode.light = SCNLight() lightNode.light!.type = SCNLightTypeOmni lightNode.position = SCNVector3(x: 0, y: 10, z: 10) scene.rootNode.addChildNode(lightNode) //環境光 let ambientlightNode = SCNNode() ambientlightNode.light = SCNLight() ambientlightNode.light!.type = SCNLightTypeAmbient ambientlightNode.light!.color = UIColor.darkGrayColor() scene.rootNode.addChildNode(ambientlightNode) //-------------------------------------------------------------------------- // セッションの作成. mySession = AVCaptureSession() // デバイス一覧の取得. let devices = AVCaptureDevice.devices() // バックカメラをmyDeviceに格納. for device in devices{ if(device.position == AVCaptureDevicePosition.Back){ myDevice = device as! AVCaptureDevice } } // バックカメラからVideoInputを取得. let videoInput = AVCaptureDeviceInput.deviceInputWithDevice(myDevice, error: nil) as! AVCaptureDeviceInput // セッションに追加. mySession.addInput(videoInput) // 出力先を生成. myImageOutput = AVCaptureStillImageOutput() // セッションに追加. mySession.addOutput(myImageOutput) // 画像を表示するレイヤーを生成. let myVideoLayer : AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(mySession) as! AVCaptureVideoPreviewLayer myVideoLayer.frame = self.view.bounds myVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill // Viewに追加. self.view.layer.addSublayer(myVideoLayer) // セッション開始. mySession.startRunning() } }

  • Swiftについて教えてください

    UICollectionviewに読み込んだ画像をタッチして枠線と番号を表示させようと下記のようにしてみたのですが、最後のセルにだけラベルの番号が表示されます。(枠を消したら数字も減ります)各セルにはラベルはきちんと配置されています。それをnumLabel.hidden = trueで消しておいて、セルをタッチした時にnumLabel.hidden = falseで表示させようとし考えています。なぜ最後のセルだけなのでしょうか。教えてください。よろしくお願いします。 import UIKit class ViewController: UIViewController ,UICollectionViewDataSource, UICollectionViewDelegate{ //画像を格納する配列 var imageArray:[UIImage] = [] //番号ラベル let numLabel: UILabel = UILabel(frame: CGRectMake(0,0,30,30)) //選択したIndexPath格納する配列 var selection: [NSIndexPath] = [] //コレクションビュー @ IBOutlet weak var imageCollection:UICollectionView? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //配列imageArrayに1~6.pngの画像データを格納 for i in 1...6{ imageArray.append(UIImage(named: "\(i).png")!) } } //コレクションビューのアイテム数を設定 func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { //戻り値にimageArrayの要素数を設定 return imageArray.count } //コレクションビューのセルを設定 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { //繰り返し使用することができるUICollectionViewCellのインスタンスを作成 var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! UICollectionViewCell //セルのなかの画像を表示するImageViewのタグを指定 let imageView = cell.viewWithTag(1) as! UIImageView //セルの中のImage Viewに配列の中の画像データを表示 imageView.image = imageArray[indexPath.row]   //ラベルの設定 // 背景を青色にする. numLabel.backgroundColor = UIColor.blueColor() // 文字の色を白にする. numLabel.textColor = UIColor.whiteColor() //文字サイズ numLabel.font = UIFont.systemFontOfSize(12); // Textを中央寄せにする. numLabel.textAlignment = NSTextAlignment.Center //ラベルを非表示にする numLabel.hidden = true //セルにラベルを配置 cell.addSubview(numLabel) //設定したセルを戻り値にする return cell } //セルをタップしたとき func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { let cell = collectionView.cellForItemAtIndexPath(indexPath)! if let index = find(selection, indexPath) { selection.removeAtIndex(index) } else { selection.append(indexPath) } // 可視状態のセルを全て更新する collectionView.visibleCells().map({(cell: AnyObject) -> Void in self.updateCell(cell as! UICollectionViewCell) }) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //セルの更新 func updateCell(cell: UICollectionViewCell) { if let indexPath = self.imageCollection?.indexPathForCell(cell){ if let index = find(selection, indexPath) { cell.contentView.layer.borderColor = UIColor.blueColor().CGColor cell.contentView.layer.borderWidth = 4.0 numLabel.hidden = false numLabel.text = "\(index+1)" } else { cell.contentView.layer.borderColor = UIColor.clearColor().CGColor cell.contentView.layer.borderWidth = 0.0 numLabel.hidden = true } } } }

    • ベストアンサー
    • Swift
  • css spriteについて(html知識皆無)

    PC歴1年半で、KAETENというテンプレートを使って 普段ブログを書いているものです。 「Instant Sprite – Generate CSS Sprites Instantly」 やその他もろもろのサイトを見てブログに導入しようと思ったのですが、 htmlの知識が無いため、どのように変更したり、どこに挿入したりすれば いいのか全くわかりません>< 大画像はかなり圧縮しています。 多くの小画像による通信回数をどうしても削減したいので、 ご協力願います。 下記の形式を使わなくていいので、 変更する箇所と、挿入前後のhtmlやcss を教えて下さい。どうかよろしくお願いします。 ●ブログはこんな感じで表示されています。 http://rankdus.seesaa.net/ ●css spriteの画像 http://rankdus.up.seesaa.net/image/sprite.png ●cssのどこかに挿入?(フッターに表示されるものです) .sprite { background: url('sprite.png') no-repeat top left; } .sprite.000pageup { background-position: 0px -151px; width: 16px; height: 16px; } .sprite.000rss { background-position: 0px -177px; width: 16px; height: 16px; } ・・・・ (同じ感じだと思うので、省略しました) ●htmlのどこかに挿入? <div class='sprite 000pageup'></div> <div class='sprite 000rss'></div> <div class='sprite 000home'></div> ・・・ ●テンプレートのcssやhtml (文字オーバーしたので、アップロードしました) http://firestorage.jp/download/2dce1d5b7374f6abd9166408fb5241122521f75f

    • ベストアンサー
    • CSS
  • Spriteのサイズが取得できない

    毎度初歩的な質問で恐縮です。 下記のようにビットマップの中心が、スプライトの左上になるように スプライトにビットマップをaddChildしました。 で、その後のwidth,heightのプロパティを参照したところ ビットマップのサイズは取得できるのですが、 スプライトのサイズが取得できません。 どのようにすれば取得することができるのでしょうか。 var bm:Bitmap = new Bitmap(event.bitmapData) as Bitmap; bm.x = bm.width / 2 * -1 ; bm.y = bm.height / 2 * -1 ; bm.smoothing =true var bm_s:Sprite = new Sprite; bm_s.x = app_width / 2 + def_z ; bm_s.y = app_height + def_z ; bm_s.z = def_z; bm_s.width = bm.width ; bm_s.height = bm.height ; bm_s.addChild( bm ); trace( bm.width.toString() ); ←値は取得できる trace( bm_s.width.toString() );←値が0になる

    • ベストアンサー
    • Flash
  • オーバーレイについての質問です。

    オーバーレイについての質問です。 #overlay { position: absolute; top: 0; left: 0; width:100%; height: 100%; min-height: 100px; background: #000; z-index: 500; filter:alpha(opacity=90); -moz-opacity:0.90; opacity:0.90; } 上のようなスタイルでオーバーレイを使用しているのですが、 スクロールでするとどうしても下が切れてしまいます。 解決策を教えて下さい。よろしくお願いします。

  • XHTML、CSSレイアウトでフッターを常に最下部に配置するには?

    フッターを最下部に表示したいのですが、#footerに position: fixed; bottom:0;を付け加えてもフッター だけ最下部に表示されコンテンツ部分がついてきません。 ヘイトに100%をつけくわえるのでしょうか? どうかご教授願います。 body { margin: 0; padding: 0; text-align:center; font-family:"MS Pゴシック", Osaka, "ヒラギノ角ゴ Pro W3"; font-size:1em; background-color:#CCCCCC; } ol,ul,li { margin: 0; padding: 0; } li { list-style:none; } h1,h2,h3,p { margin: 0; padding: 0; } #container { margin: 0 auto; text-align: left; width: 740px; height: 100%; background-color:#FFFFFF; } #header { width:740px; height:80px; margin:0; padding:0; background-color:#FFFFFF; background-image:url(img/nine_rogo.gif); background-repeat:no-repeat; background-position:left center; } #contents { width:740px; height:100%; margin:0; padding:0; background-color:#FFFFFF; } #menu { float:left; width:140px; height: auto; margin:0; padding:0; background-color:#FFFFFF; color:#000000; } #main { float:right; width:580px; height:auto; margin:0; padding:0 0 0 10px; background-color:#FFFFFF; color:#000000 } #footer { clear:both; width:740px; height:auto; background-color:#FFFFFF; color:#000000; font-size:1em; padding:0.3em 0; text-align:center; }

  • cssで擬似フレームについて

    はじめて質問させていただく、CSS初心者のものです。 下記のdivタグを画面中央寄せにする方法はあるのでしょうか? HTMLとCSSは下記のように書いています。 HTML <body> <div id="header"> (width="800" height="180" のflashファイルを入れています) </div> <div id="main">  ( width="700"のコンテンツを作りスクロールさせていま)  </div> <div id="footer">テキストを一行入れています</div> </body> ___________________ css html{ height:100%; overflow:hidden; } body{ height:100%; width:100%; margin:0px auto; background-color: #000000; }   #header{ position: absolute; height: 180px; width: 800px; overflow: hidden; top: 0px; }  #main{ overflow: auto; position: absolute; width: 800px; top: 180px; bottom: 20px; background-color: #FFFFFF; } #footer{ position: absolute; width: 800px; bottom: 0px; font-family: "Courier New", Courier, mono; font-size: medium; font-style: italic; color: #00FF33; height: 20px; background-color: #000000; overflow: hidden; }  このような感じなのですがなにかいい方法があればご教授お願いいたします。

    • ベストアンサー
    • HTML
  • 背景画像の大きさ指定。

    cssのbackground-positionで背景画像の位置を設定してますが、この場合画像の大きさは設定 できないのでしょうか。どこにwidth="",height=""を書けばいいかわからなくて…。 単純な質問かもしれませんがよろしくお願いします。

    • ベストアンサー
    • HTML
  • float: leftで横に並べたら、サファリだけ

    float: leftで横に並べたら、サファリだけ隙間が空いてしまいます。 IEやファイヤーフォックスではピッタリ表示できています。 問題の箇所は以下です。 <div style="float: left;"> <p style="position: relative;"> <img src="./img/img-001.png" width="240" height="150" /> <br /> <span style="font-size: 12px; padding: 2px 5px 2px 5px; position: absolute; top: 130px; left: 0px; width: 230px; height: 16px; color: white ; background-color: black; opacity: 0.6;">テストテスト1</span> </p> </div> <div style="float: left;"> <p style="position: relative;"> <img src="./img/img-002.png" width="240" height="150" /> <br /> <span style="font-size: 12px; padding: 2px 5px 2px 5px; position: absolute; top: 130px; left: 0px; width: 230px; height: 16px; color: white ; background-color: black; opacity: 0.6;">テストテスト2</span> </p> </div> <div style="float: left;"> <p style="position: relative;"> <img src="./img/img-003.png" width="240" height="150" /> <br /> <span style="font-size: 12px; padding: 2px 5px 2px 5px; position: absolute; top: 130px; left: 0px; width: 230px; height: 16px; color: white ; background-color: black; opacity: 0.6;">テストテスト3</span> </p> </div> どうすればサファリの隙間を消せるでしょうか?

    • ベストアンサー
    • HTML