openframeworks for iOSからiOSのUIを使う

客員研究員のタナカです。3/27日のイベント「未来レストラン」での未来の飲食店を体験できるテクノロジーとしてタナカは「タブレット端末のアプリを使って店の注文を『見える化』する」というテーマで展示を行います。

タイミングよく大声を上げて店員を呼び止めたり、本当に呼べてるのか不安になるほど無反応な「店員を呼ぶ」ボタンを何度も押したりせずとも、テーブルのタブレット端末で(あるいは自分の携帯端末で)自分の注文がスマートにできるようになったら、皆さんうれしいですよね。最近だと大きめの回転寿司屋では回転レーンに流れていない好みの寿司をテーブルに備えつけられたiPadのアプリで注文できる店舗も増えてきました。

今回のイベント向けの制作ではこういったタブレットオーダーシステムをもっと未来的に発展(暴走?)させたシステムを開発しています。テーブルの端末からお客さんが好きなタイミングで注文できるのみならず、キッチン側のサーバー的なアプリケーションで今注文がどれくらい入っていて自分の順番はどのへんなのか、みんなに人気のメニューは何なのかがわかり、しかもそれが注文を待つお客さんのエンターテイメントにもなって、思わず余分に注文したくなってしまうような仕組みを目指していますがどうなるか…ぜひ当日体験してみてください!

さてさて、技術的な解説も少しします。今回の制作にはテライ研究員と同じくopenframeworks(OF)を使用しています。タナカもOFを本格的に触るのは初めてだったためテライさんが解説している落とし穴にほぼすべてハマりましたが(なのでテライさんの←エントリ重要です!)、ようやく慣れてきたかなというところです。OFにはofxiOS(旧ofxiPhone)というアドオンがあり、(ほぼ)同じコーディングでiOSアプリを開発することができるため、タブレット側のアプリもオーダーを受け付けるサーバ側のMacOSXアプリもOFで開発しています。

テライさんも解説されていた通りOFではアプリ内にUIを組み込む際ofxGUIを使うのが一般的なようですが、iOSアプリではやはりiOSのインターフェイスにしたいもの。ということで、ofxiOSにはOFでの描画ウインドウとは別に通常のiOSのViewを呼べるような仕組みがあります。

まず通常のiOSプログラミングと同様、新規ファイルとしてCocoa TouchのUIViewControllerを作成します。

new file

.xibファイル、.hファイル、.mファイルが作成されますが、OFのメインコードと連携するためには実装をObjective-C++(Objective-CとC++の両方の仕様を混在する技術)にする必要があり、.mファイルの拡張子を「.mm」にする必要がありました。そのほかのインターフェイスの実装については通常のiOSプログラミン語と同様です。

OFのコードからViewを呼び出すのはメインコード(testApp.mm)で

settingView = [[SettingUIViewController alloc] initWithNibName:@”SettingUIViewController” bundle:nil];
[ofxiOSGetGLView() addSubview:settingView.view];

のようにaddSubViewします。今回の開発では一時的にOFの画面を隠して全面のViewを表示したかったので、

settingView = [[SettingUIViewController alloc] initWithNibName:@”SettingUIViewController” bundle:nil];
settingView.view.alpha = 0;
[ofxiOSGetGLView() addSubview:settingView.view];

[UIView animateWithDuration:.3f animations:^{
settingView.view.alpha = 1;
}];

のようにViewのalphaをアニメーションしてフェードインするようにしました(もっといい方法があるかな?)。

また、iOSのUIで操作が終わったらどうやってOF側に通知したりViewを消したらいいの? delegateとか? と一瞬戸惑ったんですが、ここはC++式に、OFのメインオブジェクト(testApp)のメソッドを呼び出してよしなにせよということのようです、そのために、「ofxiPhoneExtras.h」「testApp.h」をインクルードし、

include

didLoadViewでofGetAppPtr()を呼ぶとOFのメインオブジェクトのポインタが取れるので、

ofgetappptr

メインコードでViewを取り外す(あるいはUIViewでの操作を通知する)メソッドを作っておいて呼び出す

close

という実装をしています。なかなかキメラな感じですが、このような形にすれば、OFで一般的な単画面のアプリだけでなく、iOSライクな画面遷移をともなう本格的なアプリ開発もできそうですね。

まだまだ絶賛開発中ですので、またトピックがあれば解説したいと思います!

“未来レストラン”に参加されるには事前登録が必要です。登録はこちらから行ってください。また定員に限りがあるので登録される方は急いでくださいね!

“未来レストラン”の来場登録をする

“未来レストラン”案内ページへ
mirai-reataurant 未来レストラン