ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2016年12月28日

Androidで18万DLされた自作アプリをWindowsストアに移植した結果

Androidで18万回以上ダウンロードされた自作アプリをWindowsストアに移植して約2ヶ月経ちました。

移植作業にはなんだかんだ言って1ヶ月近くの工数がかかってしまったのですが、その結果をまとめてみました。

ダウンロード数: 339回
広告表示回数: 1,745回
Fill Rate:    約20%
広告クリック数:  6回
広告収益:   48セント (約50円)


なんなんでしょう、この結果は。。。


あまりの少なさにがく然としています。(笑)

Windows 10のタブレットや2 in 1も増えて来たので、そろそろ行けるかな〜と期待していたのですが、Windowsストアからアプリをダウンロードして使うという使い方はまだまだそんなに広まっていないのかも知れませんね。


ちなみに広告はUWPアプリではAdMobが使えなかったので標準の「Microsoft advertising ad」というものを使ってバナー広告を表示しています。これですがFill Rateが20%って、AdMobと較べて低すぎですよね。


もちろん、宣伝の仕方やアプリのカテゴリなどによって結果は大きく変わると思います。


ただ個人的には次のアプリからはしばらくWindowsストアはパスという事に決定です。


とりあえず試してみて大体の感触が分かったのでまあ良しとして、次に行きます。^^)





 

2016年10月5日

Nexus 6から中古のiPhone 5sに変えて起こった変化とは

1ヶ月ほど前に、愛用していたNexus 6を硬い床の上に落としてかなり派手に画面を割ってしまいました。実はまだ24回払いの残金も残っているというのに。(涙)

それから、余っていたiPhone 5sを仕方なくメインの携帯として使っています。今までアプリ開発のテスト用にたまに触るぐらいだったiPhoneですが、毎日使ってみると(予想通り)やっぱり使いやすいですね。

なんと言っても、まずポケットに入れたときの収まりの良さが違います。(笑) まあこれは単にサイズの違いなんですが。

ただ画面が小さい分文字を読むのが辛く感じます。

Nexus 6だと、FeedlyでRSSをチェックしてからSmartNewsで最新ニュースを読んで、その後Twitterをダラダラと眺める、という流れでゆうに1時間ぐらいはスマホの画面を見続ける事が出来たのですが、老眼が入ってきつつある眼にはiPhone 5sの画面サイズで同じ事をするのはきついです。


そこでこの1ヶ月で起こった変化とは、、、



Nexus 7(2013年モデル)の復活!! 



でした。

最近全然使わなくなっていたNexus 7ですが、このところ毎日活躍しています。このサイズ感は本当にいい感じです。




Googleからもうすぐ新しい7インチクラスのタブレットが出るらしいという噂もあるので、そちらも楽しみです。








 

2016年4月23日

Android Support Libraryが古いとAdMobのエラーでアプリが落ちる件

3月に自作のアプリを更新したところ、急にクラッシュレポートの数が増えて来ました。




レビュー欄にも「インストールしたけど起動しません」という報告がちらほらと出始めて、あせりました。



エラーの詳細はこんな感じです。

java.lang.NoClassDefFoundError: android.support.v4.util.SimpleArrayMap
at com.google.android.gms.ads.internal.zzs.(Unknown Source)
...
at com.google.android.gms.ads.internal.ClientApi.createBannerAdManager(Unknown Source)
...
at com.google.android.gms.ads.BaseAdView.loadAd(Unknown Source)
at com.google.android.gms.ads.AdView.loadAd(Unknown Source)

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/util/SimpleArrayMap;
at com.google.android.gms.ads.internal.zzs.(Unknown Source)
...
at com.google.android.gms.ads.internal.ClientApi.createBannerAdManager(Unknown Source)


どうもAndroid Support Libraryの「SimpleArrayMap」クラスが見つからないという事で、AdMobでの広告の表示時にエラーが発生しているようです。


AdMobがAndroid Support Libraryに依存しているというのは意識していませんでしたが、このエラーを見る限り依存しているみたいですね。

参考)
http://stackoverflow.com/questions/23717006/do-i-need-support-library-v4-for-google-play-services-ads




今までlibsフォルダに「android-support-v4.jar」をコピーしてあったのですが、それが古いままだったのが行けなかったようです。


(ちなみに今だにEclipse+ADTです。)


一旦libsフォルダのandroid-support-v4.jarを削除して、Android SDK内にあるものを「コピー」ではなく「リンク」として追加しました。



これでビルド時に最新のSupport Libraryが使われるようになるはずです。



この変更をしてアプリを更新した後は、AdMobが原因でのクラッシュは無くなりました。



しかし今回は手持ちの端末でテストしても全く起きなかった問題だったので、Androidアプリのメンテナンスはいろいろ大変だ奥が深いな〜、とつくづく思いました。笑)








.

2015年1月13日

Cocos2d-JSでAdMob広告を表示する手順 (iOS, Android)

2015年1月12日現在の情報です。

開発環境


- Mac OS X 10.9.5
- Cocos2d-JS v3.2
- Cocos Code IDE v1.1.0
- Xcode v6.1.1
- Eclipse (ADT) 23.0.2


cocos newコマンドでプロジェクトを作成


cocos new -p com.example.CocosJSAdmob -l js CocosJSAdmob

(もちろんCocos Code IDEのメニューから新規プロジェクトを作成する事も出来るのですが、そうすると生成されるファイルが微妙に違ったりするので私はcocosコマンドを使う事にしています。)


Cocos Code IDEでプロジェクトを開く


現状ではcocos newコマンドで作成したプロジェクトをそのままCocos Code IDEにインポートしようとしても「プロジェクトが見つからない」というエラーになるので、まずプロジェクトのルートディレクトリに下の内容で .project ファイルを作成する必要があります。

<name>CocosJSAdmob</name>の部分だけ適宜変更して下さい。

.projectファイルを作成した後、Cocos Code IDEにインポートします。





Cocode Code IDE上で実行出来る事を確認しておきます。



ネイティブコードサポートを追加する。


Cocos Code IDEのCocos Toolsメニューから「Add Native Codes Support」を選択します。
これによってプロジェクトの下に frameworks/runtime-srcというディレクトリが出来ます。



Xcodeでプロジェクトを開く


下のディレクトリにXcode用のプロジェクトファイルがあるのでそれを開きます。

  /(プロジェクトルート)/frameworks/runtime-src/proj.ios_mac/



ターゲット(実機またはシミュレータ)を選んでそのまま実行するとビルドされて実行出来ます。ただ初回は全てのソースファイルをコンパイルするので数分かかるかも知れません。



iOSでのAdMob対応


下を見ながらAdMob SDKを組み込みます。

https://developers.google.com/mobile-ads-sdk/docs/admob/ios/quick-start

AdMob SDKのファイルをプロジェクトに追加。



ライブラリを追加。

下の青枠内が今回追加したもの。特に「GameController」はGoogleのドキュメントでは記載漏れになっているみたいなので要注意です。



-ObjCリンカフラグを追加。


*追記:
AdMobの最新版(v7以降)では-ObjCリンカフラグは不要になったそうです。


ソースコードを変更。


AppController.h
AppController.mm

dealloc関数の後ろ、@endの前に以下を追加。

JavascriptからObjective-Cのコードを呼ぶ。


詳細は下記を参照して下さい。
 How to call Objective-C functions using js on iOS/Mac

app.jsの適切な場所に下のコードを追加します。今回は HelloWorldLayer の ctor関数の一番最後に追加しました。

jsb.reflection.callStaticMethod("AppController", "ShowAdView");


iOSでAdMob広告が表示されたところ

広告を隠したい時はHideAdViewを呼べばOKです。

jsb.reflection.callStaticMethod("AppController", "HideAdView");

iOSでの対応は以上で終わりです。




Eclipse(ADT)でプロジェクトを開く


下のディレクトリにEclipse用のプロジェクトがあるのでそれをインポートします。

  (プロジェクトルート)/frameworks/runtime-src/proj.android/

インポートした後、プロジェクトのディレクトリで

cocos compile -p android

を実行して全てのソースコードをコンパイルしておきます。これも初回は数分ぐらいかかるかも知れません。


AndroidでのAdMob対応


次のドキュメントに従って Google Play Serviceを組み込んで下さい。

https://developers.google.com/mobile-ads-sdk/docs/?hl=ja


Java側にAdMob広告を表示する処理を追加。


AppActivity.javaに以下の変更を加えます。

1. AppActivityクラスの先頭に変数を追加。

private static Activity activity = null;
private static AdView adView = null;


2. onResumeでactivityを変数に保持。

@Override
protected void onResume() {
super.onResume();
activity = this;
};

3. AppActivityクラスに3つのメソッドを追加。

public static void createAdView()
public static void showAdView()
public static void hideAdView()

変更後のAppActivityクラスは下の状態になります。
(xxxxxxxxxxxxxxxx...xxxxxxの部分は適宜置き換えて下さい。)

JavascriptからJavaのコードを呼ぶ


app.jsを下の様に変更します。


Android上でAdMob広告が表示されたところ


Androidでの注意点


現状、Google Play Serviceへの参照をプロジェクトに追加して一旦Eclipse上でRunしてしまうと、それ以降は cocos run, cocos compile, cocos deployなどのコマンドが下の通りエラーで中断してしまいます。


-package-resources:
     [aapt] Creating full resource package...
     [aapt] invalid resource directory name: /Applications/android-sdk-mac_x86/extras/google/google_play_services/libproject/google-play-services_lib/bin/res crunch

BUILD FAILED
/Applications/android-sdk-mac_x86/tools/ant/build.xml:932: The following error occurred while executing this line:
/Applications/android-sdk-mac_x86/tools/ant/build.xml:950: null returned: 1

Total time: 43 seconds
Error running command, return code: 1


原因はADTとAntでビルドの方法(一時ファイルの場所など)が異なる事にあるみたいです。
( http://stackoverflow.com/questions/19746319/how-to-solve-invalid-resource-directory-name-resource-crunch )


対策としては、Eclipseを完全に終了するかまたはEclipseの自動ビルドをオフに設定してから cocosコマンドを実行すればエラーにならない様です。



以上、Cocos2d-JS v3.2でAdMob広告を表示する方法でした。

jsb.reflection.callStaticMethod という関数を使えばJavascriptからObjective-CやJavaのメソッドを簡単に呼び出せるので便利ですね!

これを使えば広告の表示制御だけでなく、
  • ブラウザで任意のURLを開く
  • AppStoreに飛ばす
  • Facebook, Twitterなどに投稿する
など色々な事が簡単に出来そうです。









 .

2014年12月5日

Nexus 6を買って14日目の感想

大きさと重さについては「案ずるより産むが易し」


慣れれば大丈夫。と言うよりこの画面の大きさはクセになる。

重さに関してはもちろん軽いに越したことはないけれど、タブレットみたいに重さで手が疲れるとかそういう事は無いので気にならない。

でもポケットから取り出す時には落とさない様にちょっと気を付ける必要があるかも。


Webサイトの閲覧はますますスマホ中心に


縦持ちでも結構広いし横持ちにすれば大体どんなPC用サイトでもそのまま閲覧出来る。

今までは「スマホではブログやニュース記事のタイトルだけチェックして中身はPCで後から読む」というスタイルだったのが、「スマホでその場で読む」に変わりつつある。

縦向き

横向き

やっぱり画面が広いのは良い事だ。


大きいキーボードで文字入力が速く快適に!


2年以上愛用したGalaxy S3と比べて一番変わったのはこの点かも知れない。
今までは
「スマホで文字を入力する事」=「極力避けたい事」
だったのが、これからはそうでもなくなりそうだ。


充分に高機能なカメラ


カメラについては、前に使っていたGalaxy S3と比べるとかなりスペックが上がっているので特に不満は無し。かと言って正直感動するほどでもなかったかな。



パノラマ撮影

ぼかし効果付きの写真も簡単に撮影可能。

あとGalaxy S3はカメラのシャッター音が大きくて不便だったけれど、Nexus 6の場合は端末のボリュームを下げてバイブにしておけば無音で撮影出来る。これは嬉しい。




キーボードとマウス、外部ディスプレイを繋げばPCになる(?)


Chromecast があれば無線で簡単に画面全体を外部ディスプレイへ出力する事が可能だ。大画面で見ると 2560×1440px というNexus 6の解像度の高さがますます活きてくる
(訂正: Chromecastを経由すると解像度が落ちるので2560x1440pxの画面がそのまま表示される訳ではない。)

会社のPCにRemote Desktopで接続すればPC無しでデスクトップ環境を再現する事も出来そうだ。(遅延がどれくらいになるかはまだ試していないので分からない。)  
(*試した結果は下の「後日談」参照)


Nexus 4や5では、MicroUSBポートに「SlimPort」という規格に対応したアダプタを挿せばHDMIのディスプレイに画面をミラーリング出来たらしい。ところがどうも調べた所 Nexus 6ではケーブル接続での外部ディスプレイ出力には対応していないみたいだ。

なので外部ディスプレイとの接続には Chromecast か Miracast* を使うしかなさそうだ。

* Googleのサポートページによると、なんと 『Nexus 6とNexus 9はMiracastをサポートしていません』との事。
https://support.google.com/nexus/answer/2865484?hl=en

** なぜか工場出荷時にMiracastを使用不可にしてあるらしく、Root化してbuild.propというファイルに1行追加すれば使える様になるとの情報が下のページにあった。
http://forum.xda-developers.com/nexus-6/help/nexus-6-miracast-t2952461/page2



我が家には1年以上前に買ったChromecastがあったので、試しにそれで居間のテレビに画面をミラーリングしてみた。
通知エリア内の「Chromecast」ボタンを押すと画面のミラーリングが始まる。
Chromeブラウザの画面。スクロールすると一瞬のタイムラグを感じる。

Youtubeの動画をミラーリングして観るだけなら遅延はほとんど感じない。


画面を出力する事が出来たら、次はキーボードとマウスだ。

1. USBケーブルで有線接続する
2. Bluetoothで無線接続する

の2通りの方法がある。
どちらでも良いのだけれどとりあえずOTGアダプタ(こんなやつ)とUSBハブを買って1つめの方法で試して見ようと思っている。これだといつもPCで使い慣れているキーボードとマウスをそのまま使える。



*後日談
PCにRemote Desktopで接続してChromecast経由でディスプレイ出力するというのを試して見た。MicrosoftのRemote DesktopクライアントとGoogleのChrome Remote Desktopの両方を試した。

結果、やっぱりあまり実用的には使えない事が判った。キーボードはそれなりに使えるのだけど、マウスの動作がどうしても1テンポ遅れてしまう。これでは細かな作業には使いづらい。

Remote Desktop自体はNexus 6の画面上ではストレス無く動いているので、Chromecastを経由する事による遅延が原因だと思う。もちろん無線LANの速度にも影響されるだろう。試した環境は11n(300Mbps)だったので、これが11ac(6.9Gbps)とかになれば改善されるのかも知れない。と思ったらChromecastは11acに対応していないらしいので現状ではこれ以上は無理そうだ。

また、遅延の問題以前に解像度の問題もある。Chromecastを経由する事で解像度が落ちてしまい文字がボヤケて表示されるのだ。

こういう用途はそもそも想定外で、Chromecastはあくまで写真・動画の鑑賞やプレゼンなどに使うものという事だろう。

もしSlimportかMHLでの有線接続が出来ていたらもっと便利に使えただろうと思うとちょっと残念だ。



3日目に遭遇したトラブル


買ってから2日目の夜にバッテリーが残り20%ぐらいの状態でそのまま寝てしまった。朝になってから使っていると何か画面の反応がおかしい。スクロールすると縦半分だけが取り残されて表示が崩れたりする。最後には白黒の砂嵐状態になってしまった。ちょうど電波が無い時の地上波テレビみたいな感じだ。

慌てて電源アダプターをつなぐ。それから完全にシャットダウンして再起動してもしばらくすると同じ現象が起きる。しかも全く電話が繋がらない。「これはキャリア(Sprint)の店舗に行って交換してもらうしか無いかな〜」と焦っているうちにうんともすんとも反応しなくなってしまった。

結局、電源アダプターをつないだまま2時間ほど触らずに置いておく事でこの現象は直った。それ以降は必ず1日1回は充電する様にしている。それから再発はしていないので、多分大丈夫だと思う。


総合的には今のところ「ほぼ満足」


端末代は高いけれど、最先端のAndroidを体験したい人には強くおすすめ出来る。実はiPhone 6 Plusにしようかこっちにしようかかなり迷ったけど、Nexus 6にして良かった。Android 5.0は完成度が高くてとても使い易い。

Remote Desktop接続を多用する超小型PC好きとしては、有線で遅延/劣化の無いディスプレイ出力が出来ないのだけがちょっと残念だ。(笑)








 
 

2014年10月17日

JavaScriptでスマホゲームアプリを作る - Cocos2d-JS編

前回のPlatino版に続いて、Cocos2d-JS版が出来た。



ソースコードはこちら。https://github.com/mikehibm/15puzzle-cocos2d


● 困ったところ


う〜ん、特になし。

あえて言えばy座標の指定方法(上下)がこれまでと逆になるのでそれを変更する必要があったぐらい。

あとそういえば、ifで座標が一致するかどうかを比較して分岐している箇所があって、

 if (piece.x !== new_pos.x || piece.y !== new_pos.y){
   ...処理...
 }

と書くと処理が実行されなくて困った。(浮動小数点数なので)
下の様に差分の絶対値で比較する様に変更した。

 if (Math.abs(piece.x - new_pos.x) > 1 || Math.abs(piece.y - new_pos.y) > 1){
   ...処理...
 }



● 良かったところ


アニメーションの作り方やシーン遷移の方法など、これまでに得たCocos2dの知識が活かせるので楽が出来た。

実機での実行速度も申し分無し。

デバッグが簡単。Cocos Code IDEからデバッグ実行しておくとJSファイルを修正して保存した瞬間にデバッグアプリ内でコードが再ロードされるのですぐに確認出来る。もちろんブレークポイントを設定する事も可能!


● アニメーション実行中にさらにアニメーションを実行する場合


MoveToを使ってピースを移動するアニメーションを実行中に、場合によってはさらに次のアニメーションを開始する必要がある場合がある。連続でタッチして同時に複数のピースを動かした場合などだ。

その場合、同じSpriteに対して同時に複数のMoveToアニメーションを実行してしまうと最終的な位置が思わぬ所にずれてしまう事になる。

これについては、2つめのMoveToアニメーションを実行する前に

 piece.stopActionByTag(ACTION_TAG);

を実行して前のMoveToを中止する事で解決出来た。


● Mac版デバッグアプリの設定変更


Cocos Code IDEから実行するとデフォルトだとMac版のデバッグ用アプリが立ち上がって来てその中でアプリが実行される。

このデバッグ用アプリの画面サイズ(Zoom設定)が、起動する度に100%になってしまいMBAだとiPhone5の縦画面がディスプレイに収まらないので、そこがちょっと使い辛かった。

これは下のページの通りに設定を変更する事で50%表示にする事が出来た。これでとても快適になった。
Lua - Cocos Code IDEのシミュレーターのデフォルト設定 - Qiita 



● ソースコード


今回のソースコードはこちら。
https://github.com/mikehibm/15puzzle-cocos2d




● 感想


さすがに注目度急上昇中のフレームワークだけあって Cocos2d-JS は使い易い。デバッグも素早く出来るので気分良く開発が出来る。

またXcodeやEclipseからもプロジェクトを開いて実行出来るので、広告表示やアプリ内課金などのネイティブ連携も頑張ればなんとかなりそうだ。

パーティクルエディタやシーンエディタなどのツール群も充実しているので、やっぱり一番安心して実戦で使えるのはこれかなあと思う。

あと次はUnityにチャレンジしてCocos2d-JSを上回るメリットがあるかどうかを試したい。








 .

2014年10月14日

JavaScriptでスマホゲームアプリを作る - Titanium + Platino編

ようやく15パズルのTitanium+Platino版が出来た。

Platino Game Engine


ソースコードはこちら。 https://github.com/mikehibm/15puzzle-platino


● Platinoプラグインの導入


プラグインの導入は至って簡単。トライアル版をダウンロードして解凍して所定のフォルダにコピーすればTitanium側で認識してくれた。

あとはプログラムの先頭に

var platino = require('co.lanica.platino');

をいれてガンガン使って行くだけだ。
BGMや効果音を鳴らす時は

var ALmixer = platino.require('co.lanica.almixer');

も必要。
さらにapp.jsなどで最初に一回だけ

ALmixer.Init(0,0,0);

を呼んで初期化しておく必要がある。最初この初期化をしてなかったせいで音が出なくて30分ほど悩んだ。


● まずはサンプルのソースを確認


Herlockと同じくPlatinoもドキュメントを見てもいまいち分からないので、最初はまずサンプルプログラムを全てダウンロードしてソースを熟読するのが良いと思う。


Flappy Birdや戦車ゲームのサンプルが面白いけれど、多分一番参考になったのは「Codestrong Shooter」というシューティングゲームのサンプルだ。


● マルチ解像度対応


サンプルプログラムのマルチ解像度対応がちょっと気に入らなかったので、自分なりに試行錯誤する必要があった。背景の画像などは全てiPhone5sの640x1136のサイズを基準にして作っておいて、端末の解像度に合わせて横幅を画面一杯にして縦が短い場合は上下が切れる様に調整した。ApplicationWindow.js の updateScreenSize 関数でその辺りをやっている。

スプライトなどを画面に配置する時は、横幅は常に640として固定値で指定して構わないのだけれど、縦の高さは端末によって変わるので、真ん中に寄せたいもの(パズルのピースなど)については中央からの相対指定として、上端または下端に合わせたいものはそれぞれ上端(y=0)または下端(y=画面サイズ)からの相対指定とする様にした。


● タッチイベント


画面に配置したSpriteのタッチイベントを取得するのが少々面倒だった。まず画面(Sceneオブジェクト)のタッチイベントを書いて、その中でスケールを考慮して座標を変換した上で Sceneの forwardTouchToSprites 関数を呼んでやる必要がある。


● 連続でアニメーションを実行


アニメーションは下の様な感じでTransformオブジェクトを生成して実行する形になる。
var transform  = platino.createTransform({
  duration: 500,
  alpha: 0,
  easing: platino.ANIMATION_CURVE_CUBIC_IN,
  autoreverse: true,
  repeat: -1
 });
sprite.transform(transform);
ただ、連続で複数のアニメーションを実行するための簡単な方法が標準では用意されていない。「Codestrong Shooter」のサンプルにもある通り、アニメーション終了時のcompleteイベントを拾って次のアニメーションを開始すれば良いのだけれど、非常に面倒だ。

そこで調べたところ下のモジュールを見つけた。


これを使えば例えば6個のアニメーションを連続で実行する場合でも下の通り簡潔に書くことが出来るのでとても便利だった。
highScoreTranstion = new Transition([
  { duration: 1000, x: CENTER_X-highScoreLabel.width/2, easing:   platino.ANIMATION_CURVE_QUAD_OUT }
  ,{ duration: 500, alpha: 0, easing: platino.ANIMATION_CURVE_CUBIC_OUT }
  ,{ duration: 1000, alpha: 1, easing: platino.ANIMATION_CURVE_CUBIC_OUT }
  ,{ delay: 500 }
  ,{ duration: 1000, x: game.screen.width*-2, easing: platino.ANIMATION_CURVE_QUAD_IN }
  ,{ duration: 1, x: game.screen.width*2 }
]);
highScoreTranstion.animate(highScoreLabel, -1);


● Androidでのフルスクリーン表示


Androidで実行すると画面の上部にタイトルバーが表示されてしまって困った。
とりあえず tiapp.xmlファイルに

<fullscreen>true</fullscreen>
<statusbar-hidden>true</statusbar-hidden>
<navbar-hidden>true</navbar-hidden>

と書いてみたけれども Android 4.4 では効果なし。調べると新しいAndroidではプログラム内で

   window.activity.actionBar.hide();

を呼ぶ必要があるという事だったのでその通りにしたら無事フルスクリーンで表示された。


● iOSとAndroidで微妙に挙動が違う所


TextSpriteを配置した時にiOSとAndroidで位置がずれてしまって困った。
どうもAndroidだとwidth,heightが自動では計算されていない(0,0になっている)みたいだ。これは platino.createTextSprite 関数を呼ぶ際に明示的に widthとheightをセットする事で解決した。

他に、Androidだと微妙に処理が遅いのか少しカクカクした感じがしてしまう。上にアップした動画でも雲の動きがちょっとカクカクしているのが分かるけれど、iOSだともっとスムーズに動いた。Titanium + Androidでは前にも、「今ひとつどうもな〜」という経験をした事があるので、今回もやっぱりそうかという感じはある。


● ソースコード


今回のソースコードはこちら。
https://github.com/mikehibm/15puzzle-platino


● 一応の結論


Titaniumでのアプリ開発をずっとやっている人で、「ゲーム開発にもTitaniumを使いたい!」と言う場合には良い選択肢かも知れない。

あとドキュメントの中の下のページはすごく参考になった。

http://docs.lanica.co/docs/#!/guide/javascript_best_practices
配列をクリアする時は
myArray = []; 
ではなく
myArray.length = 0;
と書いた方が良い、とか。







 

2014年9月5日

JavaScriptでスマホゲームアプリを作る - Herlock編

さて今回はHerlockを使って15パズルを作ってみた。



● Herlockとは


http://herlock.do/faqs/1304
株式会社ソニックムーブが提供するスマートフォンネイティブアプリ開発環境となります。
http://herlock.do/faqs/1338
AndroidとiOSに対応したワンソースでネイティブアプリを同時に開発することができます。
また、Web IDEを使用して開発、デバッグからビルドまで行うことができ、開発時のアプリはクラウド上で保存するだけで簡単に動作確認が可能です。
さらに、JavaScriptでOpenGLによる実装ができ、ゲームのようなハイパフォーマンスのアプリケーションを簡単に開発することが可能となります。




● 作ったもの


PhoneGap編Monaca編と基本的に同じ15パズル。

ただ今回は画像を使ったので見た目が大分違っている。
Herlockのサンプルにあった「ねこ穴」というアプリのソースコードを元にして作ったので、勢いで一部の画像をそのまま使わせて頂いてしまった。


ソースコードはこちら。(とても自慢出来たものではないですが。笑)

tmlib.jsには含まれているシーン管理やアセット管理の部分をHerlockでは自分で作り込まなければならないのが結構大変だった。(結局ねこ穴のソースから大部分をコピペして使った。) 逆に言うと自分で好きなように作りこんだりどこかのライブラリを使ったり、自由度が高いと言えるかも知れない。

アニメーションについてはTweenJSで簡単に出来たので助かった。



● Herlockの素晴らしいところ


WebViewではなくネイティブのOpenGL機能を使っているのでアニメーションのパフォーマンスは申し分ない。JavaScriptだけでこれだけの事が出来るというのは本当に素晴らしい。

サウンドの方もiOS, Androidともに全く問題無しだった。PhoneGapやMonacaではAndroidで音が出ない問題に悩まされただけに、これは嬉しい。

Web IDEが提供されているのでローカルに開発環境を用意する必要が無い。これもさくっとアプリを作りたい時には大変有難い。



● 苦労したところ


1.実行するまでエラーが分からない

これは特にHerlockだからという訳ではないけれども、JavaScriptでの開発は静的型付けのある言語と比べると意外と大変だなあと改めて感じてしまった。ちょっとしたスペルミスや引数の間違いなどでもその箇所が実行されるまでなかなか気付く事が出来ない。この事から感じるストレスは開発が進めば進むほど大きな負担になって来る。
今回Herlockで開発しながら特にこの点が気になったのは、おそらく次に挙げる要因が関係していると思う。

2. Herlock Viewerでアプリのリロードに時間がかかる

Web IDE上でプログラムの変更を保存してから、それを端末上のデバッグ用アプリ(Herlock Viewer)で再読み込みするのに結構時間がかかる。自分の環境(米国からのアクセス)だと最低でも15秒、サーバー側が重くなっている様に感じられる時だと30秒から40秒程度待たされる事もある。

原因は、最初に全ての画像や音声のデータを読み込む様なプログラムになっているからという事もあると思う。ただ、サーバー側が重くなっている時などはプログラムの実行を開始する前にJSファイル(require.jsなど)の読み込みの段階でタイムアウトしてしまう事もよくある。

この辺りは、Herlock Viewerの方でJSファイルや画像・音声などのデータをキャッシュしてくれて、任意のタイミングで開発者がキャッシュの更新を指示出来る様に(もしくは変更されたものだけ自動で読み込む様に)してもらえれば改善される様な気がしないでもない。

また、Android版はまだマシだったが、iOS版のHerlock Viewerではアプリのリロード処理中にタイムアウトしてしまう確率がかなり高かった。(特にサーバー側が重い時)

3. アプリ内でのシーン管理やアセット管理のための標準的な方法が分からない

APIドキュメントには基本的なコードしか載っていないので、最初は戸惑った。
結局サンプルアプリの「ねこ穴」のコードを見よう見まねでいじりながらなんとか形にはなったけれど、シーン管理やアセット管理のためのクラスは標準で存在した方が有難い。その上でtmlib.jsのチュートリアルの様な平易なドキュメントがあればなお嬉しい。




● これからHerlockに期待したいこと


1. TypeScript対応

Web IDEがJavaScriptだけでなくTypeScriptにも対応してくれれば、上に書いた「実行するまでエラーが分からない」という問題はほぼ解決すると思う。


2. Herlock Viewerでの再ロード時間の短縮

キャッシュ対応やサーバー側のスペック向上などでなんとか「数秒程度」でリロードが完了する様にしてもらえないものだろうか。
再実行に15秒以上かかる様だと「すぐに実行して動作確認出来る」というJavaScriptの利点がほぼ相殺されてしまうので、なんとも惜しい気がする。


3. ローカル開発用SDK

コマンドラインのみのSDKで良いので提供してもらえれば、Web IDEを使わずにローカルで好きなエディタを使って開発出来る様になる。もしこれが可能ならぜひ実現してもらいたい。
PhoneGapで言う「phonegap serve」コマンドの様なものを実行するとPCが接続待ち状態になり、そこにHerlock Viewerで同一LAN内から接続出来る様になれば多分リロードに時間がかかるという問題も解消されるだろう。

ローカルにソースコードがあればGitなどでの管理も自由に出来るし、理想的な開発環境になるのではないだろうか。

4. ドキュメントの充実

HerlockのAPIドキュメントは見た目はなかなか良いのだけれど、内容はまだまだ充実させる余地があると思う。



● 今日の結論


- JavaScriptだけでネイティブアプリの開発が出来るHerlockはアプリ開発者ならぜひ試して見る価値あり。

- ただデバッグ実行時のリロード時間の短縮はなんとしても実現して欲しい。

- なんだかんだ言っても結局のところ非常に面白いし将来有望な開発環境だと思うので、これからのより一層の改善に期待!



以上!







 .

2014年8月24日

JavaScriptでスマホゲームアプリを作る - Monaca + tmlib.js編

● Monaca とは


Monacaの機能と特徴 | HTML5を使ったクロスプラットフォーム型モバイルアプリ開発 




● PhoneGap/Apache Cordovaとの違い


内部的にはPhoneGap/Cordovaを使っているので、ソースコードはPhoneGap/Cordova用に作ったものをほとんど変更せずに使える。

一番大きな違いは、Monacaだとローカルに開発環境を用意する必要が無い事だ。ブラウザさえあればどこからでもすぐにプロジェクトを開いて開発を続けられる。


先にPhoneGap用に作った15パズルのソースコードをMonacaのIDEにアップロードすると何の問題も無く実行出来た。

実機でのデバッグ実行は「Monacaデバッガー」というアプリをインストールして行う。


PhoneGap Developerのアプリと同様こちらもとても便利。さらに端末上でログ出力が確認出来たり、開発者のIDEに画面のハードコピーやメッセージを送ったりも出来るみたいだ。





● 結論


開発環境の違いはあるがソースコード的にはPhoneGap/Cordovaと同じものをほぼそのまま動かせる。

なのでAndroidではWebAudioを使うとかなりの確率で音が出ないという問題も同じだ。この問題があるのでゲームアプリを作るのには残念ながらちょっと適さない。 (追記参照)




● 追記


Monacaデバッガーの「ハイパフォーマンス版(4.0以降のみ対応)」というのがあったのでこちらで試した見た所、Androidでも音が鳴った。BGMも効果音も問題無しだ。やったー!
とは思ったものの、デバッガー経由でなくビルドしたものを端末でダウンロードしてインストールしてから動かすと、やっぱり音が鳴らない。これはビルド時の設定か何かで直るものなのだろうか。それともMonaca側がまだ最新の環境に対応していないのだろうか。良く分からないけれども何となく期待は持てそうだ。


Monacaサイトの説明によると、ハイパフォーマンス版のデバッガーは

  • 最新のChromiumベースのブラウザーエンジン(インテルのCrosswalk)を用いており、高速なレンダリングと高度なCSS、JavaScript APIを利用可能です。

との事なので、Chromiumのバージョンに関係がありそうだ。となると、ビルドして配布する場合はユーザーの端末に入っているChromiumブラウザーのバージョンに依存するという事だろうか。



● さらに追記 (2014年9月7日)


下のブログ記事を見つけたのでAndroid用のビルド設定を「ハイパフォーマンス (Crosswalkエンジン)」を使う様に変えて試してみた所、ビルドしたアプリでも問題無く音が鳴る様になった。

Crosswalkエンジンを組み込んでMonacaで作るAndroidアプリを一気に高速化させる。 : アシアルブログ 

APKファイルのサイズが19MBに大きくなったけれども、まあ許容範囲だろう。ともかくこれでAndroidでも音が出る様になったという事で、スッキリした。
Monaca素晴らしい!







 

 

2014年8月23日

JavaScriptでスマホゲームアプリを作る - PhoneGap + tmlib.js編

● tmlib.jsを使ってみた


tmlib.jsが面白そうなので初めて触ってみた。

このチュートリアルを読めば大体の使い方がつかめる。素晴らしい!
tmlib.js で今流行のフラットデザインを使ったタッチゲームを作ろう – Step00 ゲームのひな形を作ろう | TM Life 




● スマホでも結構使えそうな感じ


作ったものは平凡だけれどとりあえずこんな感じの15パズル。
動画はNexus7(2012)上で動かしたもの。




ブラウザ上でPlay出来るバージョンはこちら。



開発環境は、最初はVisual Studio 2013に
Multi-Device Hybrid Apps (Preview) for Visual Studio 
という拡張機能を入れて使おうと思ったのだけれど、入れてみるとまだちょっと使いづらい部分があったので今回はパス。

結局  Brackets というエディタとTerminalだけで十分だった。Bracketsには「ライブプレビュー」というボタンがあってそれを使うとすぐにChromeを開いて実行出来るのでこれがとても役に立った。

実機で実行したい時は、Terminalでプロジェクトのフォルダから

phonegap serve

を実行しておく。そして実機(Android, iOS, Windows Phone)上でPhoneGap Developerアプリを実行し、PCのIPアドレスを入力すればOK。実機とPCが同一ネットワーク内にあれば良いのでUSBケーブルをつなぐ必要が無いのが有り難い。
この状態でソースコードを変更して保存すれば1〜2秒で自動的に実機側のアプリを再起動してくれる。これは実際に使って見るとものすごく便利だ。複数の端末を同時に接続出来るので、Android、iPhone, iPad, Windows Phoneを全て接続してそれらが同時に更新されるのを眺めているとそれだけでも面白い。


ちなみにビルドしてパッケージ化されたものを動かしたい時は、実機をUSB接続した上で、

 phonegap run android --device  または phonegap run ios --device

を実行すればOK。



ソースコードはこちら。
https://github.com/mikehibm/15puzzle-phonegap







● あれ、Androidで音が出ない。。。


iPhone,iPadでは全く問題無くBGMと効果音が再生されるのだけれど、手元のGalaxy S3とNexus7では全く音が出ない。それどころか、ローディング画面が出たまま止まってしまう。デバッグすると、WebAudioのcontextがnullになっている。これは悲しい。色々試したけどAndroidではどうも音声はダメそうなので、tm.sound.WebAudio.isAvailableが trueでない時は一切音を鳴らさない様に変更した。この問題が無ければ十分使えると思っただけに、残念。



● 結論


- アニメーションはあまり複雑な事をやらなければスマホでも結構使える。
- PhoneGap Developerアプリを使えば開発が捗る。
- でもAndroidでは端末によってWebAudioへの対応がまちまちで、かなりの確率で音が出ないのがなんとも残念。
- iOSまたはPCをターゲットにして作るなら十分選択肢の一つになり得ると思う。
- tmlib.jsは便利!これからも使いたい。









 

2014年8月14日

JavaScriptでスマホゲームアプリを作るための開発環境いろいろ

● とりあえず何か作ってみないと始まらない


最近、次のスマホアプリを何で作ろうかと真剣に悩んでいる。既にCocos2d-xのC++版で2つほどアプリを作って公開したけど、やっぱり出来ればJavaScriptが使いたい。

悩んでばかりいても仕方がないので、とりあえず下の6つの環境でサンプルゲームを作って試してみようと思う。



PhoneGap (Apache Cordova) 


WebViewをラップしてネイティブアプリとして動作させる。
ゲームを作るならCanvasを簡単に扱うためのライブラリを使うと便利。

ライブラリには CreateJSenchant.jstmlib.jsArctic.js ... などがある。

将来的にはWebGLがもっと普及するとCanvasよりも格段に描画が高速になるらしいけれど、現状ではまだ実アプリで使うには早いみたいだ。
WebGLことはじめ
http://www.slideshare.net/hirumakazuya/webgl-35833170?next_slideshow=1

簡単なパズルゲーム程度であればおそらくCanvasでも大丈夫なのではないかと思う。(やってみないと分からないけれど。)

最近、Visual Studio 2013 (Update 2以上)の拡張機能としてPhoneGap(Cordova)対応が追加されたので、今回はこれを使ってみようと思う。
Multi-Device Hybrid Apps for Visual Studio 2013



Monaca 


PhoneGapをベースにしたWeb上の開発環境。PhoneGap/Cordovaのインストールや設定を一切しなくてもブラウザさえあればすぐに使えるのが素晴らしい。実機でのデバッグもUSB接続不要で簡単に出来て便利。

Monacaのサンプルを見ると Pixi.js を使ったブロック崩しゲームがある。これは、と思って実機で試してみた。結果、Nexus7(2012, Android 4.4.2)ではスムーズに動くもののGalaxy S3(Android 4.4.2)だとカクカクしてほぼプレイ出来ない状態だった。おそらくNexus7ではWebGLが有効になっていてGalaxy S3ではなっていないからだと思うけれど、Canvasだとやっぱりゲームアプリは無理なのか、と不安になる。ただ簡単なパズル系のゲームだったらどうなのか、その辺りを試してみたい。




Herlock 


JavaScriptからネイティブのOpenGLを扱える様にするフレームワーク。
Monacaと同様にブラウザさえあれば開発が出来る環境が用意されているので開発環境をローカルにインストールする必要はない。HerlockViewerというアプリを実機にインストールしておけばネットワーク経由でスクリプトの更新やデバッグログの確認が可能。
個人的にはかなり期待大。



Titanium 


Lanica Platino Engine」という拡張機能(有料・79.99ドル/年)を使うとOpenGLを使って高速に動くゲームアプリの開発が可能になるとの事。少し前までは年間800ドルぐらいしたと思ったけど、それと比べると今はかなり安くなったのでちょっとトライして見ようかと思う。



Cocos2d-JS 


スマホ用ゲームアプリ開発の大本命。
C++版では既にいくつかアプリを作ったので、次はJavaScript Bindingでどこまで開発が速くなるのか試してみたい。



Unity 


こちらも言わずと知れた超有名ツール。C#のイメージが強いけれど、JavaScriptでも開発出来るという事なので今回初めてじっくりと触ってみようかと思う。




以上、実際にサンプルアプリを作ってみてどうだったかは、これから少しづつ書いて行こうと思う。
またそれぞれの環境で下記の点についてもざっと調べておきたいと思う。

  • 多国語対応の方法(端末の言語設定によって画像や文字列を切り替える)
  • 広告(主にAdMob)の挿入方法
  • アプリ内課金の実装方法







 .

2014年1月8日

2年前に作ったAndroid用オセロゲームを真面目に改善した時のメモ


コンピュータの思考ルーチンの強化


得点テーブルを使うのは序盤のみ。
自分の全滅は最低の評価、相手の全滅は最高の評価。

中盤は独自の評価関数を使う。
  •   自分が打てる場所を多く、相手の打てる場所を少なく。
  •   確定石のプラス評価。
  •   Wingのマイナス評価。
  •   X打ち、C打ちのマイナス評価
終盤は完全読み切り。
ゆらぎ(Randomness)の実装。(毎回同じ手を打たない様に。)

Javaコードのパフォーマンス改善


盤面のオブジェクトを手番が進むたびにコピーする代わりに、事前に60要素の配列を準備して入れておく様に変更。
これだとUndoして一つ前の状態に戻すには配列のインデックスをマイナス1するだけ。

盤面の状態を表すのにオブジェクトの配列ではなくintの配列を使う。(System.arraycopyが使えるので高速。)

オブジェクトの生成を極力避ける。
  •  Pointオブジェクトは最初にnewしてset()メソッドで使い回す。
  •  ArrayListは最初にfinal修飾子付きでnewしてclear()で初期化して使い回す。

ループの終了判定に.size()や.lengthを参照しない。


広告の表示方法への工夫


ゲーム中は表示せず、終了後にふわっと現れる様に。


UIの改善


コンピュータ思考中のプログレス表示と処理中アイコン表示を追加。


JUnitを使った単体テスト


思考ルーチンのデバッグには単体テストが不可欠だった。




以上

2013年11月6日

子供向けにぜひおすすめしたい算数アプリ4選

cocos2d-x を使って子供向けの算数ドリルのアプリを作ろうとしていて、そのための参考に既存のアプリを調べていたら「これはすごい!」と思えるものがいくつか見つかったのでメモしておこうと思う。

Google Playで「算数」や「Math」で検索して大体200位ぐらいまでの結果の中から良さそうなものを選んで、かれこれ40個ほどをインストールして実際に動かしてみた上で厳選した結果なので、子供向けの算数アプリを探している方にはぜひ参考にして頂ければと思う。



第4位


Math Is Fun:陽気な数学


グラフィックがいい味を出している。ドリルというよりはパズル的。結構考えないと行けないのでどちらかと言うと高学年向けかも。大人でも遊べる。

Android app on Google Play  




第3位


Mathemagica Free - Kids Math


独特のグラフィックで最初はとっつきにくい感じがしたけれど、やってみるとなかなか面白い。問題のパターンが多くて、よく考えられている。
算数を始めたばかり、というレベルから高学年まで幅広いレベルに対応した問題が用意されているので、ぜひ有料版を買って長く遊びたい。

Android app on Google Play 




第2位


おサルさんの算数 ― 空飛ぶアドベンチャー


最初にこれをやってみた時は感動した。きれいなグラフィックと軽快な横スクロールでシューティングゲーム風のプレイは斬新だ。
子供はきっとのめり込むと思う。

Android app on Google Play  




そして一番「すごい!」と思ったのはこれ!


第1位


Hudriks Math For Kids


『美しいグラフィック、3Dアニメーション、特殊効果が、小学校に通うあなたのお子様にとって、算数の学習を忘れられないほど楽しいものにしてくれます。』

確かに美しく描かれたキャラクターと背景のグラフィックが素晴らしい! キャラクターが飛び跳ねるアニメーションの時にはちゃんと影の大きさも変わる。このクオリティの高さにはただただ脱帽。(見た感じ多分開発環境はUnityだろうな。) 
ワクワクさせられる音楽も良い。
ストーリーモードでは面倒な設定やレベル選択の必要も無く簡単な問題から自然に難しい問題に変わっていく辺りも良く考えられていると思う。

Android app on Google Play  








 

2013年9月28日

Android 4.3でSurfaceViewを使うアプリがランダムにクラッシュする件

Google Playで公開しているあるアプリを更新しようと思ってテストしていると、なぜか数回に一度の割合でクラッシュする事に気付いた。

エラーの内容はこんな感じ。
java.lang.IllegalArgumentException
: at android.view.Surface.nativeUnlockCanvasAndPost(Native Method)
: at android.view.Surface.unlockCanvasAndPost(Surface.java:255)


そういえば最近Google Playの管理画面で報告されるエラーが増えてきていた。自分のテスト端末(初代Nexus7)で出ているエラーと同じものだ。


エラーが起きている端末は全てNexus7。おそらく Android 4.3 を搭載している端末で問題が発生している様な気がする。


エラーが起きるのは、SurfaceViewを使ったActivityから一旦別のActivityを起動して、また元のActivityに戻ってきた瞬間だ。毎回というわけではなく大体5回に1回ぐらいの頻度なのでやっかいだ。

Backキーでホーム画面に戻ってからまたアプリを起動した時やタスク一覧から戻ってきた時は全く問題は起きない。


調べてみると下のスレッドが見つかった。

Issue 58385 - android - android 4.3 - IllegalArgumentException at SurfaceHolder.unlockCanvasAndPost(canvas) - Android Open Source Project - Issue Tracker - Google Project Hosting 

やっぱりAndroid 4.3 のSurfaceView にはバグがあるようだ。

しかも現状では回避策は無さそう。。。

SurfaceView を使っているアプリ全てが影響を受けるとすると、結構大きな問題になるのではないだろうか。

SurfaceViewを使うのを止めて View の Canvas に描画する様に書き直して対策した、という書き込みはあった。しかも皮肉な事にハードウェアアクセラレーションのおかげでかえってFPSが改善されたとの事。

とりあえず View.isHardwareAccelerated() の戻り値を見て、trueならView+Canvasを使って、false (かつOSが4.3より前) なら SurfaceView を使う様にすればなんとかなるかも知れない。

でも、同じ事をするのに2種類の方法で実装しないと行けないとなると、これは面倒だなー。

4.3を搭載した端末が一般的になる前になんとか早く解決してくれないかな〜。




2013/09/29  追記:

そういえば、4.0以降なら TextureView があった。これを使おう!

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES. ICE_CREAM_SANDWICH){
    //TextureViewを生成
} else {
    //SurfaceViewを生成
}

テストしてみた所上手く行っているみたい。
これで今回は一応解決!








  

2013年9月18日

iOSアプリとAndroidアプリを同時に開発する方法

最近はいろんな開発環境やツールがあるけれど、とりあえず以下のような選択肢で検討している。
  • Cocos2d-x
  • Xamarin + Cocos2d-XNA
  • Corona
  • Unity
  • Herlock
  • Titanium Mobile
  • Apache Cordova (PhoneGap)
  • Monaca



ガシガシ動くゲームを作るなら


Cocos2d-x


ようやくcocos2d for iPhoneで簡単なゲームアプリを作れる様になった自分としては、次はこれでAndroid版とiOS版の同時開発かなと思っている。

cocos2d for iPhoneで得た知識も使えるし、CocosBuilderなどの周辺ツール類も豊富なのが魅力。

最初は「AndroidではNDKが必要」というのを聞いただけで尻込みしていたけれど、採用事例は結構多そうで、ネットでの情報も増えてきつつあるみたいだ。

今この本を読みながら次のアプリ開発に向けて準備しているところ。
cocos2d-xによるiPhone/Androidアプリプログラミングガイド


Xamarin + Cocos2d-XNA


意外なところでは、C#で開発するという手法もある。XamarinとCocos2d-XNAというライブラリを組み合わせれば2Dゲームアプリも作れるみたいだ。

普段仕事で使っている言語はC#なので、本当に使い物になるのならぜひ使いたい。Windowsストアアプリの開発も出来るし、有料版ならVisual Studioとの統合も可能なのでかなり興味を惹かれる。

Xamarin StudioというIDEの無料版をとりあえずインストールしてぼちぼち試しているところ。


Corona


2Dゲームに特化した「エレガントなAPIで従来より10倍速く開発出来る」というのが売り文句の開発環境。Luaというスクリプト言語を使う。デモなどを見るかぎりでは確かに簡単に2Dゲームが作れそうだ。

ただ、プロプライエタリなソフトウェアなのであまり依存したくはないかな、と思ってしまう。



Unity


とりあえずインストール しては見た。面白そうな解説本も買って積んであるのだけれど、まだじっくり触る事が出来ていない。

次のバージョン(4.3)ではなんと2Dゲームに特化した機能も追加されてますますパワーアップするらしい。
Unity - Unity PRESS RELEASE – Unity、2D向けゲーム開発機能とクラウドサービスを新たに提供 
もしかするとこれからのゲームアプリ開発の大本命になるのではないかとも思ってしまうほど高機能。

ちょっと高機能過ぎて初心者は慣れるまでが大変。それにしてもUnityのアセットストアは強力。


Herlock


今日、こんなのも見つけた。国産の新しいクロスプラットフォーム統合開発環境。JavaScriptで開発出来る。だからBackbone.jsやTweenJSなどと言った既存のJSライブラリも使える。 しかもOpenGLで高速なグラフィック処理も可能。

iOS/AndroidアプリをJavaScriptで開発、OpenGL対応で高速描画の「Herlock」、クローズドβリリース - Publickey 
FlashライクなコードでOpenGLの処理を記述できるため、高速なグラフィック処理を実現する点も大きな特徴です。ゲームなど高速な画面書き換えなどを要求するアプリケーションに対応します。』 
Herlockの紹介動画 

これは期待大。早速クローズドベータ版の利用申請をしておいた。



ゲーム以外なら


Titanium Mobile


クロスプラットフォーム開発の老舗。


Xamarin


Xamarin Studio または Visual Studioを使ってC#で開発が可能。個人的にはかなり興味あり。


Apache Cordova (PhoneGap)


HTML5 + JavaScriptのアプリをラップしてネイティブアプリを作成するツール。

Apache CordovaとPhoneGapの関係が分かりにくい事になっているけれど、今の所は結局同じモノみたいだ。
Cordova(PhoneGap) とりあえずどんなものか | MUSHIKAGO APPS MEMO 
AdobeがApache Cordovaの私家版PhoneGapの3.0をリリース, APIをプラグイン化してより身軽に | TechCrunch Japan 


Monaca


内部的にはPhoneGapを利用しているらしい。ブラウザ上で利用出来るIDEが秀逸。Monacaデバッガというのもちょっと試してみたけれど、とても便利で感動した。

なんとなくApache Cordova(PhoneGap)を使うのであればこっちの方が生産性が高そうな気がしている。HTML5での実装に適したアプリを作る機会があったらぜひ使いたい。


今日の結論


この他にも色々な開発環境やツールがあると思うけれど、次は

Cocos2d-x
Unity

の順でやって行こうかなと思っている

余裕が出来たら、

Monaca
Xamarin

あたりにも手を伸ばしたい。

あとHerlockにはぜひとも頑張って完成度を高めて行ってもらいたい。応援してます!




 



2013年3月6日

Azure Mobile ServicesがAndroidに対応! Android2.2以降で実行可能


Windows Azure Mobile ServicesがAndroidに対応したそうだ。

Windows Azure Updates: Android Support, SQL Reporting Services, Active Directory, More… - ScottGu's Blog


これでバックエンドのサービスを簡単に作成する事が出来る。嬉しい!

ところが説明を読むと、「Android 4.2以降が必要」という注意書きが。。。

「え、うそでしょ~。4.2以降なんて現時点で使えるのはNexusシリーズぐらいじゃないの...」

と思ったけれども、サンプルコードをダウンロードしてマニフェストファイルを見ると、

android:minSdkVersion="8"
android:targetSdkVersion="17"

となっている。

なので、アプリの動作環境としてはAndroid 2.2以降なら問題ないみたいだ。


(「4.2以降が必要」というのは開発用のSDKのバージョンを指している様だ。)



試しに Android 2.3.5 が入ったHTC Evoでサンプルアプリケーションを動かしてみた所、Todoリストにデータを追加する部分については問題なく動作した。


Azure Mobile Servicesの管理画面からデータを確認したところ。



Todoリストのチュートリアルはこの後「ユーザー認証の追加」や「GCMを使ったプッシュ通知」の実装に続く。

まだそこまでは試していないけれど、多分Android2.2以降なら問題無さそうな気がするので、まずは一安心した。


これでさらにアプリ開発の可能性が広がりそうだ!



*追記:
ここにははっきり「2.2+」と書いてあるので、やっぱり大丈夫そうだ。

MS Open Tech develops the open source Android SDK for Windows Azure Mobile Services - Interoperability @ Microsoft - Site Home - MSDN Blogs







 

2013年2月19日

AndroidでAnimation終了後にViewを削除する

動的に追加したViewに対してアニメーションを実行して、アニメーションが終了したらそのViewを完全に削除してしまいたい、というケースがあってハマったのでメモ。


基本的にはアニメーションの終了後に何かをするには、前もってAnimationListenerをセットしておけば良いはず。

AnimationListener の onAnimationEnd というメソッドをオーバーライドして処理を書く事になる。 

この onAnimationEnd の中でアニメーション対象のViewを親のViewから削除しようとして、次の様に書いたら parentView.removeView の所で エラーで落ちた。




調べてみると、どうやら onAnimationEnd 内でUIの処理をするとまずいみたいだ。parentView.post() を呼んでUIスレッドに処理をRunnableの形で渡せば問題なく実行出来る様になった。






  

2013年1月30日

初めてAndroidアプリを公開して1年経過した

作ったアプリ


1年半ぐらい前にこんな記事を書いて、オセロゲームを作ってみた。
http://blog.makotoishida.com/2011/06/android-1.html 

6月から作り始めて、9月に一応大体の機能が完成。その後アイコンを作ったり細かい改善をしたりして、2011年の12月にGoogle Playストアに公開した。

Google Play
https://play.google.com/store/apps/details?id=com.ishida_it.mireversifree



1年間の有効インストール数の推移


公開してから全く更新せずに1年を経過した頃からアクティブユーザー数に減少傾向が見られた。
ちなみに下段のグラフの水色の線はAndroid 2.3、緑の線はAndroid 4.0以降。
グラフの右端で少し右肩上がりになっているのは、Undo機能を追加する更新をした後。

現在の有効インストール・ユーザー数(インストール後、削除していないユーザーの数)は約7400。総ダウンロード数は2万1200となっている。

細々とした数字ではあるけれど、公開してからほぼ1年間放置状態だったのにしては結構インストールされているのではないかと思う。

やはり誰でも知っているオセロゲームだから、ダウンロードする前に「このゲームは面白そうかどうか」を考える必要が無いというのが大きいのだろうと思う。

とは言えさすがに1年も更新せずにいると、新たにインストールされる数よりもアンインストールされる数の方が上回ってアクティブユーザー数が徐々に減少し始める。Google Playの検索アルゴリズム上なんらかのマイナス評価が加えられるのかも知れない。


Undo機能追加でちょっと持ち直す



2012年の12月になってようやくUndo機能を追加する更新を行った。するとやはり新規インストール数がまた上昇しだした。更新によってユーザーの目に付く機会が多少増えたみたいだ。

この直後、ユーザーさんから「Undo機能を付けてくれてありがとう」というメールをもらったのには驚いた。と同時に単純に嬉しかった。アプリ開発者のモチベーションは案外こういう些細な事で保たれるのではないかとも思った。


せっかくなので大幅にリファクタリング


ただ、Google Playのレビュー欄に「コンピュータが弱い」という評価が多かったので、今年の1月に大幅にリファクタリングを行なって思考ルーチンの高速化と強化をしてみた。

思考ルーチンだけでなく盤面のデータ構造から書き直す様な大変更になったのでなかなか大変だったけれども、何とか先日新しいバージョンを公開する事が出来た。

これでまた新規インストール数が増えてくれればちょっと嬉しい。初めて公開したAndroidアプリという事もあってか、何となくよちよち歩きの我が子を見守る様な気分になってくる。



 
 

2012年12月18日

Eclipseで急にAndroidアプリのエクスポートが出来なくなった時の対処法

あるAndroidアプリを更新した後、「さあGoogle Playにアップロードするぞ」とAPKのエクスポートをしたら、突然Eclipseがエラーで落ちてエクスポート出来なくなるという問題に遭遇した。

前のバージョンまでは全く問題無かったのに、更新後は何回トライしてもエクスポートしようとすると必ずEclipseが異常終了してしまう。

ActionBarSherlockを使う様に画面を変更したのだけれど、それが関係しているのかも知れない。

エラーログを見ると、何やらZipファイルの処理でエラーが発生している様な感じなのが何となく分かるが、対処法がさっぱり分からないので困った。

色々調べてようやくなんとかエクスポート出来たのでメモ。

Issue 28725 - android - Eclipse Crashes with EXC_BAD_ACCESS when exporting signed applications - Android - An Open Handset Alliance Project - Google Project Hosting


ここにある通り、「Build Automatically」のチェックをOFFにして試したら無事エクスポート出来た!

それにしてもよく分からないエラーだ。



 

2012年12月7日

Nexus7を買って4ヶ月後の感想 - じわじわと良くなって来た感じ


8月の初めにNexus7を購入してから4ヶ月が経った。

当初は期待半分、「本当に使えるのかなー」という疑い半分、という感じで、まあ少なくともアプリ開発のデバッグ用途には役に立つかなという程度に思っていた。

ところが、時間の経過とともに当初想定していなかった使い方もする様になって来て、だんだんと手放せなくなりつつある。

他の人の感想を読んだりして、「やっぱりNexus7いいね」と改めて見直したり。
Nexus7購入から1ヶ月後 — 乱れなよ、そして召されなよ

Nexus 7が、とりわけヒジョーにかなりイイ
なんと言っても7インチというサイズと軽さが素晴らしい。これはまあ当然として、その他に次のような点が大きいかなと思う。


Googleのサービスと親和性が高い


一番大きいと思うのはChromeの同期機能。これは使い出すと本当に欠かせない。
もちろんGmailも使いやすい。Google Mapの高機能さもやはりAndroidならでは。



Android OSのアップデートがすぐに反映される


購入してから4ヶ月で既に3回のアップデートが配信されている。アップデートのたびに細かい点が改善されているのが嬉しい。

特にAndroid 4.2で追加されたマルチユーザー機能はとても便利。子供に渡す時にさっとユーザーを切り替えて渡すだけで良くなったので本当に助かる。


あと、買った当初は想定していなかった使い方というのは、電子書籍を読む事と動画や音楽を楽しむ事の2つだった。



紙のメモを使わなくなった


Nexus7を買ってからミーティングのメモは全て「7notes with mazec」を使って取る様にしている。

最初の頃は「書き流し入力」をして後からきれいにテキストに変換していたけれども、この頃は手書き文字のままPDFで保存する様にしている。どうしてもテキストに変換する必要があるドキュメントでない限りはこれで十分だ。

最近スタイラスペンが少しヘタって来た様な気がするのでそろそろ買い換えたほうが良いかも知れない。

手書き入力をしない時は、Google日本語入力のGodanキーボードが便利。mazecと状況に応じて使い分けている。



電子書籍が読みやすい


Amazon.co.jpで日本語の電子書籍が買える様になった。Nexus7の話からは外れるけれど、僕にとってはこれは大きかった。

電子書籍が便利なのはわかっているけど「読む本が無いから結局読書には使わないだろうなあ」と思っていた。

でも、Amazonで簡単に日本語の本が探せて、しかも今まで払っていた高い海外向け送料無しで読めるとなると話は全く別だ。

試しに好きな作家の小説を買ってみたら、もちろんNexus7で全く問題なく読めた。7インチの画面はさすがに携帯の画面より読み易い。読んでいる位置やブックマークを携帯やPCのKindleアプリと同期する事も出来るし、やっぱり便利。

検索しても出てこない本がまだまだ多いけれど、早く紙の本と同じものが買えるようになって欲しい。そうしたらNexus7の出番がもっともっと増えると思う。



Youtube動画を連続再生


日常生活の中で、「Youtubeのあの動画を再生しながらこれをしたいな~」という場面が結構ある。

僕の場合は実は「食後の食器洗い」の時間がそれに当たる。手が濡れているので出来れば画面を触らずに自動でどんどん再生してくれると嬉しい。

それを実現してくれるのが「PVSTAR+」というアプリ。これで気に入った動画をずっと流しながら両手で作業が出来る。



音楽を聴きながら寝る


前からSky.FMは聴いていて、「Solo Piano」というチャンネルが僕のお気に入りになっている。

Sky.FM Radio

このアプリが便利なのはスリープタイマー機能が付いているので聴きながら寝入ってしまっても時間が来れば停止してくれる事。きれいなピアノの音を聴きながら眠ると本当に気持ちがいい。

ただ、無料で使っていると、たまに寝かかっている時にコマーシャルが始まって目が覚めてしまう事がある。なので有料アカウントにしようかと真剣に検討中。



結論


そんなこんなで4ヶ月後の感想としては、「Nexus7買って良かった。悔いはない!」と思っている。