swift3はじめました!|Appleの手書き数字認識サンプルコードが面白かったので遊んでみました

スポンサーリンク
XCode

20161114_001あまのじゃくなHikaruapp(@hikaruapp)です。

いいよ!swift、これからはswiftだ!

と言われると絶対にやりたくなくなるのが、あまのじゃくなわけです。

が、今回はちょっと違いました。

iOS10の新しい機能を調べていると「手書き認識」「MPSCNN」なんてものが出てきて、私の好奇心のアンテナにピピ! と、

ちょっと調べてみたら、AppleがMPSCNNHelloWorldなんていうサンプルコードを出していたのでダウンロードして中身を見たらswift

げげっ!

BOOL flag = あまのじゃく < 好奇心

なんて公式が頭の中を走って flagにYESが代入されたみたいで、

swift3はじめました!初心者ですが宜しくお願いします。

用意したもの

Xcode 8.1
Apple MPSCNNHelloWorld
iPhoneSE iOS 10.1.1
※iPhone6以降の端末が必要です。iPhone5Sは動作しませんでした。

さ〜、swift3やりましょう!

swiftはじめて一番気持ちが悪かったのは、”;”が要らないこと

これ、ついつい押してしまうんですよねー、最後に・・・。
それと、! ?これも気持ちが悪い。

そんな、Objective-Cで付いた癖と対決しながらswiftのサンプルコードMPSCNNHelloWorldを改造して簡単なゲームを作ってみました。

ゲーム名は、「数字手書き認証ゲーム」

う〜ん、名前がイマイチですね。

20161114_002

ランダムで0〜9までの数字が表示されます。同じ数字を手書き窓に書いて正解・不正解を競う。いかに認識しやすい数字を書くかがカギとなります。何回かやっていると認証しやすい書き方がわかってきます。いわゆる、認証の癖みたいなのがわかってくるので、早く連続で正解させることが出来るようになってきます。

では、作っていきます

手書き認証の部分はMPSCNNHelloWorldから必要な部分のみ抜き出しました。
overrideしてる部分は、すべて削除して一つのファイルにまとめてみました。
だって、override好きじゃないんですもん・・・。

手書き部分は、touchesEndedを追加してここが呼ばれると手書き認証が実行されるようにしまいた。ここのコールバックする時のswiftのお作法がわからず、それなりに書いてみたら動いてしまったので、とりあえずそのままにしておきます。勉強しなければ・・と、

DrawView.swift

weak var callbackdelegate: ViewController!

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if callbackdelegate != nil {
        callbackdelegate.drawviewCallback()
    }
}

ViewController.swift

func drawviewCallback() {
    print("touch up")
    
    // 手書き認証
    let anserNumber = (uint)(tappedDetectDigit())
    
    // 表示
    digitAnserLabel.text = "\(anserNumber)"
    
    // 答え合わせ
    let flagCheck = checkAnser(qnum: questionNumber, anum: anserNumber)
    
    // SE 再生
    playSEaudio(flagTrueFals: flagCheck)
    
    // 正解
    if flagCheck {
        clerTouchView()
        putOutQuestion()       
    }
}

で、ここの部分でお分かりの通りい画面から指が離れたと同時に手書き認証が走りますので、一筆書きで書いたもので正解の数字に認証させるかが、このゲームの肝となる部分です。

そして、ゲームに絶対必要なのは、そう効果音です。
こんなの一番簡単だよ!なんて思っていたら全然ダメ。ググって出てきたコードをそのままコピペしてもビルドしたらエラー・・・。音を出すだけで3時間ほどハマっていました。
この部分も我武者羅にやっていたら動いたので、そのままにしてあります(^^;

// Audio
let trueAudioPath  = Bundle.main.path(forResource: "true",  ofType:"mp3")!
let falseAudioPath = Bundle.main.path(forResource: "false", ofType:"mp3")!
let trueAudioUrl  = URL(fileURLWithPath: trueAudioPath)
let falseAudioUrl  = URL(fileURLWithPath: falseAudioPath)

do {
    try trueAudioPlayer = AVAudioPlayer(contentsOf: trueAudioUrl)
    trueAudioPlayer.prepareToPlay()
} catch {
    trueAudioPlayer = nil
}

do {
    try falseAudioPlayer = AVAudioPlayer(contentsOf: falseAudioUrl)
    falseAudioPlayer.prepareToPlay()
} catch {
    falseAudioPlayer = nil
}

// SE audio
func playSEaudio(flagTrueFals: Bool) {
    
    if flagTrueFals {
        playTrueAudio()
    } else {
        playFalseAudio()
    }
}

func playTrueAudio() {
    if trueAudioPlayer != nil {
        if trueAudioPlayer.isPlaying {
            self.trueAudioPlayer.currentTime = 0
        }
        self.trueAudioPlayer.play()
    }
}

func playFalseAudio() {
    if falseAudioPlayer != nil {
        if falseAudioPlayer.isPlaying {
            self.falseAudioPlayer.currentTime = 0
        }
        self.falseAudioPlayer.play()
    }
}

はじめてのswift3でしたが、なんとか、それらしいのが完成しました。

6歳の息子にやらせてみたところ、結構ハマってくれたのでOKでしょう!
Githubにアップしておきますので実機でビルドして遊んでみてください。

今回swiftの分からないところをググっていたのですがGoogleの検索に振り回されて、なかなか正解にたどり着けませんでした。人気があるものではなくて新しい物に関しては上手く機能しないですね。ま、これもそのうち改善されるかなと、

て事で、アマゾンさんでswift3で書籍を探してみたら、今の自分にピッタリな本を発見!!
ちょっと高いけど、ポチッとしちゃいました!

 

日々修行です(笑)

今回作ったGameのコード – github

コメント

タイトルとURLをコピーしました