RetroWeb ~iPhoneとAndroidでハイブリッドゲームアプリ開発~

AIR for iOS+AndroidでSmartPhone Game ハイブリッドアプリ開発

最近作ったアプリ
100億本の抜け毛 100億匹のモナー DQ3闘技場アプリ モナーペット(進化)

新着情報UIの仕上げ

サーバーから賞状送れるようにして、スクロール化で大量の新着情報も閲覧可能にして、タップも調整して、スクロールバーつけて、デバッグUIも更新してと、地味にコツコツ開発。新着バナーにも来週前半には対応したいな~。あと魔法石以外にも、コインやアイテムまで配布可能にしたい。そしてAppleどころか、Googleまでさっぱり更新してくれないこの頃w
ユーザーから装備を任意で変えたいとのメールフォームが来たので、これもその次あたりで対応せねば。
f:id:hisashi_vc:20140428021805j:plain

新着情報UIと、運営からの報酬機能を作成

またしてもGoogleAndroid版が謎に更新されないさなか(3時間で反映されなかったら、永遠に反映されないのがほぼ確定っぽいけど、24時間以上たたないとGoogleのおしりを叩けない)、新着情報UIと、運営からの報酬(感謝やお詫びの魔法石とか)機能を7割くらい実装しました。新着情報は、以前WebViewで作ったんですが、重かった&見栄えショボかったので、新たに作成。
f:id:hisashi_vc:20140424155130j:plain

アイテムのバリエーション追加

アイテムの違いがテクスチャ(模様)の変化しかなかったので、形の違う帽子を追加し始めました。アイテム作るの結構たのしいかも。
f:id:hisashi_vc:20140423184312j:plain

AIRアプリの起動を200%高速にする方法

先に結果の秒数はこんな感じです。

①GalaxyS3の場合…7338=192%高速化(ちなみに空アプリは37)
②IS03の場合…17381=214%高速化(ちなみに空アプリは57)

そしてそのアプリのAndroid版。(いつものしまむらくん。数日中に起動高速化版(Ver1.4.3)が、反映されるはず。。)
https://play.google.com/store/apps/details?id=air.retroweb.flappysimamura.production

iOS版も審査通る気がするけど、確認中(なのでまだ未反映)
https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=825465264

で、やったことは単純で、.swcでnewしてたAsset一式を、.swfにしてAIR for Android設定の含めるファイル内にいれて、バイナリロードからのnewにしただけ。引数のurlは、.swfのファイル名だけで読めるので楽ちん。これでアプリ起動が遅いAIRアプリが、200%高速に。

function LoadByte(url:String, callBack:Function):void {
	var urlLoader:URLLoader = new URLLoader();
	var req:URLRequest = new URLRequest(url);
	urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
	urlLoader.addEventListener(Event.COMPLETE, onCompleteUrlLoader);
	urlLoader.load(req);
	urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function(e):void{
		trace("265_IOエラーです。"+url);
		trace("e.text = " + e.text);
	});
	
	function onCompleteUrlLoader():void {
		var ba:ByteArray = urlLoader.data;
		var lc:LoaderContext = new LoaderContext();
		//if(Com.IsAir()) 
		lc.allowLoadBytesCodeExecution = true;
		var loader:Loader = new Loader();
		loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteLoader);
		loader.loadBytes(ba, lc);
		function onCompleteLoader():void {
			var apd:ApplicationDomain = loader.contentLoaderInfo.applicationDomain;
			callBack(apd);
		}
	}
}


ロードしたswfから、リンケージしたクラスを抽出するときは、下記メソッド。

function getClass(d:ApplicationDomain, s:String):Class{
	return d.getDefinition(s) as Class;
}

アプリにご要望フォームを実装

GameFeatの広告を実装したiPhone版を審査に出しつつ、Android版にご要望フォームを実装しました。WebViewだと融通聞かなかったりするので、UIごと作成。ご要望をサーバーに保存しつつ、自分の携帯にもメールが来ます。ついでに微妙な気がしたゲーム内セリフウィンドウをいったん隠すw。 機能山盛りで、アプリの起動に時間かかるようになってきた気がするので、そろそろなんとかせねば~。
f:id:hisashi_vc:20140423013037j:plain

ane競合時の謎エラー対策

自作aneを作って、AdobeのGameCenterのaneと合わせて使ったら、下記エラー;

ArgumentError: Error #3500: The extension context does not have a method with the name getAuthenticated.
	at flash.external::ExtensionContext/_call()
	at flash.external::ExtensionContext/call()
	at com.adobe.ane.gameCenter::GameCenterController/get authenticated()
	at Test3$/initGameCenter()[C:\Users\hisashi_vc\Adobe Flash Builder 4.7\Test3\src\Test3.as:41]
	at Test3()[C:\Users\hisashi_vc\Adobe Flash Builder 4.7\Test3\src\Test3.as:24]
[SWF] com.starbrain.devpush.HelloWorld3 - 2,995 バイト (圧縮後)
[SWF] Test3.swf - 2,321 バイト (圧縮後)

原因に心当たりなく謎。ネットではリリースビルドにすればError #3500消えるという情報を見かけましたが、どうもいろいろやってもダメぽ。最終的にextention.xml内の下記記述回りを一通りユニークな名前にしたら、なおりました。

<initializer>ExtInitializer</initializer>
<finalizer>ExtFinalizer</finalizer>

<initializer>ExtInitializerHisa</initializer>
<finalizer>ExtFinalizerHisa</finalizer>

ネイティブ側言語の記述も合わせて修正して、メソッド名や参照名全部ユニークにして、aneを再生成したらなおりました。

 デバッグツールとクエストの強化

仕事しつつ、デバッグツール強化。これで大きなバグは、すぐ感知できるようになりました。
新規クエストも追加。クエストって、ユーザー満足度+開発側満足度(収益やバイラルや継続率強化)の総和を計算して設計するものなのかと気づく。
あと管理画面見てると、バグがわかってよいですねw
f:id:hisashi_vc:20140417171256j:plain

クエストデータバグ発生

管理画面見てたら、アプリ内DBのクエストデータ配列が再現なくデカくなってるw やばい直さなねば;;
ワクチン仕込んだアプリをアップしよう。

デバッグメニューを実装しました。

だんだん毎回のテストの規模が膨らんできて、特にクエストのテストとか日をまたぐので、とうとうデバッグ機能を実装しました。ゲーム速度あげると、数秒間ニュータイプを体験できるw
f:id:hisashi_vc:20140416155551j:plain

42日ぶりにAppleの審査通過

1カ月と数週間かけて、ようやく久々にAppleiPhone審査通過メールがきました! しかしまだストアにはアップされていないのは時間差か。そしてもはやバージョン古くなってるので、また新しくせねば。AIRの独自aneを完成させて、iPhoneのネイティブ広告回りと戦いつつw なおAppleの課金なしアップデート時テストは、日本国内にて、iOS 7.1の、iPad Airを1端末使い、20秒起動してるだけっぽいですね。

Google Play内もアナリティクスに挑戦

GooglePlayのストア内アナリティクスこそ必要&可能と気づき、実装してみました。1週間後くらいには、検証可能なデータが集まってるはず。

https://support.google.com/analytics/answer/2956981

流行りのゲームアイコン広告をAIRのaneで実装

今流行りの(?)ゲームアイコン広告を実装しました。あとレジュームPause時の大バナー広告を思いついて実装。Java側のぬるぽは、setContentViewではなく、LayoutParamsをaddContentViewでなんとかなりました。

ついでにaneに、onResumeとonPauseのコールがあるべきと気づき実装。そんでバナーの30秒リロードオフとか。

審査はGoogle側も24時間以上反映されなかったので、またGoogleにメール。ジャンルいじったせいかなあ。
f:id:hisashi_vc:20140411182223j:plain

アイマスTシャツ、赤いのもゲットしました。この色着てライブいったら、盛り上がりそうw
f:id:hisashi_vc:20140411182259j:plain