試行錯誤 10.2 (続々・ジグソーパズル)
今回は、ピースをドラッグする時に呼ばれるメソッドを、書いていきます。
ピースをドラッグし終わったら、ピースの中心座標が正解の中心座標と一致するかどうかで判定します。
両者がぴったり重なり合うのは難しいので、±10の範囲に入ったら正解とみなし、ピースが正解場所にカチッと動くようにしました。
少し分かりにくいのですが、動画にしてみました。
数値をもっと大きくしたら、より分かりやすいかもしれません。
正解場所にはまったら、動かないようにuserInteractionEnabled = falseにします。
また、正解数をカウントする変数を設定しておき、正解ごとにカウントアップしていきます。
実際のアプリでは、正解場所にはまったら「カチッ」という効果音が鳴るように、また全問正解したらウグイスが鳴くアニメーションが始まるようにしました。(・Σ・)
import UIKit class ViewController: UIViewController { //正解数をカウントする変数 var correctCount = 0 override func viewDidLoad() { super.viewDidLoad() //略 } ///ピースをドラッグしたら呼ばれる関数 func dragPieces(sender:UIPanGestureRecognizer){ //ピースをドラッグし終わったら if sender.state == UIGestureRecognizerState.Ended{ let targetImg:UIView = sender.view! //ドラッグしているピースの正解のx座標 let answer_x = 10+75*((targetImg.tag-1)%4)+75/2 //ドラッグしているピースの正解のy座標 let answer_y = 50+75*((targetImg.tag-1)/4)+75/2 //ピースが正解座標の±10の範囲に入ったら if (CGFloat(targetImg.center.x) >= CGFloat(answer_x-10) && CGFloat(targetImg.center.x) <= CGFloat(answer_x+10)){ if (CGFloat(targetImg.center.y) >= CGFloat(answer_y-10) && CGFloat(targetImg.center.y) <= CGFloat(answer_y+10)){ //正解座標に移動 targetImg.center = CGPointMake(CGFloat(answer_x), CGFloat(answer_y)) //正解後は動かないように targetImg.userInteractionEnabled = false //正解数をカウント correctCount++ //全ピースが正解したら if correctCount == 16{ print("Congratulations!") } } } }else{ let point: CGPoint = sender.translationInView(self.view) let movedPoint: CGPoint = CGPointMake(sender.view!.center.x + point.x, sender.view!.center.y + point.y) sender.view!.center = movedPoint sender.setTranslation(CGPointZero, inView: self.view) }
完成〜〜(*´∇`*)
...でも
「煩雑すぎ(- -;;」
特にピースが正解座標の±10の範囲に入る所のif文って.....φ(T▽T)煙煙煙
もっとシュッとしたプログラムが書けるようになりたいな〜と思います。