現状のswiftの動き
①タップすると画像が現れる。
②傾けると加速度センサによって画像が動く。
③ドラッグすると、加速度センサが無効になりドラッグする方向へ画像がついてくる。
④ドラッグを解除すると、加速度が有効になる。 ←今回修正したい部分
④再度タップすると画像が消える。
実現したいこと
ドラッグを解除した時に、ドラッグした方向へ加速度を付けたいです。
例)
iPhoneを下に傾けた状態(画像が下に移動する状態)で、
上の方向へドラッグし、指を離した時、上の方向へ加速度がつき、
その後、下に画像が移動するようにしたいです。
おそらく、
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
startGame()
}
の、タップを解除した時に、ドラッグした方向へ加速度がつく。と言うような
コードを入力すれば良いと思うのですが、考え方はあってますでしょうか?
該当のソースコード
import UIKit import CoreMotion class ViewController: UIViewController { var coin = UIImageView() var coinCount = 0 @IBAction func addImage(_ sender: UITapGestureRecognizer) { if coinCount == 0 { coin = UIImageView(image: UIImage(named: "daiya")) coin.frame = CGRect(x: 0, y: 0, width: 110, height: 110) coin.center = sender.location(in: self.view) coin.contentMode = .scaleToFill coin.clipsToBounds = true coin.center = sender.location(in: self.view) UIView.animate(withDuration: 0.10, animations: { }) { (Bool) -> Void in } self.view.addSubview(coin) } else if coinCount == 1 { coin.removeFromSuperview() } coinCount = coinCount + 1 coinCount = coinCount % 2 startGame() } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { cmManager.stopDeviceMotionUpdates() } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { startGame() } @IBAction override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { print("touchesMoved") // タッチイベントを取得. let aTouch = touches.first! // 移動した先の座標を取得. let location = aTouch.location(in: coin) // 移動する前の座標を取得. let prevLocation = aTouch.previousLocation(in: coin) // CGRect生成. var myFrame: CGRect = coin.frame // ドラッグで移動したx, y距離をとる. let deltaX: CGFloat = location.x - prevLocation.x let deltaY: CGFloat = location.y - prevLocation.y // 移動した分の距離をmyFrameの座標にプラスする. myFrame.origin.x += deltaX myFrame.origin.y += deltaY // frameにmyFrameを追加. coin.frame = myFrame } let cmManager = CMMotionManager() let scrSize: CGSize = UIScreen.main.bounds.size let mag: Double = 1.0 var vx, vy: Double? override func viewDidLoad() { super.viewDidLoad() vx = 0.0 vy = 0.0 startGame() } func startGame() { cmManager.deviceMotionUpdateInterval = 0.03 let handler: CMDeviceMotionHandler = { (motionData: CMDeviceMotion?, error: Error?) -> Void in self.stepGame(motionData: motionData, error: error) } cmManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: handler) } func stepGame(motionData: CMDeviceMotion?, error: Error?) { var xMin, xMax, yMin, yMax: Int xMin = Int(coin.frame.width / 2) xMax = Int(scrSize.width) - xMin yMin = Int(coin.frame.height / 2) yMax = Int(scrSize.height) - yMin if let motion = motionData { let gravity = motion.gravity vx = vx! + gravity.x * mag vy = vy! - gravity.y * mag var x: Int = Int(Double(coin.center.x) + vx!) var y: Int = Int(Double(coin.center.y) + vy!) if (x < xMin) { x = xMin; vx = 0.0 } else if (x > xMax) { x = xMax; vx = 0.0 } if (y < yMin) { y = yMin; vy = 0.0 } else if (y > yMax) { y = yMax; vy = 0.0 } coin.center = CGPoint(x: x,y: y) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
使用している言語
swift
Xvode 11.4
ご教授のほど、よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/12 15:58
2020/04/12 16:12
2020/04/12 16:25
2020/04/12 16:38
2020/04/13 09:31
2020/04/13 10:40
2020/04/13 11:00
2020/04/16 10:45