openFrameworksで作った.appを配布する

openFrameworksで作ったアプリを共有したい時、どのファイルを共有すればいいのか情報があまりなかったので、メモ。
といっても下記参考サイトをそのまま。

実際どの方法が正しいのか私自身よくわかってないけれど、とりあえずは以下の方法が良さそう。環境はMac OSXでのみ確認、、、確認中です。
Mac同士では問題なさそうだけど。。

手順はふたつ!
まず、XcodeからBuild Phasesを開いて、RunScriptに以下を追加する。

cp -r bin/data "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Resources";

※上をコピペすると”がフォントの違い?でパスとして認識されませんでした。
→「”」だけ手入力で修正したらパスの文字列が赤色になって有効になります。

うえすることで、bin/data以下に入っているイメージとかなんやかんやが、ビルド時にできるOOO.appファイルのResourcesファイルにコピーされるわけですね。
これがうまくいってるかはビルドして生成されるOOO.appを右クリック→パッケージの内容を表示 でResourcesフォルダ確認できます。

で次に、ofAppのsetup()内で以下を追加

ofSetDataPathRoot("../Resources/data/");

うえすることで、bin/dataフォルダではなく、app内のResourcesフォルダからデータ取ってくると指定している。

そんな感じだと思います。

こうすれば、OOO.appを他のPCでも動かせるようになります。
dataフォルダに画像素材とか置く必要ないのであればこんな処理も必要ないだろうけど。

参考:
https://stackoverflow.com/questions/4882572/how-to-bundle-an-openframeworks-application-in-xcode-relative-resource-linking

20190106追記

app化したファイルをAirdropで別のPCに送ると、dataフォルダを参照できないことがありました。実際には、ofxGuiの設定xmlをセーブなどできてもロードできないというもので、たしかにappのコンテンツの中のResourceフォルダのxmlが更新されていませんでした。

詳しいことはわかりませんが、Airdropで送ったappをダウンロードフォルダにおいたまま開くと上のような現象が起こり、一度デスクトップや別フォルダに移動させると正しいdataパスを指定していました。

ofFilePath::getCurrentExePath() などでちらっと確認したところ、Airdropで送りたてのappではprivate/~~の一時的なフォルダにappが置いてあるみたいで、期待するdataフォルダ(この場合は~~~/downloadsにあると思ってた)を参照しないようです。

とにもかくにも上の現象が起こる場合は、一度別のフォルダに移動して開いてみると良いかもしれません。

oF_Enumの値をランダムで取得する

oFのtipsメモです。

openFrameworksでEnumを使っていろいろする際に、値をランダムで取得したいと思いました。
具体的には、いろんな図形のパーティクル的なものを作る際に、enum(列挙型変数)で TRIANGLE,RECTANGLE, CIRCLE などを選択できるようにしたKatachiクラスを作っておいて、コンストラクタの中で形をランダムで決定するというものです。

「Enum ランダム」のように調べるとあまり日本語で文献がなかったように思ったので、メモしておきます。
参考にしたのは以下
https://stackoverflow.com/questions/2999012/generating-random-enums

結論から書くと、
katachiMode = static_cast<Mode>(round(ofRandom(3)));
という感じ。
static_castenumで設定したModeという型にキャストするということです。
ただし、いつでもこれで解決できるというわけではなさそうで、
contiguous連続的?)な場合でしか使えないとのこと。
おそらく、enumの値を
enum Mode{
Triangle = 0,Circle = 3, ~~
みたいにするとダメよってことだと思っています。深く追求してません。

もし間違っていたら教えていただければ幸いです。。

で、これを使って以下のようなクラスを作りました。(一部省略)

vector<Katachi> katachiV; をつくって
katachiV.push_back(k);

などでKatachiインスタンスを追加するたびにランダムで四角や三角のオブジェクトを追加することができます。

ミニマムなテストですが、いつか来るであろうVJイベント参加に向けてoFでいろいろできるようにちまちまと作っていきたいと思います。
(以前、interimというIAMASと多摩美のイベントでoFを使ったVJを拝見して感化されていました。)

超余談ですが、クラス名をKatachiのように日本語で作るのいいなと思ってます。
oF開発者ザック・リーバーマンさんが、School for Poetic Computation(SFPC)というのされていて、詩的なコーディングを目指すって思想がありまして、コードの中でもちょっとオサレ意識もつこと大事だなと思います。
まだまだ勉強中ですが、そういうことを今のうちから意識してもいいよなと。