月別: 2015年7月

cocos2d-xの勉強してみた

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

ゲーム開発エンジン使ってアプリを作ってみたいなとは以前から考えていましたが、今回cocos2d-xの勉強をしてみました。

他にもUnityがあって、しかもそちらの方が情報量も書籍の数も多いです。にも関わらず、なぜcocos2d-xを選んだかというと、私には3次元がややこしかったからです。UnityはLive2Dと連携させるのにちょっと触りましたが、私には合いそうもないというのが第一印象でした。cocos2d-xなら2次元だから比較的入りやすいんじゃないかなと思ったのです。

実際にやってみたら、cocosは情報が少ないという意味でハードルが高くて困っていますけどね。もっとも、Unityもハウツー本使って勉強してみると意外と簡単にできるかもしれません。いずれやってみようと思います。

今回勉強するにあたって利用した本はこちらです。

書籍で扱われているcocos2d-xのバージョンはは3.2ですが、私は3.6(勉強開始当初の最新、現在は3.7が出ている)でやりました。

Android Studioとの連携

Android Studioでcocosのプロジェクトを開くにはどうしたらいいかという問題ですが、cocos2d-xのバージョン3.7からAndroid Studio用のプロジェクトが作成されるようになっています。ですので、3.7を使えば解決されます。さよならEclipse。

といっても、あくまでプロジェクトが開けるというだけで、Android Studioだけを使ってC++のコーディングなども含めて開発していけるわけではありません(多分)。素直にMacならXcode使ってiOS用に作っていく、WindowsならVisual Studio使ってWindows Phone向けで作っていくのがいいと思います。(両者であればプロジェクトを開く→実行する→ちゃんと動くので)

Android Studio使って進めていきたかったのですが、今回はcocos2d-xの勉強を優先することにしました。

3.6で本の内容をひと通りやってみて

基本的には本に書いてある内容は、バージョン3.6でもそのまま動きます。

ただ1点だけ、5章のP204ページにあるコードは修正しないと動きませんでした。

auto properties = _tiledMap->getPropertiesForGID(gid).asValueMap();

このasValueMap()のところの型チェックでプログラムが止まってしまいます。これはcocos2d-xのバージョンによる問題ではなく、Tiled Map Editorのバージョンが違うせいで動かなかったのかもしれません(本のTiled Map Editorのバージョンは0.9.1、私が使ったのは0.12.3)。

auto property = _tiledMap->getPropertiesForGID(gid);
if (property.isNull() || property.getType() != Value::Type::MAP) {
    return nullptr;
}
auto properties = property.asValueMap();

一部、本の通りにやっても画面にうまく表示されない箇所があるにはあるのですが、これはcocos2d-xのバージョンによる問題なのかは分かりません。

6章のCocos Studioのあたりは参考程度に

これは本のせいではありませんが、第6章のCocos Studioを使うあたりの話はそのまま利用できませんでした。というのも、本で使っているCocos Studio1.6が手に入らなかったからです。

公式サイトには2系しか公開されていませんでした。もしかしたらどこかに1.6置いてあるのかもしれませんが、私には見つけられませんでした。

Cocos Studioはバージョン2から全く別物のツールというくらいに変わってしまっています。1.6の頃にあったツールがなくなっているあたり、バージョンが上がったようにはまったく思えないです。

触ってみた限り、前にあった機能が削減されたというよりは、Cocos Studioで扱う部品がシンプルになり、もっと簡単にcocos2d-xのプロジェクトに取り込めるようになったというのが正しい認識のように思います。GUI Componentかどうかなどを意識することなく、単にNode(もしくはLayer)として扱えばいいだけなのでしょう、おそらく。

大体雰囲気で乗り切れましたが、AtlasLabelの扱いが変わっていることだけは注意が必要でしょう。AtlasLabelは画像で数字のフォントを用意すれば、そのまま数値として利用できるものです。

バージョン1.6までは文字列が何から始まるかを指定してやる必要があったようです(本を見る限りは)。

しかし2系からはAtlasLabelは必ず./0123456789という順番で画像を用意しなければならないようです。ドットやスラッシュを使わないとしても、です。文字の横幅はすべて同じにしなければなりません。要するに、Cocos Studioが渡された画像を勝手に12等分して、左から順番に./0~9と認識してくれるみたいです。サンプル素材の画像データは0〜9しかないので、画像編集ソフトを使って左側に文字2つ分の余白を入れたらうまくできました。

cocos2d-x入門書として優秀

私はC++も含めて全くの初学でしたが、本の通りやったらちゃんとできました。おかげでcocos2d-xの雰囲気は掴めた気がします。

一方でトラブったときにちょっと困ります。例えばノードを画面に追加しても描画されないとき、いったいどこを確認したらいいのかがさっぱり分かりません。

私はC++はじめて、Xcode触るのも初めてなので、うまくいかないときにどうやって原因を切り分けていけばよいのかが分からなくて困りました。というか困っています。

ですが、「こうやったら動くよ」という情報自体がありがたい存在なので、cocos2d-x触ってみたいなぁという人にはおすすめできると思います。

開発者オプションチェッカー

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

開発者オプションチェッカーという名前ですが、現在のところ「アクティビティを保持しない」をONにしてるかどうかをチェックするだけのアプリです。

名前の通りAndroidアプリ開発者以外の人には無用の長物です。もしかしたら、私以外に欲しいと思っている人はいないかもしれません。

アピールポイントは、設定値の監視を行う割に、特別なパーミッションを要求しないという潔さがあるところです。

作った経緯

「アクティビティを保持しない」は、画面回転でアプリが突然の死を迎えないかチェックするのに重宝します。

一方で、これを有効にした状態だとActivityの通常のライフサイクルが確認できなくなります。普通ならホーム画面を出すと、ActivityはonStopで止まりますが、有効にしていると必ずonDestroyまでいって破棄されてしまいます。この状態では、例えばLoaderのレジューム処理が確認できなくなります。(というかこれが開発のきっかけでした)

「アクティビティを保持しない」を有効にしているかどうかは、渡しの場合だと通知領域を2回スワイプ→設定を表示→開発者オプションを表示→アクティビティを保持しないの状態を確認という操作を経ないと確認できませんでした。これがものすごく面倒くさい。

だったら通知などで「アクティビティを保持しない」の状態が分かれば便利なんじゃないかなと思って作りました。

本当は、アプリから「アクティビティを保持しない」の設定を切り替えられたら良かったのですが、設定値をアプリから切り替えることは不可能でした。設定値を書き換えるには特殊なパーミッションが必要であり、そのパーミッションを有効にできるのはシステムアプリのみという制限があったからです。

そのためこのアプリでは、「アクティビティを保持しない」の設定値を読み取ることしかできません。

このアプリを作って学んだこと

このアプリでService,AlarmManager,Widgetを初めて利用しました。ちょっとした思いつきの割に、いろいろ勉強になったなぁと思います。

もっとも、ウィジェットの更新時に一旦ボイスレコーダーのアイコンが表示されて、パッと更新されないのがよく分からないところです。

このアプリでできること

アクティビティを保持しないが有効になってるかどうかを知ることができる、ただそれだけです。

仕組みとしては、Serviceを常駐させて設定値の変更を監視させています。設定が変更されれば通知を表示させたりウィジェットを更新させたりしているだけです。

アプリを立ち上げれば現在の設定値を常に確認できるのですが、それではアプリを立ち上げなければ有効かどうかを確認することが出来ません。それはそれで手間です。

それを実現するには、私の頭ではServiceを常駐させる以外に手段が思いつきませんでした。

Serviceの常駐は、端末のリソースを専有し続けるためバッテリーへの影響がある、何をしているか分からないなどから、あまり気持ちのいいものではないと思います。そこで、常駐しないようにするオプションも設けました。

「アクティビティを保持しない」を有効にしているかどうかを知りたい頻度というのは人によって違うと思います。1日おきくらいで構わないという人もいれば、常に最新の状態で知っておきたいという人もいるかもしれません。

Serviceを常駐させていれば、「アクティビティを保持しない」の設定値を切り替えた瞬間に、その設定値が通知されるようになっています。これを無効にした場合、設定値を切り替えてもすぐには通知されなくなりますし、ウィジェットや通知で表示されている設定値と、今現在の「アクティビティを保持しない」の設定値が異なる場合があります。

Serviceを無効化すると、設定値の変更が検出できません。そのため一定間隔で設定値を確認するしか方法が思いつきませんでした。ウィジェットであれば、「アクティビティを保持しない」の設定値を切り替えてウィジェットの更新時間が来るまでの間は、古い状態が表示されてしまうことになります。

この辺り、何かしらうまい手段があればいいのになぁと思うのですが、何かいい方法があるのでしょうか。(設定値の変更がBroadcastされてればよかったのにとは思いました)

もっとも、Broadcastがシステムによって行われていたとしても、そのBroadcastを受け取るにはServiceなりを立ち上げてBroadcastReceiverを動かしていないと受け取れないのですけどね。

要望募集中

現在バージョン0.1です。開発者オプションチェッカーという名前の割に、「アクティビティを保持しない」しかチェックしないからというのがその理由です。

他の開発者オプションは、そもそも利用していないか、有効にしていたら画面の表示で有効であることが丸わかりなものが多いので、とりあえずはこれだけでいいかとリリースしました。

「こういう設定値もチェックしたい」という要望があればコメント貰えると嬉しいなと思います。

そもそも需要があるのかどうかすら謎ですが・・・。