とりあえずブログ

プログラミングとiPhoneアプリの作り方を勉強中です。

試行錯誤 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)煙煙煙
もっとシュッとしたプログラムが書けるようになりたいな〜と思います。